Magento 2: Sự khác biệt giữa hai nhà cung cấp dữ liệu thành phần lưới là gì?


16

Trong Magento 2.1, có 25 nhà cung cấp dữ liệu lưới / danh sách thành phần UI được cấu hình và sử dụng. Các lớp và ui_componenttệp nhà cung cấp dữ liệu của họ được liệt kê bên dưới

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

Dựa trên thông tin này, dường như có hai lớp lập trình viên người dùng cuối có thể sử dụng để dựa trên các thành phần lưới của họ

  • Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ DataProvider
  • Magento \ Ui \ DataProvider \ Tóm tắtDataProvider

Các Magento\Ui\DataProvider\AbstractDataProviderlớp học dường như đơn giản hơn trong hai, và (dường như?) Chỉ yêu cầu cấu hình của một mô hình tài nguyên Magento. Magento\Customer\Ui\Component\DataProviderMô-đun lưới khách hàng dựa trên lớp này và dường như có tất cả chức năng sắp xếp, lọc, v.v. cần thiết cho danh sách lưới.

Có một lý do Magento\Framework\View\Element\UiComponent\DataProvider\DataProvidertồn tại - hay chỉ là mã cũ hơn / mới hơn có cách tiếp cận khác để tạo nhà cung cấp dữ liệu? Nói cách khác, việc sử dụng Magento\Framework\View\Element\UiComponent\DataProvider\DataProvidermang lại bất kỳ tính năng bổ sung nào cho bảng hoặc cho phép các bộ phận khác của hệ thống thực hiện mọi việc với lưới? Nhìn vào mã nguồn, Magento\Framework\App\RequestInterfacedường như hấp dẫn - vì nó ngụ ý là bạn có thể báo cáo chức năng "miễn phí" với những lưới. Tuy nhiên, không có mã safari rộng rãi, tôi không chắc điều đó có đúng hay không và tôi hy vọng ai đó có một lời giải thích rõ ràng về lý do tại sao bạn sử dụng một lớp khác.


Nhân tiện, nó đã giúp tôi giải quyết vấn đề xuất khẩu cho mô-đun tùy chỉnh của mình trong quản trị viên. Tôi đã sử dụng loại Dataprovider sai "Magento \ Ui \ DataProvider \ AbstractDataProvider".
Sanjay Chaudhary

Câu trả lời:


14

Đối với tôi, sự khác biệt chính đó là việc Magento/Framework/View/Element/UiComponent/DataProvider/DataProvidersử dụng API tìm kiếm.

Các lớp sau được sử dụng trong lớp này:

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

Được sử dụng để lọc / đặt hàng / phân trang:

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

Và cũng rõ ràng cho việc tìm kiếm:

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

Thật thú vị nếu điều đó Magento/Ui/DataProvider/AbstractDataProviderđề cập đến API tìm kiếm nhưng hoàn toàn không sử dụng nó:

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

Bây giờ nếu bạn kiểm tra lịch sử của các tệp đó trong GitHub, đây là những gì bạn nhận được:

Như bạn có thể thấy hầu hết các cam kết cho hai tệp đó được liên kết với vé nội bộ sau: MAGETWO-39905: UI components compatibility with Search API

Ngay cả khi nó đã được thực hiện cho Magento/Frameworktập tin, nó chưa bao giờ được thực hiện cho Magento/Uitập tin.

Ngoài ra, tôi không thấy bất kỳ sự khác biệt giữa các tập tin. Một cái đang làm việc trực tiếp trên bộ sưu tập, cái còn lại đang sử dụng API tìm kiếm để tạo kết quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.