Je développe une extension Magento2 qui a une grille d'administration qui est générée à l'aide du composant de liste d'interface utilisateur. La grille affiche très bien les enregistrements (une liste d'articles de blog). L'extension permet d'enregistrer des éléments de blog pour des vues de magasin spécifiques, ce qui enregistre le blog_id avec le store_id dans une table de base de données distincte. Maintenant, ce que je voudrais faire, c'est afficher une colonne dans la grille avec des articles de blog qui montre les vues du magasin sélectionnées pour chaque article de blog.
L'ensemble de la configuration est assez similaire aux pages CMS et cms_page_listing.xml. Il y a une colonne dans mon blog_listing.xml pour la vue du magasin comme ceci:
<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>
Lors du chargement de la grille, l'erreur suivante s'affiche: " Remarque: index non défini: store_id dans .. \ vendor \ magento \ module-store \ Ui \ Component \ Listing \ Column \ Store.php sur la ligne 82 "
Évidemment, il n'y a pas de store_id dans la collection par défaut des articles de blog car il est connecté via une autre table avec les store_id réels. Mais ma collection ressemble à ceci et elle devrait y être: 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');
}
Donc ma question est, comment puis-je aller à partir d'ici pour que la colonne store_id puisse être rendue avec les vues de magasin correctes?