Sto sviluppando un'estensione Magento2 che ha una griglia di amministrazione che viene generata utilizzando il componente di elenco dell'interfaccia utente. La griglia mostra i record (un elenco di elementi del blog) bene. L'estensione consente di salvare gli elementi del blog per specifiche visualizzazioni dello store che salva blog_id insieme a store_id in una tabella di database separata. Ora quello che vorrei fare è mostrare una colonna nella griglia con gli articoli del blog che mostra le visualizzazioni del negozio selezionate per ogni elemento del blog.
L'intero setup è abbastanza simile alle pagine CMS e cms_page_listing.xml. C'è una colonna nel mio blog_listing.xml per la vista dello store in questo modo:
<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>
Durante il caricamento della griglia viene visualizzato il seguente errore: " Avviso: indice indefinito: store_id in .. \ vendor \ magento \ module-store \ Ui \ Component \ Listing \ Column \ Store.php sulla riga 82 "
Ovviamente non c'è store_id nella raccolta predefinita degli articoli del blog in quanto è collegato attraverso un'altra tabella con gli effettivi store_id. Ma la mia collezione è così e dovrebbe essere lì: 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 \ modello \ 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');
}
Quindi la mia domanda è: come posso passare da qui in modo che la colonna store_id possa essere visualizzata con le viste store corrette?