Magento 2: Яка різниця між двома постачальниками даних компонентної сітки?


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 \ Перегляд \ Елемент \ 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 пошуку для створення результатів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.