Magento 2: Was ist der Unterschied zwischen den beiden Grid Component Data Providern?

16

In Magento 2.1 sind insgesamt 25 Anbieter für die Auflistung von UI-Komponenten / Grid-Daten konfiguriert und in Verwendung. Ihre Datenprovider-Klassen und ui_component-Dateien sind unten aufgeführt

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

Basierend auf diesen Informationen scheint es zwei Basisklassen zu geben, auf denen Endbenutzerprogrammierer ihre Grid-Komponenten aufbauen können

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

Die Magento\Ui\DataProvider\AbstractDataProviderKlasse scheint einfacher zu sein und erfordert (anscheinend?) Nur die Konfiguration eines Magento-Ressourcenmodells. Das Kundenraster- Magento\Customer\Ui\Component\DataProviderModul basiert auf dieser Klasse und verfügt anscheinend über alle Funktionen zum Sortieren, Filtern usw., die für eine Rasterauflistung erforderlich sind.

Gibt es einen Grund für die Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderExistenz - oder ist es nur älterer / neuer Code, der einen anderen Ansatz zur Erstellung eines Datenproviders verfolgt? Mit anderen Worten, bringt die Verwendung von "the" Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderzusätzliche Funktionen in die Tabelle oder ermöglicht es anderen Teilen des Systems, Dinge mit dem Raster zu tun? Betrachtet man den Quellcode, Magento\Framework\App\RequestInterfaceerscheint das faszinierend - da dies impliziert, dass Sie mit diesen Gittern möglicherweise "kostenlos" über Funktionen berichten. Ohne eine umfangreiche Codesafari bin ich mir jedoch nicht sicher, ob das stimmt oder nicht, und ich hoffe, dass jemand eine klare Erklärung dafür hat, warum Sie eine Klasse über die andere setzen würden.

Alan Storm
quelle
Gute Frage übrigens, es hat mir geholfen, ein Problem mit Exporten für mein benutzerdefiniertes Modul in admin zu lösen. Ich habe den falschen Dataprovider-Typ "Magento \ Ui \ DataProvider \ AbstractDataProvider" verwendet.
Sanjay Chaudhary

Antworten:

14

Für mich besteht der Hauptunterschied darin, dass Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderdie Such-API verwendet wird.

Die folgenden Klassen werden in dieser Klasse verwendet:

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

Welche werden zum Filtern / Bestellen / Paging verwendet:

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

Und natürlich auch für die Suche:

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

Was ist interessant, wenn Magento/Ui/DataProvider/AbstractDataProviderdie Such-API erwähnt, aber überhaupt nicht verwendet wird:

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

Wenn Sie nun den Verlauf dieser Dateien in GitHub überprüfen, erhalten Sie Folgendes:

Wie Sie sehen, sind die meisten Commits für diese beiden Dateien mit dem folgenden internen Ticket verknüpft: MAGETWO-39905: UI components compatibility with Search API

Auch wenn es für die Magento/FrameworkDatei gemacht wurde, wurde es nie für die Magento/UiDatei gemacht.

Ansonsten sehe ich keinen Unterschied zwischen diesen Dateien. Einer arbeitet direkt an der Sammlung, der andere verwendet die Such-API, um die Ergebnisse zu generieren.

Raphael bei Digital Pianism
quelle