Magento 2: Jaka jest różnica między dwoma dostawcami danych składowych siatki?

16

W Magento 2.1 skonfigurowanych i używanych jest 25 dostawców komponentów UI / danych sieci grid. Klasy i ui_componentpliki ich dostawców danych są wymienione poniżej

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

Na podstawie tych informacji wydaje się, że istnieją dwie klasy podstawowe, z których programiści użytkownicy końcowi mogą korzystać na podstawie swoich komponentów grid

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

Magento\Ui\DataProvider\AbstractDataProviderKlasa wydaje się prostsze z dwóch, i (zdaje się?) Wymaga tylko konfigurację modelu zasobów Magento. Magento\Customer\Ui\Component\DataProviderModuł siatki klienta jest oparty na tej klasie i wydaje się, że ma wszystkie funkcje sortowania, filtrowania itp. Potrzebne do wyświetlenia listy siatki.

Czy istnieje powód, dla którego Magento\Framework\View\Element\UiComponent\DataProvider\DataProvideristnieje - czy to tylko starszy / nowszy kod, który ma inne podejście do tworzenia dostawcy danych? Innymi słowy, czy użycie funkcji Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderprzynosi jakieś dodatkowe funkcje do tabeli, czy umożliwia innym częściom systemu wykonywanie zadań z siatką? Patrząc na kod źródłowy, Magento\Framework\App\RequestInterfacewydaje się to intrygujące - ponieważ sugeruje, że możesz raportować funkcjonalność „za darmo” z tymi siatkami. Jednak bez obszernego safari po kodzie nie jestem pewien, czy to prawda, czy nie, i mam nadzieję, że ktoś ma jasne wytłumaczenie, dlaczego korzystasz z jednej klasy nad drugą.

Alan Storm
źródło
Przy okazji, dobre pytanie, pomogło mi rozwiązać problem z eksportami mojego niestandardowego modułu w adminie. W pewnym sensie użyłem niewłaściwego typu dostawcy danych „Magento \ Ui \ DataProvider \ AbstractDataProvider”.
Sanjay Chaudhary

Odpowiedzi:

14

Dla mnie ta główna różnica polega na tym, że Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderużywa interfejsu API wyszukiwania.

W tej klasie używane są następujące klasy:

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

Które są używane do filtrowania / zamawiania / stronicowania:

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

A także oczywiście do wyszukiwania:

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

Co ciekawe, jeśli Magento/Ui/DataProvider/AbstractDataProviderwspomina o interfejsie API wyszukiwania, ale w ogóle go nie używa:

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

Teraz, jeśli sprawdzisz historię tych plików w GitHub, oto co otrzymasz:

Jak widać, większość zatwierdzeń dla tych dwóch plików jest połączonych z następującym wewnętrznym biletem: MAGETWO-39905: UI components compatibility with Search API

Nawet jeśli zostało to zrobione dla Magento/Frameworkpliku, nigdy nie zostało zrobione dla Magento/Uipliku.

Poza tym nie widzę żadnej różnicy między tymi plikami. Jeden pracuje bezpośrednio nad kolekcją, drugi korzysta z interfejsu API wyszukiwania do generowania wyników.

Raphael at Digital Pianism
źródło