Magento2のグリッドにデフォルトのフィルターを追加するには?


12

管理グリッドにタイトルとステータスフィールド属性を持つ1つのカスタムモジュールを作成しました。

module_test_grid_block.xmlのグリッドコレクション

        <arguments>
             <argument name="id" xsi:type="string">testGrid</argument>
             <argument name="dataSource" xsi:type="object">Namespace\Module\Model\ResourceModel\test\Collection</argument>
             <argument name="default_sort" xsi:type="string">id</argument>
             <argument name="default_dir" xsi:type="string">desc</argument>                             
             <argument name="grid_url" xsi:type="url" path="*/*/grid"><param name="_current">1</param></argument>
         </arguments>

有効なデータを表示したい。管理グリッドコレクションにデフォルトフィルターを追加するオプションはありますか?

編集

    <block class="Namespace\Module\Block\Adminhtml\Test\Grid" name="namespace_module_test.grid" as="grid">
       <arguments>
             <argument name="id" xsi:type="string">testGrid</argument>
             <argument name="dataSource" xsi:type="object">Namespace\Module\Model\ResourceModel\test\Collection</argument>
             <argument name="default_sort" xsi:type="string">id</argument>
             <argument name="default_dir" xsi:type="string">desc</argument>                             
             <argument name="grid_url" xsi:type="url" path="*/*/grid"><param name="_current">1</param></argument>
             <argument name="default_filter" xsi:type="array">
                  <item name="status" xsi:type="string">1</item>
             </argument>
         </arguments>
        .
        .
      </block>

ブロック内-Grid.php

    namespace Namespace\Module\Block\Adminhtml\Test;

    use Magento\Backend\Block\Widget\Grid as WidgetGrid;

     class Grid extends WidgetGrid
        {
          public function _construct()
           {
            parent::_construct(); 
            if ($this->hasData('default_filter')) {
            // print_r($this->getData('default_filter'));die;
            $this->setDefaultFilter($this->getData('default_filter'));
           }
        }
      }

このリンクをたどって、magento 2で管理グリッドを作成しました

http://www.mage-world.com/blog/grid-and-form-in-magento-2-admin-panel-part-1.html

回答:


12

グリッドコレクションの思考レイアウトを定義すると、アップデーターを使用してデフォルトのフィルターを追加できます。

<argument name="dataSource" xsi:type="object">
    Tutorial\SimpleNews\Model\Resource\News\Collection
    <updater>Tutorial\SimpleNews\Model\Resource\News\Collection\Updater</updater>
</argument>

そして

<?php
namespace Tutorial\SimpleNews\Model\Resource\News\Collection;

class CollectionUpdater implements \Magento\Framework\View\Layout\Argument\UpdaterInterface
{

    /**
     * Update grid collection according to chosen order
     *
     * @param \Tutorial\SimpleNews\Model\Resource\News\Collection $argument
     * @return \Tutorial\SimpleNews\Model\Resource\News\Collection
     */
    public function update($argument)
    {
        $argument->addFieldToFilter('you_field', 'value');

        return $argument;
    }
}

またはグリッドブロックを拡張

class Grid extends \Magento\Backend\Block\Widget\Grid
{
    protected function _prepareCollection()
    {
        if ($this->getCollection()) {
            foreach ($this->getDefaultFilter() as $field => $value) {
                $this->getCollection()->addFieldToFilter($field, $value);
            }
        }
        return parent::_prepareCollection();
    }   
}

こんにちはKAndy、それは私のために働いていません。それを整理するのを手伝ってくれませんか?
Vigna S

5
この答えを見つけた人には、レガシーグリッドにのみ適用されることに注意してください。UIコンポーネントベースのグリッドではありません
Andre Klang

それでは、このタイプのフィルターをUIコンポーネントベースのグリッドにどのように適用できますか?
Knight017

ためのUIコンポーネントベースのグリッドには、このような同一の手法を用いて行うことができるmagento.stackexchange.com/a/178663/55259
トーリー

5

これを引数タグ内に追加する必要があります:

<argument name="default_filter" xsi:type="array">
    <item name="field_name_here" xsi:type="string">value here</item>
</argument>

引数がこのブロックに含まれている場合

<block class="Magento\Backend\Block\Widget\Grid" name="some.name.here" as="grid">

次のMagento\Backend\Block\Widget\Gridように拡張する独自のクラスを作成する必要があります。

<?php 
namespace Namespace\Module\Block\Adminhtml\Whatever;

class Grid extends \Magento\Backend\Block\Widget\Grid
{
    public function _construct()
    {
        parent::_construct(); 
        if ($this->hasData('default_filter')) {
            $this->setDefaultFilter($this->getData('default_filter'));
        }
    }
}

上記のブロックタグを次のように変更します

 <block class="Namespace\Module\Block\Adminhtml\Whatever\Grid" name="some.name.here" as="grid">

デフォルトではなくカスタムグリッドをすでに使用しているMagento\Backend\Block\Widget\Grid場合は、クラスを作成する必要はありません。クラスのメソッドを上から
コピーするだけです_construct


こんにちは@Marius、ご返信いただきありがとうございます。構成メソッドで、デフォルトのフィルター値を取得しました。しかし、フィルタリングは機能しません。あまりにもすべてのレコードを取得しない
DRAJI

1
多分あなたはより良い概要を得るためにあなたが質問に持っているより多くのコードを追加するべきです。
マリウス

追加したフィルターコードで質問を更新しました
DRAJI

すごい。私は新しい外観を取り、結果を返します。
マリウス

こんにちはマリウス、私はこれを試しましたが、うまくいきません、解決策を見つけましたか?
Vigna S

0

ここにdevdocsのリファレンスがあります:

http://devdocs.magento.com/guides/v2.0/ui-components/ui-secondary-filter.html

詳細については、ドキュメントページからプルリクエストまたは問題を作成できます。[GitHubでこのページを編集]リンクをクリックしてください。ドキュメントは常に更新され、改善されています。


1
あなたが言及したリンクは、UIコンポーネントを使用するグリッドにフィルターを追加する方法を示しています。問題は拡張するグリッドを変更することだと思いますMagento\Backend\Block\Widget\Grid。しかし、私は間違っているかもしれません。
マリウス

こんにちは@EquinoxBlack回答ありがとうございます。しかし、UIコンポーネントを使用して
DRAJI

0

機能しない多くのコードを試した後、最終的にコーディングが不要な方法を見つけます- フィルターと列の設定を保存できるカスタムビュー関数を保存することを利用してください。

具体的な手順

フィルターと列の設定を設定したDefault View、目のアイコンが付いたボタンをクリックし、クリックしSave View As…てビューの名前を入力します。次に、グリッドを好きなように取得したいときにカスタムビューをクリックして、カスタムビューをいくつでも保存できます。

また、戻って編集アイコンを使用して、名前を変更したり、後で削除したり、デフォルトのビューに戻ったりすることもできます。

これはMagento 2では非常に優れた機能だと思います:)

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

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