Estoy desarrollando una extensión de Magento2 que tiene una grilla de administración que se genera usando el Componente de listado de UI. La cuadrícula muestra los registros (una lista de elementos de blog) muy bien. La extensión permite guardar elementos de blog para vistas específicas de la tienda, lo que guarda el blog_id junto con el store_id en una tabla de base de datos separada. Ahora, lo que me gustaría hacer es mostrar una columna en la cuadrícula con elementos del blog que muestre las vistas de la tienda seleccionadas para cada elemento del blog.
Toda la configuración es bastante similar a las páginas de CMS y cms_page_listing.xml. Hay una columna en mi blog_listing.xml para la vista de la tienda como esta:
<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>
Al cargar la cuadrícula, se muestra el siguiente error: " Aviso: índice no definido: store_id en .. \ vendor \ magento \ module-store \ Ui \ Component \ Listing \ Column \ Store.php en la línea 82 "
Obviamente, no hay store_id en la colección predeterminada de los elementos del blog, ya que está conectado a través de otra tabla con los store_id reales. Pero mi colección se ve así y debería estar allí: 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');
}
Entonces mi pregunta es, ¿cómo voy desde aquí para que la columna store_id se pueda representar con las vistas correctas de la tienda?
fuente
Respuestas:
Finalmente he resuelto este problema. Resultó que tenía dos colecciones disponibles para mi grilla y la que estaba cargada no contenía el índice store_id. Para obtener más información sobre las colecciones dobles, consulte: Magento 2: ¿Por qué un componente de listado de IU necesita dos colecciones?
Para resolver esto, he editado la configuración de Inyección de dependencias en /app/code/vendor/module/etc/di.xml
Aquí reemplacé esto:
con este:
Esto asegura que mi colección de app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php se use para la cuadrícula y ahora funcione el store_id con la vista de la tienda.
fuente