Magento2: store_id nel componente di elenco dell'interfaccia utente


8

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?


Mostra il codice della classe di raccolta.
Sohel Rana,

Il modulo è molto simile al modulo di pagine CMS. Ho copiato una funzione da \ app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php che credo recupera la raccolta per la griglia incluso lo store_id. Sono un po 'un po' noob però quindi potrei sbagliarmi.
Solide,

La raccolta può gestire una tabella (per impostazione predefinita). Se devi unirti a un'altra tabella, devi lavorare con '_afterLoad', '_renderFiltersBefore' e infine aggiungere una mappa.
Sohel Rana,

Ok, ho già ricevuto _afterload e _renderFiltersBefore (ho modificato la domanda). Non sei sicuro di aver già aggiunto una mappa, potresti chiarire questo? Grazie in anticipo.
Solide,

@Solide hai risolto quel problema?
Prashant Valanda,

Risposte:


1

Finalmente ho risolto questo problema. Si è scoperto che avevo due raccolte disponibili per la mia griglia e quella caricata non conteneva l'indice store_id. Per ulteriori informazioni sulle doppie raccolte, consultare: Magento 2: Perché un componente di elenco dell'interfaccia utente necessita di due raccolte?

Per risolvere questo, ho modificato la configurazione di Dependency Injection su /app/code/vendor/module/etc/di.xml

Qui ho sostituito questo:

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

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

Questo si assicura che la mia raccolta da app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php sia usata per la griglia e ora lo store_id con la vista dello store funzioni.


Ciao @ Solide, per favore rispondi se hai
akgola
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.