Magento 2: В чем разница Между Двумя Поставщиками Данных Компонентов Сетки?
В 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\Фреймворк\Представление\Элемент\Компонент\Поставщик данных\Поставщик данных
- Magento\Пользовательский интерфейс\Поставщик данных\Абстрактный поставщик данных
Класс Magento\Ui\DataProvider\AbstractDataProvider
кажется более простым из двух, и (кажется?) Требуется только конфигурация модели ресурсов Magento. Модуль customer grid Magento\Customer\Ui\Component\DataProvider
основан на этом классе и, похоже, содержит всю сортировку, фильтрацию и т. Д. функциональность, необходимая для отображения таблицы.
Есть ли причина, по которой Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
существует - или это просто более старый/новый код, который использует другой подход к созданию поставщика данных? Другими словами, приносит ли использование Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
какие-либо дополнительные функции в таблицу или позволяет другим частям системы что-то делать с сеткой? Глядя на исходный код, Magento\Framework\App\RequestInterface
кажется интригующим - поскольку это подразумевает, что вы можете сообщать о функциях "бесплатно" с помощью этих сеток. Однако без обширного сафари по коду я не уверен, правда это или нет, и я надеюсь, что у кого-то есть четкое объяснение почему вы предпочитаете один класс другому.
1 answers
Для меня это главное отличие заключается в том, что 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, вот что вы получаете:
- https://github.com/magento/magento2/commits/develop/app/code/Magento/Ui/DataProvider/AbstractDataProvider.php
- https://github.com/magento/magento2/commits/develop/lib/internal/Magento/Framework/View/Element/UiComponent/DataProvider/DataProvider.php
Как вы можете видеть, большинство коммитов для этих двух файлов связаны со следующим внутренним билетом: MAGETWO-39905: UI components compatibility with Search API
Даже если это было сделано для файла Magento/Framework
, это никогда не делалось для файла Magento/Ui
.
Кроме того, я не вижу никакой разницы между этими файлами. Один работает непосредственно над коллекцией, другой использует API поиска для генерации результатов.