Magento 2:定義済みのフィルター値を使用して管理グリッドを読み込むにはどうすればよいですか?


14

事前定義されたフィルターを使用して、管理者にカスタムグリッドへのリンクを作成したい。グリッドはUIリストコンポーネント(XML)でform_id作成され、次のように設定された列があります。

<column name="form_id">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="filter" xsi:type="string">textRange</item>
            <item name="label" xsi:type="string" translate="true">Form id</item>
        </item>
    </argument>
</column>

グリッドは正常に機能します。フィルターを適用でき、すべてがうまく機能します。グリッドはXHRリクエストで適切に更新されます。

しかし...ある時点でフィルターの値を事前に定義できるようにしたい。たとえば、ID = 3でフィルターされたときにグリッドを開くことができます。

そのため、XHRリクエストと同じURLパラメーターを使用してページをロードし、必要なパラメーターのみを追加するだけで済みます。

?namespace=form_response_listing&search=&filters[placeholder]=true&filters[form_id][from]=3&filters[form_id][to]=3&paging[pageSize]=20&paging[current]=1

と同様:

?filters[form_id][from]=3&filters[form_id][to]=3

両方とも成功しませんでした。では、URLを使用してフィルターを事前に入力するにはどうすればよいですか?

編集:

これが他の質問と重複しているかどうかはわかりません(以下のコメントに記載されています)。私の場合、グリッドのコレクションとして仮想タイプを使用しています。

<virtualType name="Vendor\Module\Model\ResourceModel\Response\Grid\Collection"
             type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
    <arguments>
        <argument name="mainTable" xsi:type="string">vendormodule_form_response</argument>
        <argument name="resourceModel" xsi:type="string">Vendor\Module\Model\ResourceModel\Response</argument>
    </arguments>
</virtualType>

したがって、グリッドウィジェット用の物理的なBlockクラスを持っているのではなく、XMLをリストするUIコンポーネントで純粋に作成されています。

それにもかかわらず、言及された質問が私のユースケースに役立つかどうかとにかくチェックします。



2
@RaphaelatDigitalPianismこれは重複しているとは思わない。あなたがリンクした質問は、グリッドが昔ながらの方法で構築されているという話です。グリッドブロックとUIコンポーネントの間の何か。基本的にはまだグリッドブロックがありましたが、prepareColumnsメソッドではなくxmlファイルで構成されていました。
マリウス

@Marius投票は撤回されました;)
デジタルピアニズムでのラファエル

1
私も質問を編集しました。これは重複しているとは思わないからです(調査を行いました;
Giel Berkers

@Giel Berkers私は同じ問題を取得しています
bhargavシャーストリー

回答:


9

これが私がこれまでに見つけたものです。
これは完全ではありませんが、正しい道を歩むことができます。
UIコンポーネントをリストするcmsページを変更して、テストを実施しました。
これを追加しました

<item name="filter_url_params" xsi:type="array">
    <item name="page_id" xsi:type="string">*</item>
</item>

cms_page_listing.xmlデータ/コンフィグ引数内のデータソースノードの内部。だから今はこんな感じ

<dataSource name="cms_page_listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">Magento\Cms\Ui\Component\DataProvider</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="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">page_id</item>
                </item>
                <item name="filter_url_params" xsi:type="array"><!-- my addition -->
                    <item name="page_id" xsi:type="string">*</item>
                </item>
            </item>
        </argument>
    </argument>
</dataSource>

これにより、URLを呼び出すことができますROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2
また、ID 2のページのみが表示されますが
、範囲フィルターでは機能せず、フィルター値は入力されません。空白のままです。

これがなぜこれが可能であるか、ここにあります。

cmsページのdataProviderクラスはMagento\Cms\Ui\Component\DataProviderです。
これは拡張しMagento\Framework\View\Element\UiComponent\DataProvider\DataProviderます。
この最後のものには、という保護されたメソッドが含まれていますprepareUpdateUrl

protected function prepareUpdateUrl()
{
    if (!isset($this->data['config']['filter_url_params'])) {
        return;
    }
    foreach ($this->data['config']['filter_url_params'] as $paramName => $paramValue) {
        if ('*' == $paramValue) {
            $paramValue = $this->request->getParam($paramName);
        }
        if ($paramValue) {
            $this->data['config']['update_url'] = sprintf(
                '%s%s/%s',
                $this->data['config']['update_url'],
                $paramName,
                $paramValue
            );
            $this->addFilter(
                $this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
            );
        }
    }
}

これが行うことは、という要素がある場合にuiコンポーネントの設定をチェックインすることですfilter_url_params。ある場合は、その中のすべての値を取得し、で定義されている値と一致する値の要求をチェックしfilter_url_paramsます。
ただし、デフォルトではでのみ機能しeqます。

試すことができるのは、メソッドを書き直し、prepareUpdateUrl必要なすべてのリクエスト変数を考慮し、ページングと範囲フィルタリングを追加するコンポーネントのカスタムdataSourceを用意することです。

サイドノート:これは非常に興味深い質問です。多くの人が将来これを必要とすると確信しています。


@Mariusの回答に感謝します。リンクは範囲ではなく、常に1つのIDでフィルタリングする必要があるため、これは私の状況で機能します(範囲は多かれ少なかれ機能ですが、URLでは必要ありません)。あなたの答えと説明は私を大いに助けてくれました!
ゲルバーカーズ

1
@Mariusは、UiCompnent / Listing / ColumnでROOT/admin/cms/page/index/page_id/2/key/<form_key_here>使用$this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])しているため、このようなURLを使用できます
単純な男

ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here>で複数のパラメーターを使用してフィルター処理する方法xsi:type = "array">は個々のフィルターに対して機能しますが、集合的には機能しません。
シャシッシュ

@マリウス!うらライフセーバー!
ゾロックス

@Marius:ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere>のような複数のURLパラメーターの機能を使用する方法を考えていますか?すでにShathishで指定された
アシシュラジ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.