Magento 2 - trường lưới quản trị viên tùy chỉnh - lỗi khi sắp xếp hoặc lọc


9

Tôi đã thêm cột tùy chỉnh vào lưới quản trị, như thế này

<column name="customer_name" class="Vendor\Module\Ui\Component\Listing\Columns\CustomerName">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="filter" xsi:type="string">text</item>
                <item name="editor" xsi:type="string">text</item>
                <item name="sortable" xsi:type="string">true</item>
                <item name="label" xsi:type="string" translate="true">Customer Name</item>
                <item name="sortOrder" xsi:type="number">30</item>
            </item>
        </argument>
    </column>

Trong lớp CustomerName của tôi, tôi tạo các giá trị cho cột này:

public function prepareDataSource(array $dataSource)
{
    $fieldName = $this->getData('name');
    foreach ($dataSource['data']['items'] as & $item) {
        $customer = $this->customerRepository->getById($item['customer_id']);
        $name = $customer ? $customer->getFirstName().' <'.$customer->getEmail().'>' : '';
        $item[$fieldName] = $name;
    }
    return $dataSource;
}

Nó hiển thị trong lưới như mong đợi. Nhưng khi tôi cố gắng sắp xếp theo cột hoặc bộ lọc này - đã xảy ra lỗi

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'customer_name' in 'order clause'

Làm thế nào tôi có thể sửa lỗi này?

CẬP NHẬT

Bây giờ tôi thử giải quyết vấn đề này bằng cách xóa lớp CustomerName (và xóa tham chiếu đến nó trong thẻ cột trong xml) và thay vào đó tôi đã thêm hàm _renderFiltersB Before () trong lớp bộ sưu tập của mình

 protected function _renderFiltersBefore() {
     $joinTable = $this->getTable('customer_entity');
     $this->getSelect()->join($joinTable.' as customer_entity','main_table.customer_id = customer_entity.entity_id', array('*'));
     $this->getSelect()->columns('CONCAT(firstname," <",email,">") as customer_name');
     parent::_renderFiltersBefore();
}

Bây giờ sắp xếp đang hoạt động, nhưng lọc không (nhận cùng một lỗi)

Câu trả lời:


13

Có một phương pháp nhà máy mà bạn có thể sử dụng, và đây là addFilterToMap(). Trong đó bộ lọc kết xuất Magento 2 chỉ thay thế các đối tượng của các điều kiện dựa trên các trường được ánh xạ

bạn có thể gọi nó là một trong hai trong _initSelect hoặc _renderFiltersBefore phương pháp.

cho một cột đơn giản đã có trong lựa chọn (tốt để giải quyết các lỗi mơ hồ)

$this
     ->addFilterToMap('customer_id', 'ce.entity_id');

nhưng trong trường hợp của bạn cần ánh xạ một biểu thức như

$this
    ->addFilterToMap(
       'customer_name ', 
       new \Zend_Db_Expr('CONCAT(ce.firstname," <",ce.email,">")')
    ); 

vì vậy phần điều kiện của truy vấn sẽ ... WHERE (CONCAT(ce.firstname," <",ce.email,">") LIKE '%@yippie.com%') ... thay vì ... WHERE (customer_name LIKE '%@yippie.com%') ...

ngoài ra, bạn có thể sử dụng một phương thức nhà máy liên quan đến bộ sưu tập khác để sử dụng các biểu thức trong SELECTmột phần của truy vấn

$this
    ->addExpressionFieldToSelect(
        'firstname',
        new \Zend_Db_Expr('CONCAT(ce.firstname," <",ce.email,">")'),
        []
    )

thay vì

$this->getSelect()->columns('CONCAT(ce.firstname," <",ce.email,">") as firstname');

Cảm ơn rất nhiều! Đã vật lộn với điều này trong nửa ngày. Bạn đã tìm / học cái này ở đâu? Chắc chắn, không phải trong các tài liệu?
Jāni Elmeris

như bài viết gốc đã đề cập: phải thêm cột tùy chỉnh vào lưới quản trị - với các tùy chọn bộ lọc và sắp xếp.
Mất

Tôi đang cố gắng hiển thị cả gia tăng hóa đơn và đơn đặt hàng trên lưới quản trị mô-đun tùy chỉnh của mình với id gia tăng đơn đặt hàng bán được dán nhãn là 'ordincrementid'. Thậm chí tôi đã sử dụng addFilterToMap (); Tôi không thể lọc đơn đặt hàng tăng gia_id. Nó trả về lỗi này => Cột 'gia tăng_id' trong đó mệnh đề không rõ ràng
Hỏi Byte

6

Phải mất một thời gian, nhưng tôi đã tìm ra điều này

Trong danh sách xml của tôi:

<column name="firstname">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="filter" xsi:type="string">text</item>
                <item name="editor" xsi:type="string">text</item>
                <item name="sortable" xsi:type="string">true</item>
                <item name="label" xsi:type="string" translate="true">Customer Name</item>
                <item name="sortOrder" xsi:type="number">30</item>
            </item>
        </argument>
    </column>

Trong Vendor \ Module \ Model \ ResourceModel \ someCustomModel \ Grid:

/**
 * adding email to customer name column
 */
protected function _initSelect()
{
    parent::_initSelect();
    $this->getSelect()->joinLeft(
        ['ce' => $this->getTable('customer_entity')],
        'main_table.customer_id = ce.entity_id',
        ['*']
    );

    $this->getSelect()->columns('CONCAT(ce.firstname," <",ce.email,">") as firstname');
    return $this;
}

Trong Vendor \ Module \ Model \ ResourceModel \ someCustomModel

/**
 * addding ability to filter by column with customer name and email
 */
protected function _renderFiltersBefore()
{
    $wherePart = $this->getSelect()->getPart(\Magento\Framework\DB\Select::WHERE);
    foreach ($wherePart as $key => $cond) {
        $wherePart[$key] = str_replace('`firstname`', 'CONCAT(firstname," <",email,">")', $cond);
    }
    $this->getSelect()->setPart(\Magento\Framework\DB\Select::WHERE, $wherePart);
    parent::_renderFiltersBefore();
}
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.