Magento2: store_id in der UI-Listing-Komponente


8

Ich entwickle eine Magento2-Erweiterung mit einem Admin-Raster, das mithilfe der UI-Listing-Komponente generiert wird. Das Raster zeigt die Datensätze (eine Liste von Blog-Elementen) einwandfrei an. Die Erweiterung ermöglicht das Speichern von Blog-Elementen für bestimmte Geschäftsansichten, wodurch die blog_id zusammen mit der store_id in einer separaten Datenbanktabelle gespeichert wird. Jetzt möchte ich eine Spalte im Raster mit Blog-Elementen anzeigen, in der die für jedes Blog-Element ausgewählten Geschäftsansichten angezeigt werden.

Das gesamte Setup ist den CMS-Seiten und cms_page_listing.xml ziemlich ähnlich. In meiner blog_listing.xml befindet sich eine Spalte für die Store-Ansicht wie folgt:

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

Beim Laden des Rasters wird der folgende Fehler angezeigt: " Hinweis: Undefinierter Index: store_id in .. \ vendor \ magento \ module-store \ Ui \ Component \ Listing \ Column \ Store.php in Zeile 82 "

Offensichtlich enthält die Standardauflistung der Blog-Elemente keine store_id, da sie über eine andere Tabelle mit den tatsächlichen store_id verbunden ist. Aber meine Sammlung sieht so aus und sollte sich dort befinden: 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');
}

Meine Frage ist also, wie gehe ich von hier aus vor, damit die Spalte store_id mit den richtigen Speicheransichten gerendert werden kann?


Zeigen Sie Ihren Sammlungsklassencode an.
Sohel Rana

Das Modul ist dem CMS-Seitenmodul sehr ähnlich. Ich habe eine Funktion aus \ app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php kopiert, die meiner Meinung nach die Sammlung für das Raster einschließlich der store_id abruft. Ich bin allerdings ein bisschen noob, also könnte ich mich irren.
Solide

Die Sammlung kann eine Tabelle verarbeiten (standardmäßig). Wenn Sie einer anderen Tabelle beitreten müssen, müssen Sie mit '_afterLoad', '_renderFiltersBefore' arbeiten und schließlich eine Karte hinzufügen.
Sohel Rana

Ok, ich habe bereits _afterload und _renderFiltersBefore (ich habe die Frage bearbeitet). Sie sind sich nicht sicher, ob ich bereits eine Karte hinzugefügt habe. Können Sie dies klarstellen? Vielen Dank im Voraus.
Solide

@ Solide hast du das Problem gelöst?
Prashant Valanda

Antworten:


1

Endlich habe ich dieses Problem gelöst. Es stellte sich heraus, dass mir zwei Sammlungen für mein Raster zur Verfügung standen und die geladene nicht den store_id-Index enthielt. Weitere Informationen zu den Doppelsammlungen finden Sie unter: Magento 2: Warum benötigt eine UI-Listing-Komponente zwei Sammlungen?

Um dies zu lösen, habe ich die Dependency Injection-Konfiguration unter /app/code/vendor/module/etc/di.xml bearbeitet

Hier habe ich das ersetzt:

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

mit diesem:

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

Dadurch wird sichergestellt, dass meine Sammlung aus app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.php für das Raster verwendet wird und jetzt die store_id mit der Store-Ansicht funktioniert.


Hallo @ Solide, bitte antworten Sie, wenn Sie eine Idee haben: magento.stackexchange.com/questions/268344/…
akgola
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.