Magento2:UIリストコンポーネントのstore_id


8

UIリストコンポーネントを使用して生成された管理グリッドを持つMagento2拡張機能を開発しています。グリッドには、レコード(ブログアイテムのリスト)が問題なく表示されます。拡張機能により、blog_idをstore_idと一緒に別のデータベーステーブルに保存する特定のストアビューのブログアイテムを保存できます。次に、各ブログアイテムに対して選択されたストアビューを示すブログアイテムのグリッドに列を表示します。

全体の設定は、CMSページおよびcms_page_listing.xmlに非常に似ています。次のようなストアビューの列がblog_listing.xmlにあります。

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

グリッドをロードすると、次のエラーが表示されます:「通知:未定義のインデックス:.. \ vendor \ magento \ module-store \ Ui \ Component \ Listing \ Column \ Store.php in line 82

ブログアイテムのデフォルトのコレクションには実際のstore_idと別のテーブルを介して接続されているため、明らかにstore_idはありません。しかし、私のコレクションは次のようになり、そこにあるはずです: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');
}

だから私の質問は、store_id列を正しいストアビューでレンダリングできるように、ここからどうやって行くのですか?


コレクションクラスコードを表示します。
Sohel Rana

このモジュールは、CMSページモジュールと非常によく似ています。\ app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.phpから、store_idを含むグリッドのコレクションを取得すると思われる関数をコピーしました。私は少し初心者ですが、私は間違っているかもしれません。
Solide

コレクションは1つのテーブルを処理できます(デフォルト)。別のテーブルを結合する必要がある場合は、「_ afterLoad」、「_ renderFiltersBefore」を操作して、最後にマップを追加する必要があります。
Sohel Rana

さて、私はすでに_afterloadと_renderFiltersBeforeを取得しました(質問を編集しました)。私がすでに地図を追加したかどうかわからない、これを明確にしてもらえますか?前もって感謝します。
Solide

@Solideその問題を解決しましたか?
Prashant Valanda 2016年

回答:


1

最後に私はこの問題を解決しました。グリッドで使用できるコレクションが2つあり、読み込まれたコレクションにはstore_idインデックスが含まれていないことがわかりました。ダブルコレクションの詳細については、Magento 2:UIリストコンポーネントに2つのコレクションが必要な理由をご覧ください

これを解決するために、/ app / code / vendor / module / etc / di.xmlで依存性注入構成を編集しました

ここで私はこれを置き換えました:

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

これとともに:

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

これにより、app \ code \ vendor \ module \ Model \ ResourceModel \ AbstractCollection.phpからのコレクションがグリッドに使用され、storeビューのstore_idが機能するようになります。


こんにちはSOLIDE @、任意のアイデアあれば返信してください: magento.stackexchange.com/questions/268344/...
akgola
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.