Magento 2: Làm cách nào tôi có thể tải lưới quản trị với các giá trị bộ lọc được xác định trước?


14

Tôi muốn tạo một liên kết đến lưới tùy chỉnh trong quản trị viên của mình bằng các bộ lọc được xác định trước. Lưới được tạo với Thành phần danh sách giao diện người dùng (XML) và nó có một cột được gọi form_idlà thiết lập như thế này:

<column name="form_id">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="filter" xsi:type="string">textRange</item>
            <item name="label" xsi:type="string" translate="true">Form id</item>
        </item>
    </argument>
</column>

Lưới hoạt động tốt. Tôi có thể áp dụng bộ lọc và mọi thứ hoạt động tốt. Lưới được cập nhật độc đáo với yêu cầu XHR.

Tuy nhiên ... tôi muốn có thể có giá trị của bộ lọc được xác định trước tại một số điểm. Ví dụ: tôi muốn có thể mở lưới khi được lọc trên ID = 3.

Vì vậy, tôi đã thử tải trang có cùng tham số URL với yêu cầu XHR, cũng như chỉ cần thêm các tham số bắt buộc duy nhất:

?namespace=form_response_listing&search=&filters[placeholder]=true&filters[form_id][from]=3&filters[form_id][to]=3&paging[pageSize]=20&paging[current]=1

Cũng như:

?filters[form_id][from]=3&filters[form_id][to]=3

Cả hai đều không thành công. Vậy làm cách nào tôi có thể điền trước các bộ lọc bằng cách sử dụng URL?

Biên tập:

Tôi không chắc đây có phải là một bản sao của câu hỏi khác không (như được đề cập trong các bình luận bên dưới). Trong trường hợp của tôi, tôi đang sử dụng một loại ảo làm bộ sưu tập cho lưới của mình:

<virtualType name="Vendor\Module\Model\ResourceModel\Response\Grid\Collection"
             type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
    <arguments>
        <argument name="mainTable" xsi:type="string">vendormodule_form_response</argument>
        <argument name="resourceModel" xsi:type="string">Vendor\Module\Model\ResourceModel\Response</argument>
    </arguments>
</virtualType>

Vì vậy, không phải tôi có lớp Khối vật lý cho tiện ích lưới của mình, nó hoàn toàn được tạo bằng XML liệt kê Thành phần UI.

Tuy nhiên, dù sao tôi cũng sẽ kiểm tra nếu câu hỏi được đề cập sẽ giúp ích cho trường hợp sử dụng của tôi.



2
@RaphaelatDigitalPianism Tôi không nghĩ đây là một bản sao. Câu hỏi bạn liên kết nói về lưới xây dựng theo cách cũ. Một cái gì đó giữa các khối lưới và các thành phần ui. Về cơ bản, đó là thứ mà bạn vẫn có các khối lưới nhưng chúng được cấu hình trong tệp xml thay vì prepareColumnsphương thức.
Marius

Phiếu bầu @Marius rút lại;)
Raphael tại Digital Pianism

1
Tôi đã chỉnh sửa câu hỏi của mình, vì tôi cũng không nghĩ đây là một bản sao (Tôi đã thực hiện nghiên cứu của mình ;-))
Giel Berkers

@Giel Berkers Tôi đang gặp vấn đề tương tự
bhargav shastri

Câu trả lời:


9

Đây là những gì tôi tìm ra cho đến nay.
Điều này không đầy đủ nhưng nó có thể đưa bạn đi đúng hướng.
Tôi đã tiến hành các thử nghiệm của mình bằng cách sửa đổi thành phần ui liệt kê trang cms.
Tôi đã thêm cái này

<item name="filter_url_params" xsi:type="array">
    <item name="page_id" xsi:type="string">*</item>
</item>

trong cms_page_listing.xmlnút dataSource bên trong đối số data / config. Vì vậy, bây giờ nó trông như thế này

<dataSource name="cms_page_listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">Magento\Cms\Ui\Component\DataProvider</argument>
        <argument name="name" xsi:type="string">cms_page_listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">page_id</argument>
        <argument name="requestFieldName" xsi:type="string">id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">page_id</item>
                </item>
                <item name="filter_url_params" xsi:type="array"><!-- my addition -->
                    <item name="page_id" xsi:type="string">*</item>
                </item>
            </item>
        </argument>
    </argument>
</dataSource>

Điều này cho phép tôi gọi url ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
Và tôi chỉ thấy trang có id 2.
Nhưng nó không hoạt động đối với các bộ lọc phạm vi và giá trị bộ lọc không được điền vào. Nó vẫn hiển thị dưới dạng trống.

Bây giờ đây là lý do tại sao điều này là có thể.

Lớp dataProvider cho các trang cms là Magento\Cms\Ui\Component\DataProvider.
Điều này mở rộng Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Cái cuối cùng này chứa một phương thức được bảo vệ gọi làprepareUpdateUrl

protected function prepareUpdateUrl()
{
    if (!isset($this->data['config']['filter_url_params'])) {
        return;
    }
    foreach ($this->data['config']['filter_url_params'] as $paramName => $paramValue) {
        if ('*' == $paramValue) {
            $paramValue = $this->request->getParam($paramName);
        }
        if ($paramValue) {
            $this->data['config']['update_url'] = sprintf(
                '%s%s/%s',
                $this->data['config']['update_url'],
                $paramName,
                $paramValue
            );
            $this->addFilter(
                $this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
            );
        }
    }
}

Điều này làm là kiểm tra cấu hình thành phần ui nếu có một phần tử được gọi filter_url_params. Nếu có, nó sẽ lấy tất cả các giá trị bên trong nó và kiểm tra yêu cầu cho các giá trị khớp với những gì được xác định trong filter_url_params.
Nhưng theo mặc định, nó chỉ hoạt động với eq.

Những gì bạn có thể thử là có một DataSource tùy chỉnh cho thành phần của bạn, nơi bạn viết lại phương thức prepareUpdateUrlvà làm cho nó tính đến tất cả các biến yêu cầu bạn cần và có thể thêm phân trang cho nó và lọc phạm vi.

Lưu ý bên lề: Đây là một câu hỏi rất thú vị. Tôi chắc rằng rất nhiều người sẽ cần điều này trong tương lai.


Cảm ơn bạn @Marius cho câu trả lời của bạn. Điều này phù hợp với tình huống của tôi, vì liên kết luôn cần lọc theo một ID, không phải theo một phạm vi (phạm vi nhiều hơn hoặc ít hơn một tính năng, nhưng không bắt buộc bởi URL của tôi). Câu trả lời cũng như lời giải thích của bạn đã giúp tôi rất nhiều!
Giel Berkers

1
@Marius tôi có thể sử dụng url như thế này không ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, vì tôi đang sử dụng $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])trong UiCompnent / Liệt kê / Cột
anh chàng đơn giản

làm cách nào để sử dụng nhiều hơn một param để lọc, tức là ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> đưa ra ba params trong <item name = "filter_url_params" xsi: type = "mảng"> hoạt động cho các bộ lọc riêng lẻ nhưng không gọi chung.
Shathish

@Marius! CUỘC SỐNG URA KHÔNG BAO GIỜ!
Zorox

@Marius: Bạn có biết không, làm thế nào để sử dụng chức năng cho nhiều url param như ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> như đã được chỉ định bởi Shathish
Ashish Raj
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.