Magento2: store_id trong Thành phần danh sách giao diện người dùng


8

Tôi đang phát triển tiện ích mở rộng Magento2 có lưới quản trị viên được tạo bằng Thành phần danh sách giao diện người dùng. Lưới hiển thị các bản ghi (một danh sách các mục blog) tốt. Tiện ích mở rộng cho phép lưu các mục blog cho các lượt xem cửa hàng cụ thể giúp lưu blog_id cùng với store_id trong một bảng cơ sở dữ liệu riêng biệt. Bây giờ những gì tôi muốn làm là hiển thị một cột trong lưới với các mục blog hiển thị lượt xem cửa hàng được chọn cho mỗi mục blog.

Toàn bộ thiết lập khá giống với các trang CMS và cms_page_listing.xml. Có một cột trong blog_listing.xml của tôi cho chế độ xem cửa hàng như thế này:

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

Khi tải lưới, lỗi sau được hiển thị: " Lưu ý: Chỉ mục không xác định: store_id in .. \ eller \ magento \ module-store \ Ui \ Thành phần \ Liệt kê \ Cột \ Store.php trên dòng 82 "

Rõ ràng là không có store_id trong bộ sưu tập các mục blog mặc định khi nó được kết nối thông qua một bảng khác với store_id thực tế. Nhưng bộ sưu tập của tôi trông như thế này và nó phải ở trong đó: app \ code \ eller \ 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 \ eller \ 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');
}

Vì vậy, câu hỏi của tôi là, làm thế nào để tôi đi từ đây để cột store_id có thể được hiển thị với chế độ xem cửa hàng chính xác?


Hiển thị mã lớp bộ sưu tập của bạn.
Sohel Rana

Mô-đun này rất giống với mô-đun trang CMS. Tôi đã sao chép một hàm từ \ app \ code \ eller \ module \ Model \ ResourceModel \ AbstractCollection.php mà tôi tin rằng lấy bộ sưu tập cho lưới bao gồm cả store_id. Tôi là một phần của một noob mặc dù vậy tôi có thể sai.
Solide

Bộ sưu tập có thể xử lý một bảng (theo mặc định). Nếu bạn cần tham gia một bảng khác thì bạn cần phải làm việc với '_afterLoad', '_renderFiltersB Before' và cuối cùng thêm bản đồ.
Sohel Rana

Ok, tôi đã có _afterload và _renderFiltersB Before (Tôi đã chỉnh sửa câu hỏi). Không chắc chắn nếu tôi đã thêm một bản đồ, bạn có thể làm rõ điều này? Cảm ơn bạn trước.
Solide

@Solide bạn đã giải quyết vấn đề đó chưa?
Prashant Valanda

Câu trả lời:


1

Cuối cùng tôi đã giải quyết được vấn đề này. Hóa ra tôi đã có sẵn hai bộ sưu tập cho lưới của mình và bộ sưu tập được tải không chứa chỉ mục store_id. Để biết thêm thông tin về các bộ sưu tập kép, hãy xem: Magento 2: Tại sao Thành phần danh sách giao diện người dùng cần hai Bộ sưu tập?

Để giải quyết vấn đề này, tôi đã chỉnh sửa cấu hình Dependency Injection tại /app/code/vendor/module/etc/di.xml

Ở đây tôi đã thay thế điều này:

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

Với cái này:

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

Điều này đảm bảo bộ sưu tập của tôi từ app \ code \ eller \ module \ Model \ ResourceModel \ AbstractCollection.php được sử dụng cho lưới và bây giờ store_id với chế độ xem cửa hàng hoạt động.


Xin chào @ Solide, Vui lòng trả lời nếu có ý tưởng: magento.stackexchange.com/questions/268344/ Kẻ
akgola
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.