Magento 2:UIリストコンポーネントに2つのコレクションが必要な理由


16

Magento 2には新しい " uiComponent"機能があります。これにより<uiComponent/>、レイアウトハンドルXMLファイルに簡単なタグを含めて、グリッドやフォームなどをアプリケーションページに追加できます。

表示されるデータグリッド(A用の設定があることlisting)が必要2つのコレクション・オブジェクトを構成します。

以下の各構成コレクションの役割は何ですか?または、これらのコレクションの役割を誤解していますか?または、単一のコレクションのみを使用してグリッドオブジェクトを作成する方法はありますか?

次の構成は、名前付きコンポーネントをリストするUIをセットアップします cms_page_listing

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

そして、次のDIインジェクションはcms_page_listingMagento\Cms\Model\ResourceModel\Page\Grid\Collectionコレクションを使用する必要があることをMagentoに伝えます。

<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>

PageGridDataProvidervirtualTypeへの解決

<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>

この仮想タイプは、2番目のコレクション(Magento\Cms\Model\ResourceModel\Page\Collection)を構成します。

この2番目の構成が必要な理由や、グリッドの作成におけるその役割は明確ではありません。上位レベルの質問は、おそらくUIグリッドの作成においてどのような役割を果たすかdataProviderです。より大きな大きな質問は、おそらくUIリストグリッドを作成するために作成されたPHPオブジェクトと、それらを制御する構成です。

回答:


10

最初の質問に対する簡単な回答を次に示します。

仮想タイプの構成は必要ありません。調べてMagento\Framework\View\Element\UiComponent\DataProvider\DataProviderみると、これら2つの引数のいずれも使用されていないことがわかります( "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"/>

ご覧のとおり、UIコンポーネントの構成ファイルでは、データプロバイダーの仮想タイプを使用するように強制されておらず、汎用データプロバイダーを参照できますMagento\Framework\View\Element\UiComponent\DataProvider\DataProvider。開発者にさらに別の拡張ポイントを提供するためだけに、仮想タイプを使用することにしました。


知っておくといい。また、仮想タイプとして宣言することもできるため、グリッドコレクションを作成する必要はありません(最初にどこでこれを見たのかわかりません。magento2開発ブランチのどこかと思います)github.com/davidverholen/magento2-teaser /blob/1.0/etc/...
デビッドVerholen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.