Một số lỗi thường gặp khi làm việc với Grid Backend Magento

Error 1: Magento Grid Component not Sorting Correctly
Khi sort trong magento trùng ID trong những lần sort tiếp theo dẫn đến hiển thị sai kết quả không mong muốn:
Bình trường trong file xml UI_component chúng ta cung cấp DataProvider như sau:

<!-- ... -->
<argument name="dataProvider" xsi:type="configurableObject">
    <!-- ... --->
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="update_url" xsi:type="url" path="mui/index/render"/>
        </item>
    </argument>
    <!-- ... -->
</argument>
<!-- ... -->

Để fix lỗi trên chúng ta cung cấp index cho bảng dữ liệu để magento xác định được Id cho mysql khi sort:

<argument name="data" xsi:type="array">
    <item name="config" xsi:type="array">
        <item name="update_url" xsi:type="url" path="mui/index/render"/>
        <item name="storageConfig" xsi:type="array">
            <item name="indexField" xsi:type="string">pulsestorm_commercebug_log_id</item>
        </item>                    

    </item>                          
</argument>

Error 2: Invalid Method name delete in magento 2
Khi bạn massAction dẫn đến lỗi
Exception #0 (Magento\Framework\Exception\LocalizedException): Invalid method Magento\Framework\View\Element\UiComponent\DataProvider\Document::delete
do class sử dụng không đúng với Model của dữ liệu mình cần xóa dẫn đến lỗi không mong muốn:
Đoạn code dẫn đến lỗi Model cần sử dụng không đúng trong file di.xml :

<virtualType name="ProjectFinal\POS\Model\ResourceModel\Grid\Collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
       <arguments>
            <argument name="mainTable" xsi:type="string">pos_staff</argument>
            <argument name="resourceModel" xsi:type="string">ProjectFinal\POS\Model\ResourceModel\Staff</argument>
        </arguments>
    </virtualType>
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="staff_list_data_source" xsi:type="string">ProjectFinal\POS\Model\ResourceModel\Staff\Collection</item>
            </argument>
        </arguments>
    </type>

Cách fix lỗi đơn giản chỉ cần thêm Grid trong path của khai báo xml:

<virtualType name="ProjectFinal\POS\Model\ResourceModel\Staff\Grid\Collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
        <arguments>
            <argument name="mainTable" xsi:type="string">pos_staff</argument>
            <argument name="resourceModel" xsi:type="string">ProjectFinal\POS\Model\ResourceModel\Staff</argument>
        </arguments>
    </virtualType>

    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="staff_list_data_source" xsi:type="string">ProjectFinal\POS\Model\ResourceModel\Staff\Grid\Collection</item>
            </argument>
        </arguments>
    </type>

Error 3: Column value display wrong when export CSV in magento 2 admin UI component grid in magento 2
Khi export một số trường như status thường export ra dữ liệu nguyên thủy là 0 1 2 3 gây khó hiểu cho khách hàng thậm chí là lập trình viên:
Để export là nội dung hiển thị đúng chúng ta cần rewrite lại data trước khi export để thay đổi dữ liệu trước khi export:
Trong file di.xml chúng ta thêm dòng sau đề thực hiện rewrite:

<preference for="Magento\Ui\Model\Export\MetadataProvider" type="ProjectFinal\POS\Model\Export\MetadataProvider" />

Chúng ta cần ghi đề function getRowData() trong vendor/magento/module-ui/Model/Export/MetadataProvider.php như sau:

public function getRowData(DocumentInterface $document, $fields, $options)
{
    $row = [];
    $key = array_search ('status', $fields);
    foreach ($fields as $column) {
        if (isset($options[$column])) {
            $key = $document->getCustomAttribute($column)->getValue();
            if (isset($options[$column][$key])) {
                $row[] = $options[$column][$key];
            } else {
                $row[] = '';
            }
        } else {
            $row[] = $document->getCustomAttribute($column)->getValue();
            if($column == 'status'){
                switch ($row[$key]){
                case 0:
                    $row[$key] = self::STATUS_PENDING;
                    break;
                case 1:
                    $row[$key] = self::STATUS_ACTIVE;
                    break;
                case 2:
                    $row[$key] = self::STATUS_INACTIVE;
                    break;
                case 3:
                    $row[$key] = self::STATUS_DISAPPROVED;
                    break;
                case 4:
                    $row[$key] = self::STATUS_VACATION_MODE;
                    break;
                case 5:
                    $row[$key] = self::STATUS_CLOSED;
                    break;
                }
            }
        }
    }
    return $row;
}

Khi đó export sẽ hiển thị dữ liệu như chúng ta mong muốn khi export.

Trên đây là một số chia sẻ về một số bug mình gặp phải trong quá trình phát triển simple POS.
Mọi người có câu hỏi hay thắc mắc để lại bình luận để chúng ta cùng nhau giải quyết và trao đổi. Cảm ơn mọi người đã ghé qua bài viết của mình.

4 Likes

Bài viết tốt đấy :))) Nhưng đoạn code này cần sửa lại

Chỗ này ko chơi switch case. Mà thường cái status sẽ có một cái source model rồi. Mình gọi lấy all options ra rồi lấy label ứng với value trong mảng ra là được.

Với lưu ý là Magento 2.4 thì ko cần vì nó tự được rồi.

4 Likes

Thank you a đã góp ý