Magento 2: Qual é a diferença entre os dois provedores de dados de componentes de grade?

16

No Magento 2.1, existem 25 provedores de dados de grade / lista de componentes de interface do usuário configurados e em uso. Suas classes e ui_componentarquivos do provedor de dados estão listados abaixo

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

Com base nessas informações, parece haver duas classes básicas que os programadores de usuários finais podem usar para basear seus componentes de grade em

  • Magento \ Framework \ Visualizar \ Elemento \ UiComponent \ DataProvider \ DataProvider
  • Magento \ Ui \ DataProvider \ AbstractDataProvider

A Magento\Ui\DataProvider\AbstractDataProviderclasse parece ser a mais simples das duas, e (parece?) Requer apenas a configuração de um modelo de recursos Magento. O Magento\Customer\Ui\Component\DataProvidermódulo de grade do cliente é baseado nessa classe e parece ter todas as funcionalidades de classificação, filtragem etc. necessárias para uma listagem de grade.

Existe uma razão para a existência Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider- ou são apenas códigos mais antigos / mais recentes que adotam uma abordagem diferente para criar um provedor de dados? Em outras palavras, o uso de Magento\Framework\View\Element\UiComponent\DataProvider\DataProvidertraz recursos extras para a tabela ou permite que outras partes do sistema façam coisas com a grade? Olhando para o código-fonte, isso Magento\Framework\App\RequestInterfaceparece intrigante - como implica que você pode estar relatando a funcionalidade "de graça" com essas grades. No entanto, sem um extenso safari de código, não tenho certeza se isso é verdade ou não, e espero que alguém tenha uma explicação clara sobre por que você usaria uma classe sobre a outra.

Alan Storm
fonte
Boa pergunta, a propósito, me ajudou a resolver um problema com as exportações para o meu módulo personalizado em admin. Eu estava meio que usando o tipo errado de Dataprovider "Magento \ Ui \ DataProvider \ AbstractDataProvider".
Sanjay Chaudhary

Respostas:

14

Para mim, a principal diferença é que ele Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderusa a API de pesquisa.

As seguintes classes são usadas nesta classe:

  • 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 são usados ​​para filtragem / pedido / paginação:

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

E também, obviamente, para a pesquisa:

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

O que é interessante se isso Magento/Ui/DataProvider/AbstractDataProvidermenciona a API de pesquisa, mas não a utiliza de maneira alguma:

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

Agora, se você verificar o histórico desses arquivos no GitHub, veja o que você obtém:

Como você pode ver, a maioria das confirmações desses dois arquivos está vinculada ao seguinte ticket interno: MAGETWO-39905: UI components compatibility with Search API

Mesmo que tenha sido feito para o Magento/Framework arquivo, nunca foi feito para o Magento/Uiarquivo.

Além disso, não vejo diferença entre esses arquivos. Um está trabalhando diretamente na coleção, o outro está usando a API de pesquisa para gerar os resultados.

Raphael na Digital Pianism
fonte