Magento 2: Почему компоненту листинга пользовательского интерфейса нужны две коллекции?

16

Magento 2 имеет новую uiComponentфункцию " ". Это позволяет вам включить простой <uiComponent/>тег в XML-файлы дескриптора макета для добавления таких вещей, как сетки и формы, на страницу приложения.

Это кажется , что конфигурация для сетки данных (а listing) требует двух объектов коллекции будут настроены.

Какова роль каждой коллекции конфигурации ниже? Или я неправильно понимаю роли этих коллекций? Или есть способ создать объект сетки, используя только одну коллекцию?

Следующая конфигурация настраивает Компонент перечисления пользовательского интерфейса с именем cms_page_listing

vendor/magento/module-cms/view/adminhtml/ui_component/cms_page_listing.xml

И следующий DI Injection сообщает Magento, что a cms_page_listingдолжен использовать Magento\Cms\Model\ResourceModel\Page\Grid\Collectionколлекцию.

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <arguments>
        <argument name="collections" xsi:type="array">
            <item name="cms_page_listing_data_source" xsi:type="string">Magento\Cms\Model\ResourceModel\Page\Grid\Collection</item>
        </argument>
    </arguments>
</type>

Кажется, это основная коллекция, используемая для заполнения сетки.

Однако есть и это PageGridDataProviderв cms_page_listingконфигурации.

<!-- File: vendor/magento/module-cms/view/adminhtml/ui_component/cms_page_listing.xml -->
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">PageGridDataProvider</argument>
        <argument name="name" xsi:type="string">cms_page_listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">page_id</argument>
        <argument name="requestFieldName" xsi:type="string">id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
            </item>
        </argument>
    </argument>

В PageGridDataProviderПОСТАНОВЛЯЕТ в virtualType

<virtualType name="PageGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
    <arguments>
        <argument name="collection" xsi:type="object" shared="false">Magento\Cms\Model\ResourceModel\Page\Collection</argument>
        <argument name="filterPool" xsi:type="object" shared="false">CmsGirdFilterPool</argument>
    </arguments>
</virtualType>

Этот виртуальный тип настраивает вторую коллекцию ( Magento\Cms\Model\ResourceModel\Page\Collection).

Не ясно, зачем нужна эта вторая конфигурация или какова ее роль в создании сетки. Вопрос более высокого уровня, вероятно, состоит в том, какую роль dataProviderиграет создание сетки пользовательского интерфейса . Более крупный вопрос, вероятно, заключается в том, какие объекты PHP создаются для создания таблицы списков пользовательского интерфейса и как их контролирует конфигурация.

Алан Сторм
источник

Ответы:

10

Вот быстрый ответ на ваш первый вопрос:

Конфигурация для виртуального типа не требуется. Если вы посмотрите, Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderвы обнаружите, что ни один из этих двух аргументов не используется («collection», а также «filterPool»).

Мы удалим эту неиспользованную конфигурацию, как только сможем. Итак, объявление результата виртуальных типов поставщиков данных должно быть таким простым:

для страниц CMS:

<virtualType name="PageGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider"/>

и для блоков CMS

<virtualType name="PageGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider"/>

И, как теперь видно, в файлах конфигурации компонентов пользовательского интерфейса вам не обязательно использовать виртуальный тип поставщика данных, и вы можете обратиться к универсальному поставщику данных Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Мы решили использовать виртуальный тип, просто чтобы предоставить еще одну точку расширения для разработчиков.

Виталий К
источник
приятно знать. Также нет необходимости создавать Grid Collection, так как она также может быть объявлена ​​как виртуальный тип (я не уверен, где я видел это первым, я думаю, что где-то в ветке разработки magento2) github.com/davidverholen/magento2-teaser /blob/1.0/etc/…
Дэвид Верхолен