Magento 2: qual è la differenza tra i provider di dati dei componenti a due griglie?


16

In Magento 2.1, ci sono 25 fornitori di dati di griglia / elenco dei componenti dell'interfaccia utente configurati e in uso. Le loro classi e ui_componentfile del fornitore di dati sono elencati di seguito

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

Sulla base di queste informazioni, sembrano esserci due classi base che i programmatori finali possono usare per basare i loro componenti della griglia

  • Magento \ Framework \ Visualizza \ elemento \ UIComponent \ DataProvider \ DataProvider
  • Magento \ Ui \ FornitoreDati \ AbstractDataProvider

La Magento\Ui\DataProvider\AbstractDataProviderclasse sembra più semplice delle due e (sembra?) Richiede solo la configurazione di un modello di risorse Magento. Il Magento\Customer\Ui\Component\DataProvidermodulo della griglia del cliente si basa su questa classe e sembra avere tutte le funzionalità di ordinamento, filtro, ecc. Necessarie per un elenco della griglia.

C'è un motivo per cui Magento\Framework\View\Element\UiComponent\DataProvider\DataProvideresiste - o è solo il codice più vecchio / più recente che ha un approccio diverso alla creazione di un fornitore di dati? In altre parole, l'utilizzo di Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderporta qualche funzionalità extra sul tavolo o consente ad altre parti del sistema di fare cose con la griglia? Guardando il codice sorgente, Magento\Framework\App\RequestInterfacesembra intrigante - poiché implica che potresti segnalare funzionalità "gratis" con queste griglie. Tuttavia, senza un ampio safari in codice, non sono sicuro che sia vero o no, e spero che qualcuno abbia una chiara spiegazione del perché dovresti usare una classe sull'altra.


Buona domanda a proposito, mi ha aiutato a risolvere un problema con le esportazioni per il mio modulo personalizzato in admin. Stavo usando il tipo di Dataprovider sbagliato "Magento \ Ui \ DataProvider \ AbstractDataProvider".
Sanjay Chaudhary,

Risposte:


14

Per me, la differenza principale è che Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderutilizza l'API di ricerca.

Le seguenti classi sono utilizzate in questa 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

Quali sono usati per filtrare / ordinare / paginare:

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 ovviamente anche per la ricerca:

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

La cosa interessante se Magento/Ui/DataProvider/AbstractDataProvidermenziona l'API di ricerca ma non la usa affatto:

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

Ora, se controlli la cronologia di quei file in GitHub, ecco cosa ottieni:

Come puoi vedere, la maggior parte dei commit per quei due file sono collegati al seguente ticket interno: MAGETWO-39905: UI components compatibility with Search API

Anche se è stato fatto per il Magento/Frameworkfile, non è mai stato fatto per il Magento/Uifile.

A parte questo, non vedo alcuna differenza tra questi file. Uno sta lavorando direttamente sulla raccolta, l'altro utilizza l'API di ricerca per generare i risultati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.