Magento 2: ¿Cómo puedo cargar una grilla de administración con valores de filtro predefinidos?

14

Quiero crear un enlace a una cuadrícula personalizada en mi administrador con filtros predefinidos. La cuadrícula está hecha con un Componente de listado de UI (XML) y tiene una columna llamada form_idque se configura así:

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

La cuadrícula funciona bien. Puedo aplicar el filtro y todo funciona bien. La cuadrícula se actualiza muy bien con una solicitud XHR.

Sin embargo ... Quiero poder tener un valor de filtro predefinido en algún momento. Por ejemplo, quiero poder abrir la cuadrícula cuando se filtra en ID = 3.

Así que ya intenté cargar la página con los mismos parámetros de URL que la solicitud XHR, y simplemente agregué los únicos parámetros necesarios:

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

Tanto como:

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

Ambos sin éxito. Entonces, ¿cómo puedo rellenar previamente los filtros usando la URL?

Editar:

No estoy seguro de si esto es un duplicado de la otra pregunta (como se menciona en los comentarios a continuación). En mi caso, estoy usando un tipo virtual como colección para mi grilla:

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

Entonces, no es que tenga una clase física de Bloque para mi widget de cuadrícula, está puramente creado con un XML de listado de componentes de la interfaz de usuario.

Sin embargo, comprobaré de todos modos si la pregunta mencionada ayudará a mi caso de uso.

Giel Berkers
fuente
¿Posible duplicado de Agregar filtro predeterminado a la cuadrícula en Magento2?
Raphael en Digital Pianism
2
@RaphaelatDigitalPianism No creo que esto sea un duplicado. La pregunta que vinculó habla sobre la construcción de cuadrículas de una manera antigua. Algo entre bloques de cuadrícula y componentes ui. Básicamente era algo donde todavía tenía bloques de cuadrícula, pero se configuraron en un archivo xml en lugar de prepareColumnsmétodo.
Marius
@Marius vote retracted;)
Raphael en Digital Pianism
1
Edité mi pregunta, ya que tampoco creo que sea un duplicado (hice mi investigación ;-))
Giel Berkers
@Giel Berkers Tengo el mismo problema
bhargav shastri

Respuestas:

9

Esto es lo que descubrí hasta ahora.
Esto no está completo, pero puede llevarlo por el camino correcto.
Realicé mis pruebas modificando la página cms que enumera el componente ui.
Agregué esto

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

en cms_page_listing.xmlel interior del nodo dataSource dentro de la / argumento de datos de configuración. Entonces ahora se ve así

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

Esto me permite llamar a la url ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
Y solo veo la página con la identificación 2.
Pero no funciona para los filtros de rango y el valor del filtro no se completa. Todavía se muestra en blanco.

Ahora aquí es por qué esto es posible.

La clase dataProvider para páginas cms es Magento\Cms\Ui\Component\DataProvider.
Este se extiende Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Este último contiene un método protegido llamadoprepareUpdateUrl

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

Lo que esto hace es verificar en la configuración del componente ui si hay un elemento llamado filter_url_params. Si lo hay, toma todos los valores dentro de él y verifica la solicitud de valores que coincidan con lo que se define en filter_url_params.
Pero por defecto solo funciona con eq.

Lo que puede intentar es tener una fuente de datos personalizada para su componente donde reescriba el método prepareUpdateUrly haga que tenga en cuenta todas las variables de solicitud que necesita y tal vez agregue paginación y filtrado de rango.

Nota al margen: esta es una pregunta muy interesante. Estoy seguro de que mucha gente necesitará esto en el futuro.

Marius
fuente
Gracias @Marius por tu respuesta. Esto funciona para mi situación, porque el enlace siempre necesita filtrarse por una ID, no por un rango (el rango es más o menos una función, pero mi URL no lo requiere). ¡Tu respuesta y tu explicación me ayudaron mucho!
Giel Berkers
1
@ Mario puedo usar la url de esta manera ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, porque estoy usando $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])en UiCompnent / Listing / Column
simple guy
¿Cómo uso más de un parámetro para filtrar? xsi: type = "array"> funciona para filtros individuales pero no colectivamente.
Shathish
@Marius! URA salvavidas!
Zorox
@ Mario: ¿Tiene idea de cómo usar la funcionalidad para múltiples parámetros de URL como ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h_ ere> as ya especificado por Shathish
Ashish Raj