Magento 2: Apa Perbedaan Antara Dua Penyedia Data Komponen Grid?

16

Di Magento 2.1, ada 25 total penyedia Komponen UI daftar / data grid yang dikonfigurasi dan digunakan. Kelas dan ui_componentfile penyedia data mereka tercantum di bawah ini

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

Berdasarkan informasi ini, tampaknya ada dua kelas dasar yang dapat digunakan oleh pemrogram pengguna akhir untuk mendasarkan komponen kisi mereka

  • Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ DataProvider
  • Magento \ Ui \ DataProvider \ AbstractDataProvider

The Magento\Ui\DataProvider\AbstractDataProviderkelas tampaknya sederhana dari dua, dan (tampaknya?) Hanya membutuhkan konfigurasi dari model sumber daya Magento. Magento\Customer\Ui\Component\DataProviderModul kisi pelanggan didasarkan pada kelas ini, dan tampaknya memiliki semua fungsi penyortiran, pemfilteran, dll. Yang diperlukan untuk daftar kisi.

Apakah ada alasan yang Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderada - atau hanya kode lama / baru yang mengambil pendekatan berbeda untuk membuat penyedia data? Dengan kata lain, apakah menggunakan Magento\Framework\View\Element\UiComponent\DataProvider\DataProvidermembawa fitur tambahan ke meja, atau mengaktifkan bagian lain dari sistem untuk melakukan sesuatu dengan grid? Melihat kode sumber, Magento\Framework\App\RequestInterfacesepertinya menarik - karena ini menyiratkan Anda mungkin melaporkan fungsionalitas "gratis" dengan kisi-kisi ini. Namun, tanpa safari kode yang luas, saya tidak yakin apakah itu benar atau tidak, dan saya berharap seseorang memiliki penjelasan yang jelas tentang mengapa Anda akan menggunakan satu kelas di atas yang lain.

Alan Storm
sumber
Pertanyaan yang bagus, itu membantu saya untuk memecahkan masalah dengan ekspor untuk modul khusus saya di admin. Saya agak menggunakan tipe Dataprovider yang salah "Magento \ Ui \ DataProvider \ AbstractDataProvider".
Sanjay Chaudhary

Jawaban:

14

Bagi saya, perbedaan utama adalah Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderpenggunaan API Pencarian.

Kelas-kelas berikut digunakan dalam kelas ini:

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

Yang digunakan untuk memfilter / memesan / paging:

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

Dan juga jelas untuk pencarian:

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

Apa yang menarik jika itu Magento/Ui/DataProvider/AbstractDataProvidermenyebutkan API Pencarian tetapi tidak menggunakannya sama sekali:

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

Sekarang jika Anda memeriksa riwayat file-file di GitHub, inilah yang Anda dapatkan:

Seperti yang Anda lihat sebagian besar komit untuk kedua file tersebut ditautkan dengan tiket internal berikut: MAGETWO-39905: UI components compatibility with Search API

Bahkan jika sudah dilakukan untuk Magento/Frameworkfile itu belum pernah dilakukan untuk Magento/Uifile.

Selain itu saya tidak melihat perbedaan antara file-file itu. Satu sedang bekerja secara langsung pada koleksi, yang lain menggunakan Pencarian API untuk menghasilkan hasil.

Raphael di Digital Pianism
sumber