データを別のUIコンポーネントDataProviderに渡す方法


9

編集したフォームのフィールドセット内にあるグリッドUIコンポーネントがあります。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でキャッチしてコレクションをフィルター処理することはできません。


Magento 2コアコードから得たアプローチ(たとえば、製品のCustomOptionsフォームModifier)。しかし、何らかの理由でそれは私のために働いていません。
ミステリー

問題の解決策はありましたか?私は同じ問題に直面しています。解決したら助けてください...
Ashish Raj

私はあなたと同じinsertListingタグを作成しましたが、ajaxリクエストのexportsタグにパラメーターがありませんでした...解決策は見つかりましたか?
thanhdv2811

回答:


2

親ui-componentのパラメーターによる挿入リストを追加するには、以下のコードを使用できます。

ここで、externalProviderタグは、挿入するリストのソースプロバイダーを追加するためのものです。

ここで、importsタグは現在のフォームデータソースのインポートパラメータに使用されます

ここで、exportsタグは、現在のフォームデータパラメータを、挿入されるリストにエクスポートするために使用されます。

<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="ns" xsi:type="string">slide_grid</item><-- data source of the inserted listing -->
            <item name="externalProvider" xsi:type="string">colors_one_listing.colors_one_listing_data_source</item><!-- your insert listing data provider source -->
            <item name="imports" xsi:type="array">
                <item name="spd_id" xsi:type="string">${ $.provider }:data.slider_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>

現在のコレクションに関連する列との結合を追加して、2つの方法で使用できるようにします。

  1. グリッドでフィルターdataSource>引数名> "dataProvider">引数名> "data">アイテム名 "config"> item name = "filter_url_params" =>アイテム名> "slider_id"

詳細については、以下のコードを確認してください。

<dataSource name="..._listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">...\...\Ui\DataProvider\...\Grid\...DataProvider</argument>
        <argument name="name" xsi:type="string">..._listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">id</argument>
        <argument name="requestFieldName" xsi:type="string">slider_id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
                <item name="filter_url_params" xsi:type="array">
                    <item name="slider_id" xsi:type="string">*</item>
                </item>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">id</item>
                </item>
            </item>
        </argument>
    </argument>
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
        </item>
    </argument>
</dataSource>
  1. 挿入されたリストのデータプロバイダーをフィルターします。

データプロバイダーで、このパラメーターのフィルターを追加します。

$collection->addFieldToFilter('slider_id', $this->request->getParam('slider_id'));

オプション1に従いたい。


dataProviderの定義にはfilter_url_paramsパラメータがありません。アンサーを更新してください。
ミケランジェロ

1

Magento 2のコアファイル読んでデバッグしたところ、この問題に関する簡潔でシンプルな解決策が見つかりましたUIComponent insertListingを使用してカスタムフォームからカスタムグリッドにデータを渡すのは非常に難しく、まったく文書化されていません。

ここに画像の説明を入力してください

InsertListingオブジェクトのタグの下には、リストで使用したエクスポートとインポートの2つのパラメーターがあります。

<fieldset name="relatedto" >
    <settings>
        <label>Related to</label>
        <componentType>fieldset</componentType>
    </settings>

    <insertListing name="threadrelated_listing">
        <settings>
            <dataLinks>
                <exports>false</exports>
                <imports>true</imports>
            </dataLinks>
            <externalProvider>mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_listing_data_source</externalProvider>
            <selectionsProvider>mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_columns.ids</selectionsProvider>
            <autoRender>true</autoRender>
            <dataScope>mycompany_helpdesk_threadrelated_listing</dataScope>
            <ns>mycompany_helpdesk_threadrelated_listing</ns>
            <exports>
                <link name="ticket_id">${ $.externalProvider }:params.ticket_id</link>
            </exports>
            <imports>
                <link name="ticket_id">${ $.provider }:data.ticket_id</link>
            </imports>
        </settings>
    </insertListing>
</fieldset>

そして、何時間もかけてウェブ上で解決策を理解して見つけるために、何の手掛かりも見つけられませんでした!

Magento Coreファイルを読んだところ、Magentoがプロジェクト内にネストされたリストグリッドを作成する方法をメッシュ化していることがわかりました。古いブロック挿入メソッドを使用したり、新しいUIComponentリストメソッドを使用したりすることもあります。

customer_address_listing.xml(/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml)で顧客の住所一覧グリッドを見つけ、customer_form.xmlで定義されたparent_id変数(/ vendor / magento)を取得します/module-customer/view/base/ui_component/customer_form.xml)ですが、問題は次のとおりです。

Magentoがフォームからネストされたリストグリッドにデータを渡す方法を教えてください。

MagentoはQUERYSTRING PARAMETERによってデータを渡します!

DataProvider.phpファイルを読むと、QUERYSTRINGによってparent_id(顧客)変数を取得するため、驚かれることでしょう!/vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php行58を見てください。

/**
 * Add country key for default billing/shipping blocks on customer addresses tab
 *
 * @return array
 */
public function getData(): array
{
    $collection = $this->getCollection();
    $data['items'] = [];
    if ($this->request->getParam('parent_id')) {
        $collection->addFieldToFilter('parent_id', $this->request->getParam('parent_id'));
        $data = $collection->toArray();
    }
    foreach ($data['items'] as $key => $item) {
        if (isset($item['country_id']) && !isset($item['country'])) {
            $data['items'][$key]['country'] = $this->countryDirectory->loadByCode($item['country_id'])->getName();
        }
    }

    return $data;
}

しかし、listinggrid URLでパラメーターを設定するにはどうすればよいですか?filterUrlParamsパラメータを見つけましたが、ここにも奇妙な問題があります!このdataSourceコードの一部を見てみましょう。

<dataSource name="mycompany_helpdesk_threadrelated_listing_data_source" component="Magento_Ui/js/grid/provider">
    <settings>
        <filterUrlParams>
            <param name="ticket_id">*</param>
        </filterUrlParams>
        <storageConfig>
            <param name="indexField" xsi:type="string">threadrelated_id</param>
        </storageConfig>
        <updateUrl path="mui/index/render"/>
    </settings>
    <dataProvider class="mycompany\Helpdesk\Ui\DataProvider\Threadrelated\ThreadRelatedDataProvider" name="mycompany_helpdesk_threadrelated_listing_data_source">
        <settings>
            <requestFieldName>id</requestFieldName>
            <primaryFieldName>threadrelated_id</primaryFieldName>
        </settings>
    </dataProvider>
</dataSource>

ticket_idにワイルドカード(*)を設定しました。つまり、すべてのチケットを取得します。しかし、filterUrlParamsにIDを設定しない場合、insertListing URLにはticket_idが設定されていません。なぜ?!

@ hashish-rajが提供するソリューションは、私には機能しません。

これらは私がこの問題について読んだすべての投稿です:

最後に、コアセッションを使用して一時的な回避策を見つけ、ticket_idパラメータをセッションに保存しました。次に、カスタムデータプロバイダーでチェックして、コレクションに適用しました。

/***
 * @return array
 */
public function getData()
{

    $collection = $this->getSearchResult();

    /** see: check Mycompany\Helpdesk\Controller\Adminhtml\Ticket\Edit **/
    if($this->coreSession->getTicketId()){
        $collection->addFieldToFilter('ticket_id', ['eq' => $this->coreSession->getTicketId()]);
    }

    return $this->searchResultToOutput($collection);

}

回避策がある場合またはMagentoがUIComponent間のこの関係を処理する方法を理解している場合は、知識を共有してください!

ここで「バウンティ」をオープンしました:https : //magento.stackexchange.com/a/306537/2004

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.