Magento2: store_id en el componente de listado de UI


8

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?


Muestra tu código de clase de colección.
Sohel Rana

El módulo es muy similar al módulo de páginas CMS. Copié una función de \ app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php que creo que recupera la colección para la cuadrícula, incluido store_id. Aunque soy un poco novato, así que podría estar equivocado.
Solide

La colección puede manejar una tabla (por defecto). Si necesita unirse a otra tabla, debe trabajar con '_afterLoad', '_renderFiltersBefore' y finalmente agregar un mapa.
Sohel Rana

Ok, ya obtuve el _afterload y _renderFiltersBefore (he editado la pregunta). No estoy seguro si ya he agregado un mapa, ¿podría aclarar esto? Gracias de antemano.
Solide

@Solide ¿Has resuelto ese problema?
Prashant Valanda

Respuestas:


1

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:

<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>

con este:

<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>

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.


Hola @ Solide, responda si tiene alguna idea: magento.stackexchange.com/questions/268344/…
akgola
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.