Magento 2: Önceden tanımlanmış filtre değerlerine sahip bir yönetici ızgarasını nasıl yükleyebilirim?


14

Önceden tanımlanmış filtrelerle yöneticimdeki özel bir tabloya bağlantı oluşturmak istiyorum. Izgara bir UI Listeleme Bileşeni (XML) ile yapılır ve form_idşu şekilde ayarlanmış bir sütuna sahiptir :

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

Izgara gayet iyi çalışıyor. Filtreyi uygulayabilirim ve her şey iyi çalışıyor. Izgara bir XHR isteği ile güzelce güncellenir.

Ancak ... bir noktada bir filtre değerinin önceden tanımlanmış olmasını istiyorum. Örneğin, ID = 3'te filtrelendiğinde ızgarayı açabilmek istiyorum.

Bu yüzden zaten XHR isteği ile aynı URL parametreleriyle sayfayı yüklemeyi ve sadece gerekli parametreleri eklemeyi denedim:

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

Hem de:

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

Her ikisi de başarılı olamadı. URL'yi kullanarak filtreleri nasıl önceden doldurabilirim?

Düzenle:

Bunun diğer sorunun bir kopyası olup olmadığından emin değilim (aşağıdaki yorumlarda belirtildiği gibi). Benim durumumda, ızgaram için koleksiyon olarak sanal bir tür kullanıyorum:

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

Bu yüzden ızgara widget'ım için fiziksel bir Block sınıfına sahip değilim, tamamen bir UI Bileşeni listeleme XML'si ile oluşturuldu.

Yine de, atıfta bulunulan sorunun kullanım durumuma yardımcı olup olmadığını kontrol edeceğim.



2
@RaphaelatDigitalPianism Bunun bir kopya olduğunu düşünmüyorum. Bağlantı kurduğunuz soru ızgaralardan bahsediyor, eski bir tarzda kuruluyor. Izgara blokları ve kullanıcı arabirimi bileşenleri arasında bir şey. Temelde hala ızgara blokları vardı ama prepareColumnsyöntem yerine xml dosyasında yapılandırılmış bir şeydi .
Marius

@Marius oyu geri çekildi;)
Raphael, Dijital

1
Sorumu

@Giel Berkers Ben aynı sorunu alıyorum
bhargav shastri

Yanıtlar:


9

İşte şimdiye kadar öğrendim.
Bu tamamlanmadı ancak sizi doğru yola götürebilir.
Testlerimi cms sayfa listeleme ui bileşenini değiştirerek gerçekleştirdim.
Bunu ekledim

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

içinde cms_page_listing.xmlveri / yapılandırma bağımsız değişkeni içinde dataSource düğüm içinde. Şimdi böyle görünüyor

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

Bu, url'yi aramamı sağlıyor ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
Ve sadece id 2 olan sayfayı görüyorum.
Ancak aralık filtreleri için çalışmıyor ve filtre değeri doldurulmuyor. Hala boş olarak görünüyor.

İşte bu yüzden bu mümkün.

Cms sayfaları için dataProvider sınıfı Magento\Cms\Ui\Component\DataProvider.
Bu uzanıyor Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Bu sonuncusu,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()
            );
        }
    }
}

Bunun yaptığı, ui bileşen yapılandırmasında denilen bir öğe olup olmadığını kontrol etmektir filter_url_params. Varsa içindeki tüm değerleri alır ve içinde tanımlanan değerlerle ilgili isteği kontrol eder filter_url_params.
Ancak varsayılan olarak yalnızca ile çalışır eq.

Deneyebileceğiniz, yöntemi yeniden yazdığınız ve prepareUpdateUrlihtiyacınız olan tüm istek değişkenlerini dikkate aldığınız ve belki de buna sayfalama ve aralık filtrelemesi eklediğiniz , bileşeniniz için özel bir dataSource'a sahip olmaktır.

Yan not: Bu çok ilginç bir soru. Eminim gelecekte birçok insan buna ihtiyaç duyacaktır.


Cevabınız için @Marius'a teşekkür ederiz. Bu durum benim durumum için işe yarar, çünkü bağlantının her zaman bir aralığa göre değil, bir kimliğe göre filtrelenmesi gerekir (aralık aşağı yukarı bir özelliktir, ancak URL'm için gerekli değildir). Cevabınız ve açıklamanız bana çok yardımcı oldu!
Giel Berkers

1
@Marius bu şekilde url kullanabilir miyim ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, çünkü $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])UiCompnent / Listing / Column kullanıyorum
basit adam

filtrelemek için birden fazla parametre kullanırım, yani <öğe adı = "filter_url_params" altında üç parametre veren ROOT / admin / cms / sayfa / dizin / param_1 / val1 / param_2 / val2 / param_3 / val3 / anahtar / <form_key_here> xsi: type = "dizi"> tek tek filtreler için çalışır, ancak toplu olarak çalışmaz.
Shathish

@Marius! URA YAŞAM TASARRUFU!
Zorox

@Marius: ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> gibi birden fazla url parametresi için işlevselliğin nasıl kullanılacağı hakkında fikriniz var mı? Shathish tarafından önceden belirlenmiş
Ashish Raj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.