Magento2:UI列表组件中的store_id


8

我正在开发一个Magento2扩展,该扩展具有使用UI列表组件生成的管理网格。网格可以很好地显示记录(博客项目列表)。该扩展允许保存特定商店视图的博客项目,从而将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>

加载网格时,显示以下错误:“ 注意:未定义的索引:第82行的.. \ vendor \ magento \ module-store \ Ui \ Component \ Listing \ Column \ Store.php中的store_id

显然,博客项目的默认集合中没有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的网格检索集合。我虽然有点菜鸟,所以我可能是错的。
固体

集合可以处理一张表(默认情况下)。如果需要连接另一个表,则需要使用“ _afterLoad”,“ _ renderFiltersBefore”并最终添加一个映射。
Sohel Rana

好的,我已经有了_afterload和_renderFiltersBefore(我已经编辑了问题)。不知道我是否已经添加地图,您能澄清一下吗?先感谢您。
Solide

@Solide解决了这个问题吗?
Prashant Valanda '16

Answers:


1

终于我解决了这个问题。原来,我有两个可用于我的网格的集合,并且已加载的集合不包含store_id索引。有关double集合的更多信息,请参见:Magento 2:为什么UI列表组件需要两个Collection?

为了解决这个问题,我在/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_id起作用了。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.