Magento 2: อะไรคือความแตกต่างระหว่างผู้ให้บริการข้อมูลส่วนประกอบ Grid สองตัว


16

ใน Magento 2.1 มีรายชื่อผู้ให้บริการ UI Component 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

จากข้อมูลนี้ดูเหมือนว่ามีสองคลาสพื้นฐานสำหรับผู้ใช้โปรแกรมเมอร์สามารถใช้ส่วนประกอบพื้นฐานของกริด

  • วีโอไอพี \ Framework \ ดู \ ธาตุ \ UIComponent \ dataprovider \ dataprovider
  • วีโอไอพี \ Ui \ dataprovider \ AbstractDataProvider

Magento\Ui\DataProvider\AbstractDataProviderระดับดูเหมือนจะง่ายของทั้งสองและ (ดูเหมือนว่าจะ?) เพียง แต่ต้องใช้การตั้งค่ารูปแบบทรัพยากรวีโอไอพี Magento\Customer\Ui\Component\DataProviderโมดูลกริดลูกค้าขึ้นอยู่กับคลาสนี้และดูเหมือนว่าจะมีฟังก์ชั่นการเรียงลำดับการกรองและอื่น ๆ ทั้งหมดที่จำเป็นสำหรับการแสดงรายการกริด

มีเหตุผลMagento\Framework\View\Element\UiComponent\DataProvider\DataProviderอยู่หรือไม่หรือเป็นเพียงรหัสเก่า / ใหม่กว่าที่ใช้แนวทางที่แตกต่างในการสร้างผู้ให้บริการข้อมูล กล่าวอีกนัยหนึ่งการใช้Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderคุณลักษณะพิเศษใด ๆ ที่นำมาใช้กับตารางหรือทำให้ส่วนอื่น ๆของระบบทำงานกับตารางได้หรือไม่ ดูซอร์สโค้ดMagento\Framework\App\RequestInterfaceดูเหมือนว่าน่าสนใจเพราะมันบอกเป็นนัย ๆ ว่าคุณอาจรายงานฟังก์ชั่น "ฟรี" กับกริดเหล่านี้ อย่างไรก็ตามหากไม่มีรหัสซาฟารีที่กว้างขวางฉันไม่แน่ใจว่าจริงหรือไม่และฉันหวังว่าจะมีใครบางคนอธิบายอย่างชัดเจนว่าทำไมคุณถึงใช้คลาสหนึ่งเหนือคลาสอื่น


เป็นคำถามที่ดีที่ช่วยให้ฉันแก้ปัญหาการส่งออกสำหรับโมดูลที่กำหนดเองของฉันในผู้ดูแลระบบ ฉันใช้ประเภทดาต้าพาวเดอร์ผิดประเภท "Magento \ Ui \ DataProvider \ AbstractDataProvider"
Sanjay Chaudhary

คำตอบ:


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 เพื่อสร้างผลลัพธ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.