Magento 2: ¿Cuál es la diferencia entre los dos proveedores de datos de componentes de cuadrícula?

16

En Magento 2.1, hay un total de 25 proveedores de datos de cuadrícula / listado de componentes UI configurados y en uso. Sus clases y ui_componentarchivos de proveedor de datos se enumeran a continuación

Magento\Bundle\Ui\DataProvider\Product\BundleDataProvider                     bundle_product_listing.xmlMagento\Catalog\Ui\DataProvider\Product\Attributes\Listing                    product_attributes_grid.xml
Magento\Catalog\Ui\DataProvider\Product\ProductCustomOptionsDataProvider      product_custom_options_listing.xml
Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider                   configurable_associated_product_listing.xml
Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider                   product_listing.xml
Magento\Catalog\Ui\DataProvider\Product\Related\CrossSellDataProvider         crosssell_product_listing.xml
Magento\Catalog\Ui\DataProvider\Product\Related\RelatedDataProvider           related_product_listing.xml
Magento\Catalog\Ui\DataProvider\Product\Related\UpSellDataProvider            upsell_product_listing.xml
Magento\Cms\Ui\Component\DataProvider                                         cms_block_listing.xml
Magento\Cms\Ui\Component\DataProvider                                         cms_page_listing.xml
Magento\ConfigurableProduct\Ui\DataProvider\Attributes                        product_attributes_listing.xml
Magento\Customer\Ui\Component\DataProvider                                    customer_listing.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          customer_online_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          sales_order_creditmemo_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          sales_order_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          sales_order_invoice_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          sales_order_shipment_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          sales_order_view_creditmemo_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          sales_order_view_invoice_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          sales_order_view_shipment_grid.xml
Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider          search_synonyms_grid.xml
BraintreeTransactionsDataProvider (virtual type)                              braintree_report.xml
    Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider    
Magento\GroupedProduct\Ui\DataProvider\Product\GroupedProductDataProvider     grouped_product_listing.xml
Magento\Review\Ui\DataProvider\Product\ReviewDataProvider                     review_listing.xml
Magento\Theme\Ui\Component\Design\Config\DataProvider                         design_config_listing.xml

Según esta información, parece que hay dos clases base que los programadores de usuarios finales pueden usar para basar sus componentes de cuadrícula en

  • Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ DataProvider
  • Magento \ Ui \ DataProvider \ AbstractDataProvider

La Magento\Ui\DataProvider\AbstractDataProviderclase parece ser la más simple de las dos y (¿parece?) Solo requiere la configuración de un modelo de recursos de Magento. El Magento\Customer\Ui\Component\DataProvidermódulo de cuadrícula del cliente se basa en esta clase y parece tener todas las funciones de clasificación, filtrado, etc. necesarias para un listado de cuadrícula.

¿Existe alguna razón para que Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderexista, o es solo un código más antiguo / más nuevo que adopta un enfoque diferente para crear un proveedor de datos? En otras palabras, ¿el uso de Magento\Framework\View\Element\UiComponent\DataProvider\DataProvidertrae algunas características adicionales a la tabla o permite que otras partes del sistema hagan cosas con la cuadrícula? Al mirar el código fuente, Magento\Framework\App\RequestInterfaceparece intrigante, ya que implica que podría estar informando la funcionalidad "gratis" con estas cuadrículas. Sin embargo, sin un extenso safari de código, no estoy seguro de si eso es cierto o no, y espero que alguien tenga una explicación clara de por qué usaría una clase sobre la otra.

Alan Storm
fuente
Buena pregunta, por cierto, me ayudó a resolver un problema con las exportaciones de mi módulo personalizado en admin. Estaba utilizando el tipo de proveedor de datos incorrecto "Magento \ Ui \ DataProvider \ AbstractDataProvider".
Sanjay Chaudhary

Respuestas:

14

Para mí, esa diferencia principal es que Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderutiliza la API de búsqueda.

Las siguientes clases se utilizan en esta clase:

  • Magento\Framework\Api\FilterBuilder
  • Magento\Framework\Api\Search\ReportingInterface
  • Magento\Framework\Api\Search\SearchCriteria
  • Magento\Framework\Api\Search\SearchCriteriaBuilder
  • Magento\Framework\Api\Search\SearchResultInterface

Que se utilizan para filtrar / ordenar / paginar:

public function addFilter(\Magento\Framework\Api\Filter $filter)
{
    $this->searchCriteriaBuilder->addFilter($filter);
}

public function addOrder($field, $direction)
{
    $this->searchCriteriaBuilder->addSortOrder($field, $direction);
}

public function setLimit($offset, $size)
{
    $this->searchCriteriaBuilder->setPageSize($size);
    $this->searchCriteriaBuilder->setCurrentPage($offset);
}

Y también obviamente para la búsqueda:

public function getData()
{
    return $this->searchResultToOutput($this->getSearchResult());
}

protected function searchResultToOutput(SearchResultInterface $searchResult)
{
    $arrItems = [];

    $arrItems['items'] = [];
    foreach ($searchResult->getItems() as $item) {
        $itemData = [];
        foreach ($item->getCustomAttributes() as $attribute) {
            $itemData[$attribute->getAttributeCode()] = $attribute->getValue();
        }
        $arrItems['items'][] = $itemData;
    }

    $arrItems['totalRecords'] = $searchResult->getTotalCount();

    return $arrItems;
}

public function getSearchResult()
{
    return $this->reporting->search($this->getSearchCriteria());
}

Lo que es interesante si Magento/Ui/DataProvider/AbstractDataProvidermenciona la API de búsqueda pero no la usa en absoluto:

public function getSearchCriteria()
{
    //TODO: Technical dept, should be implemented as part of SearchAPI support for Catalog Grids
    return null;
}

public function getSearchResult()
{
    //TODO: Technical dept, should be implemented as part of SearchAPI support for Catalog Grids
    return $this->getCollection();
}

Ahora, si revisas el historial de esos archivos en GitHub, esto es lo que obtienes:

Como puede ver, la mayoría de los commits para esos dos archivos están vinculados al siguiente ticket interno: MAGETWO-39905: UI components compatibility with Search API

Incluso si se ha hecho para el Magento/Frameworkarchivo, nunca se ha hecho para el Magento/Uiarchivo.

Aparte de eso, no veo ninguna diferencia entre esos archivos. Uno está trabajando directamente en la colección, el otro está utilizando la API de búsqueda para generar los resultados.

Raphael en Digital Pianism
fuente