У меня есть компонент пользовательского интерфейса сетки, который находится внутри набора полей какой-то отредактированной формы. Мне нужно передать entity_id
из формы редактирования в сетку, где я могу отфильтровать коллекцию некоторых элементов по некоторому значению, и сетка покажет соответствующий результат. Я создал компонент сетки, используя компонент insertListing.
<insertListing name="slide_grid">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="autoRender" xsi:type="boolean">true</item>
<item name="source" xsi:type="string">slide</item>
<item name="loading" xsi:type="boolean">true</item>
<item name="dataScope" xsi:type="string">some_slider_slide_listing</item>
<item name="externalProvider" xsi:type="string">${ $.ns }.some_slider_slide_listing_data_source</item>
<item name="ns" xsi:type="string">some_slider_slide_listing</item>
<item name="externalData" xsi:type="string">id</item>
<item name="imports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.provider }:data.entity_id</item>
</item>
<item name="exports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
</item>
</item>
</argument>
</insertListing>
Для передачи данных на внешний dataProvider я использую
<item name="exports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
</item>
Внутри моего внешнего поставщика данных я пытаюсь получить данные через запрос.
$this->request->getParam('slider_id');
Но ничего. Во внешнем интерфейсе я обнаружил, что Magento отправляет запрос ajax с моим параметром, но я не могу перехватить это в своем DataProvider и отфильтровать коллекцию.
magento2
uicomponent
data-provider
Mistery
источник
источник
Ответы:
Для добавления списка вставки по параметру родительского пользовательского интерфейса мы можем использовать приведенный ниже код.
Здесь
externalProvider
тэг для добавления поставщика источника списка, который мы вставляем.Здесь
imports
тэг используется для импорта параметров текущего источника данных формыЗдесь
exports
тег используется для экспорта текущих параметров данных формы в листинг, который будет вставлен.Добавьте объединение с соответствующим столбцом в текущую коллекцию, чтобы использовать его двумя способами:
Для более подробной информации проверьте код ниже:
В поставщике данных добавьте фильтр для этого параметра:
Мне нравится следовать варианту 1.
источник
После прочтения и отладки основных файлов Magento 2 я нашел простое и понятное решение этой проблемы. Передача данных из пользовательской формы в пользовательскую сетку с использованием UIComponent insertListing действительно трудна и совсем не документирована.
У объекта InsertListing есть два параметра под тегом: экспорт и импорт, которые я использовал в своем листинге:
и после нескольких часов, чтобы понять и найти решение в Интернете, я не нашел никакой подсказки!
Итак, я прочитал файл Magento Core и обнаружил, что Magento использует способ создания вложенных сеток списков в проекте. Иногда он использует старый метод вставки блока и несколько раз новый метод листинга UIComponent.
Я нашел сетку списка адресов клиентов в customer_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml), и он получает переменную parent_id, определенную в customer_form.xml (/ vendor / magento) /module-customer/view/base/ui_component/customer_form.xml) но вопрос таков:
Как Magento передает данные из формы в сетку вложенных списков?
Magento передает данные с помощью QUERYSTRING PARAMETER!
Если вы прочитаете файл DataProvider.php, вы будете удивлены, потому что он получает переменную parent_id (customer) с помощью QUERYSTRING! Посмотрите на /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php строка 58:
но как мне установить параметр в листинге URL? Я нашел параметр filterUrlParams, но здесь есть странная проблема! Давайте посмотрим на этот фрагмент кода dataSource:
Я установил ticket_id с подстановочным знаком (*), что означает: получить все билеты! но если вы не устанавливаете какой-либо идентификатор в filterUrlParams, URL-адрес insertListing НЕ имеет НИКАКОГО УСТАНОВКИ ticket_id! Так почему ?!
Решение, предложенное @ hashish-raj, не работает для меня.
Это все сообщения, которые я прочитал об этой проблеме:
В конце я нашел временный обходной путь с использованием основного сеанса и сохранил параметр ticket_id в сеансе. Затем в пользовательском провайдере данных я проверил его и применил к коллекции:
Если у вас есть обходной путь или вы поняли, как Magento справляется с этими отношениями между UIComponent , пожалуйста, поделитесь своими знаниями!
Я открыл «Баунти» здесь: https://magento.stackexchange.com/a/306537/2004
источник