Magento 2: В чем разница между двумя поставщиками данных Grid-компонента?

16

В Magento 2.1 сконфигурировано и используется всего 25 провайдеров данных о сетевом интерфейсе и данных. Их классы и ui_componentфайлы провайдера данных перечислены ниже.

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

Основываясь на этой информации, кажется, что конечные пользователи могут использовать два базовых класса, чтобы основывать свои компоненты сетки на

  • Magento \ Framework \ View \ Элемент \ UIComponent \ DataProvider \ DataProvider
  • Magento \ Ui \ DataProvider \ AbstractDataProvider

Magento\Ui\DataProvider\AbstractDataProviderКласс , кажется, проще из двух, и (кажется,?) Требует только конфигурации модели ресурсов Magento. Модуль сетки клиента Magento\Customer\Ui\Component\DataProviderоснован на этом классе и, похоже, обладает всеми функциями сортировки, фильтрации и т. Д., Необходимыми для вывода списка сетки.

Есть ли причина, по которой это Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderсуществует - или это просто старый или более новый код, который использует другой подход к созданию поставщика данных? Другими словами, Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderприносит ли использование дополнительных функций к таблице или позволяет другим частям системы работать с сеткой? Глядя на исходный код, это Magento\Framework\App\RequestInterfaceкажется интригующим - поскольку это подразумевает, что вы можете сообщать о функциональности "бесплатно" с помощью этих сеток. Однако без обширного сафари по коду я не уверен, правда это или нет, и я надеюсь, что у кого-то есть четкое объяснение того, почему вы используете один класс над другим.

Алан Сторм
источник
Хороший вопрос, кстати, он помог мне решить проблему с экспортом для моего пользовательского модуля в админке. Я как бы использовал неправильный тип Dataprovider "Magento \ Ui \ DataProvider \ AbstractDataProvider".
Санджай Чаудхари

Ответы:

14

Для меня это главное отличие заключается в том, что Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderиспользует API поиска.

В этом классе используются следующие классы:

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

Которые используются для фильтрации / упорядочивания / подкачки:

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

А также, очевидно, для поиска:

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

Что интересно, если в нем Magento/Ui/DataProvider/AbstractDataProviderупоминается API поиска, но он вообще не используется:

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

Теперь, если вы проверите историю этих файлов в GitHub, вот что вы получите:

Как видите, большинство коммитов для этих двух файлов связаны со следующим внутренним билетом: MAGETWO-39905: UI components compatibility with Search API

Даже если это было сделано для Magento/Frameworkфайла, оно никогда не было сделано для Magento/Uiфайла.

Кроме того, я не вижу никакой разницы между этими файлами. Один работает непосредственно над коллекцией, другой использует API поиска для генерации результатов.

Рафаэль в цифровом пианизме
источник