Magento2: store_id di Komponen Listing UI

8

Saya sedang mengembangkan ekstensi Magento2 yang memiliki kisi admin yang dihasilkan menggunakan Komponen Daftar UI. Kotak menunjukkan catatan (daftar item blog) dengan baik. Ekstensi memungkinkan untuk menyimpan item blog untuk tampilan toko tertentu yang menyimpan blog_id bersama dengan store_id dalam tabel database terpisah. Sekarang yang ingin saya lakukan adalah menunjukkan kolom di kotak dengan item blog yang menunjukkan tampilan toko yang dipilih untuk setiap item blog.

Seluruh pengaturan sangat mirip dengan halaman CMS dan cms_page_listing.xml. Ada kolom di blog_listing.xml saya untuk tampilan toko seperti ini:

<column name="store_id" class="Magento\Store\Ui\Component\Listing\Column\Store">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>
            <item name="sortable" xsi:type="boolean">false</item>
            <item name="label" xsi:type="string" translate="true">Store View</item>
        </item>
    </argument>
</column>

Saat memuat kisi, kesalahan berikut ditampilkan: " Pemberitahuan: Indeks tidak ditentukan: store_id in .. \ vendor \ magento \ module-store \ Ui \ Component \ Listing \ Column \ Store.php on line 82 "

Jelas tidak ada store_id dalam koleksi default dari item blog karena terhubung melalui tabel lain dengan store_id yang sebenarnya. Tetapi koleksi saya terlihat seperti ini dan seharusnya ada di sana: app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php

protected function performAfterLoadBlog($tableName, $columnName) {
    $items = $this->getColumnValues($columnName);
    if (count($items)) {
        $connection = $this->getConnection();
        $select = $connection->select()->from(['blog_entity_store' => $this->getTable($tableName)])
            ->where('blog_entity_store.' . $columnName . ' IN (?)', $items);
        $result = $connection->fetchPairs($select);
        if ($result) {
            foreach ($this as $item) {
                $entityId = $item->getData($columnName);
                if (!isset($result[$entityId])) {
                    continue;
                }
                if ($result[$entityId] == 0) {
                    $stores = $this->storeManager->getStores(false, true);
                    $storeId = current($stores)->getId();
                    $storeCode = key($stores);
                } else {
                    $storeId = $result[$item->getData($columnName)];
                    $storeCode = $this->storeManager->getStore($storeId)->getCode();
                }
                $item->setData('_first_store_id', $storeId);
                $item->setData('store_code', $storeCode);
                $item->setData('store_id', [$result[$entityId]]);
            }
        }
    }
}

protected function joinStoreRelationTable($tableName, $columnName) {
        if ($this->getFilter('store')) {
            $this->getSelect()->join(
                ['store_table' => $this->getTable($tableName)],
                'main_table.' . $columnName . ' = store_table.' . $columnName,
                []
            )->group(
                'main_table.' . $columnName
            );
        }
        parent::_renderFiltersBefore();
    }

\ app \ code \ vendor \ module \ Model \ ResourceModel \ Blog \ Collection.php

protected function _afterLoad()  {
    $this->performAfterLoadBlog('vendor_module_store', 'blog_id');
    $this->_previewFlag = false;

    return parent::_afterLoad();
}

protected function _renderFiltersBefore() {
    $this->joinStoreRelationTable('vendor_module_store', 'blog_id');
}

Jadi pertanyaan saya adalah, bagaimana cara saya pergi dari sini sehingga kolom store_id dapat dirender dengan tampilan toko yang benar?

Solide
sumber
Tunjukkan kode kelas koleksi Anda.
Sohel Rana
Modul ini sangat mirip dengan modul halaman CMS. Saya telah menyalin fungsi dari \ app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php yang saya percaya mengambil koleksi untuk grid termasuk store_id. Saya agak noob jadi saya mungkin salah.
Solide
Koleksi dapat menangani satu tabel (secara default). Jika Anda perlu bergabung dengan tabel lain maka Anda harus bekerja dengan '_afterLoad', '_renderFiltersBefore' dan akhirnya menambahkan peta.
Sohel Rana
Ok, saya sudah mendapatkan _afterload dan _renderFiltersBefore (saya telah mengedit pertanyaan). Tidak yakin jika saya sudah menambahkan peta, dapatkah Anda menjelaskannya? Terima kasih sebelumnya.
Solide
@ Solide sudahkah Anda menyelesaikan masalah itu?
Prashant Valanda

Jawaban:

1

Akhirnya saya telah memecahkan masalah ini. Ternyata saya memiliki dua koleksi yang tersedia untuk kisi saya dan satu yang dimuat tidak mengandung indeks store_id. Untuk informasi lebih lanjut tentang koleksi ganda, lihat: Magento 2: Mengapa Komponen Daftar UI membutuhkan Dua Koleksi?

Untuk mengatasi ini saya telah mengedit konfigurasi Injeksi Ketergantungan di /app/code/vendor/module/etc/di.xml

Di sini saya mengganti ini:

<virtualType name="Vendor\Module\Model\ResourceModel\Blog\Grid\Collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
<arguments>
    <argument name="mainTable" xsi:type="string">vendor_module_blog</argument>
    <argument name="resourceModel" xsi:type="string">Vendor\Module\Model\ResourceModel\Blog</argument>
</arguments>

dengan ini:

<type name="Vendor\Module\Model\ResourceModel\Blog\Grid\Collection">
<arguments>
    <argument name="mainTable" xsi:type="string">vendor_module_blog</argument>
    <argument name="eventPrefix" xsi:type="string">module_blog_grid_collection</argument>
    <argument name="eventObject" xsi:type="string">module_grid_collection</argument>
    <argument name="resourceModel" xsi:type="string">Vendor\Module\Model\ResourceModel\Blog</argument>
</arguments>

Ini memastikan koleksi saya dari app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php digunakan untuk kisi dan sekarang store_id dengan tampilan toko berfungsi.

Solide
sumber
Halo @ Solide, Harap balas jika ada ide: magento.stackexchange.com/questions/268344/…
akgola