Magento 2:两个网格组件数据提供者之间有什么区别?


16

在Magento 2.1中,总共配置和使用了25个UI组件列表/网格数据提供程序。他们的数据提供程序类和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 \ Element \ 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”。
Sanjay Chaudhary

Answers:


14

对我来说,主要区别在于Magento/Framework/View/Element/UiComponent/DataProvider/DataProvider使用Search 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提到提及Search 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文件完成过操作。

除此之外,这些文件之间没有任何区别。一种是直接处理集合,另一种是使用Search API生成结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.