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 вказує Magento, що 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 Blocks

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

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


добре знати. Крім того, не потрібно створювати колекцію Grid, оскільки вона також може бути оголошена як віртуальний тип (я # m не впевнений, де я це бачив спочатку, я думаю десь у гілці magento2 розвивати) github.com/davidverholen/magento2-teaser /blob/1.0/etc/…
Девід Верхолен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.