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?
sumber
Jawaban:
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:
dengan ini:
Ini memastikan koleksi saya dari app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php digunakan untuk kisi dan sekarang store_id dengan tampilan toko berfungsi.
sumber