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.