Magento 2: Como carregar uma grade administrativa com valores de filtro predefinidos?

14

Quero criar um link para uma grade personalizada no meu administrador com filtros predefinidos. A grade é feita com um XML (Componente de listagem da interface do usuário) e possui uma coluna chamada form_idque é configurada da seguinte maneira:

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

A grade funciona muito bem. Eu posso aplicar o filtro e tudo funciona bem. A grade é bem atualizada com uma solicitação XHR.

No entanto ... eu quero poder ter um valor de filtros predefinido em algum momento. Por exemplo, quero poder abrir a grade quando estiver filtrada no ID = 3.

Então, eu já tentei carregar a página com os mesmos parâmetros de URL que a solicitação XHR, além de simplesmente adicionar os únicos parâmetros necessários:

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

Assim como:

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

Ambos sem sucesso. Então, como posso preencher previamente os filtros usando o URL?

Editar:

Não tenho certeza se essa é uma duplicata da outra pergunta (conforme mencionado nos comentários abaixo). No meu caso, estou usando um tipo virtual como coleção para minha grade:

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

Portanto, não é que eu tenha uma classe Block física para o meu widget de grade, ela foi criada puramente com um XML da lista de Componentes da UI.

No entanto, vou verificar de qualquer maneira se a pergunta referida ajudará meu caso de uso.

Giel Berkers
fonte
Possível duplicata de Para adicionar filtro padrão à grade no Magento2?
Raphael no Digital Pianism
2
@RaphaelatDigitalPianism Não acho que seja uma duplicata. A pergunta que você vinculou fala sobre grades é construída à moda antiga. Algo entre blocos de grade e componentes da interface do usuário. Era basicamente algo em que você ainda tinha blocos de grade, mas eles foram configurados em um arquivo xml em vez de no prepareColumnsmétodo.
Marius
@Marius vote retraído;)
Raphael no Digital Pianism
1
Eu editei a minha pergunta, pois eu também não acho que isso é uma duplicata (eu fiz minha pesquisa ;-))
Giel Berkers
@Giel Berkers estou ficando mesmo problema
Bhargav shastri

Respostas:

9

Aqui está o que eu descobri até agora.
Isso não está completo, mas pode levá-lo ao caminho certo.
Conduzi meus testes modificando o componente da interface do usuário da lista de páginas cms.
Eu adicionei isso

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

no cms_page_listing.xmlinterior do nó dataSource dentro da data / argumento de configuração. Então agora parece com isso

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

Isso permite que eu chame o URL ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
E vejo apenas a página com o ID 2.
Mas não funciona para filtros de intervalo e o valor do filtro não é preenchido. Ainda é exibido em branco.

Agora, aqui está o porquê disso é possível.

A classe dataProvider para páginas cms é Magento\Cms\Ui\Component\DataProvider.
Este se estende Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Este último contém um método protegido chamadoprepareUpdateUrl

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()
            );
        }
    }
}

O que isso faz é verificar a configuração do componente da interface do usuário se houver um elemento chamado filter_url_params. Se houver, ele pega todos os valores dentro dele e verifica a solicitação de valores correspondentes ao definido em filter_url_params.
Mas, por padrão, ele funciona apenas com eq.

O que você pode tentar é ter uma fonte de dados personalizada para o seu componente, onde você reescreve o método prepareUpdateUrle leva em consideração todas as variáveis ​​de solicitação necessárias e talvez adicione paginação a ele e filtragem de intervalo.

Nota lateral: Esta é uma pergunta muito interessante. Tenho certeza que muitas pessoas precisarão disso no futuro.

Marius
fonte
Obrigado @Marius pela sua resposta. Isso funciona para a minha situação, porque o link sempre precisa filtrar por um ID, não por um intervalo (o intervalo é mais ou menos um recurso, mas não é obrigatório pelo meu URL). Sua resposta e sua explicação me ajudaram muito!
Giel Berkers
1
@ Marius posso usar o URL como este ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, porque eu estou usando $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])no UiCompnent / Listing / Column
simple guy
como usar mais de um parâmetro para filtrar, por exemplo, ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> fornecendo três parâmetros em <item name = "filter_url_params" xsi: type = "array"> funciona para filtros individuais, mas não coletivamente.
Shathish 30/08/17
@Marius! URA SALVADOR!
Zorox 31/08/19
@ Marius: Você tem idéia, como usar a funcionalidade para vários parâmetros de URL, como ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / 3 val3 / key / <form_key_h‌ere> como já especificado por Shathish
Ashish Raj