마 젠토 2 : 사전 정의 된 필터 값으로 관리 그리드를로드하려면 어떻게해야합니까?


14

사전 정의 된 필터를 사용하여 관리자의 사용자 지정 그리드에 대한 링크를 만들고 싶습니다. 그리드는 XML (UI Listing Component)로 만들어지며 다음과 form_id같이 설정 되는 열 이 있습니다.

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

그리드는 잘 작동합니다. 필터를 적용하면 모든 것이 잘 작동합니다. 그리드는 XHR 요청으로 멋지게 업데이트됩니다.

그러나 ... 어떤 시점에서 필터 값을 미리 정의하고 싶습니다. 예를 들어, ID = 3에서 필터링 될 때 그리드를 열 수 있기를 원합니다.

그래서 이미 XHR 요청과 동일한 URL 매개 변수를 사용하여 페이지를로드하고 단순히 필요한 매개 변수를 추가하려고했습니다.

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

만큼 잘:

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

둘 다 성공하지 못했습니다. URL을 사용하여 어떻게 필터를 미리 채울 수 있습니까?

편집하다:

이것이 다른 질문과 중복되는지 확실하지 않습니다 (아래 의견에서 언급했듯이). 필자의 경우 그리드 유형으로 가상 유형을 사용하고 있습니다.

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

따라서 그리드 위젯을위한 물리적 블록 클래스가있는 것이 아니라 순수하게 UI 구성 요소 목록 XML로 생성됩니다.

그럼에도 불구하고 언급 된 질문이 내 사용 사례에 도움이되는지 확인하겠습니다.



2
@RaphaelatDigitalPianism 나는 이것이 중복이라고 생각하지 않습니다. 그리드에 관한 대화를 연결 한 질문은 구식 방식으로 구축됩니다. 그리드 블록과 UI 구성 요소 사이에 있습니다. 기본적으로 여전히 그리드 블록이 있었지만 prepareColumns메소드 대신 xml 파일로 구성되었습니다 .
Marius

@Marius 투표 철회;)
디지털

1
나는이 중복 (내 연구를했습니다 ;-)) 생각하지 않기 때문에 나는 나의 질문을 편집
Giel Berkers

@Giel Berkers 나는 같은 문제가 무엇입니까
bhargav 샤 스트리

답변:


9

여기까지 내가 찾은 것이 있습니다.
이것은 완전하지는 않지만 올바른 길로 안내 할 수 있습니다.
UI 구성 요소를 나열하는 cms 페이지를 수정하여 테스트를 수행했습니다.
나는 이것을 추가했다

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

에서 cms_page_listing.xml의 데이터 / 설정 인수 내부 데이터 소스 노드 안에. 자 이제 이렇게 보입니다

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

이를 통해 url을 호출 할 수 있습니다 ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
그리고 ID 2가있는 페이지 만 보입니다.
범위 필터에는 작동하지 않으며 필터 값이 채워지지 않습니다. 여전히 공백으로 표시됩니다.

이제 이것이 가능한 이유입니다.

cms 페이지의 dataProvider 클래스는 Magento\Cms\Ui\Component\DataProvider입니다.
이것은 확장됩니다 Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
이 마지막에는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()
            );
        }
    }
}

이것이하는 요소는이라는 요소가 있는지 UI 구성 요소 구성을 확인하는 것입니다 filter_url_params. 있으면 내부의 모든 값을 가져와에 정의 된 것과 일치하는 값이 있는지 요청을 확인합니다 filter_url_params.
그러나 기본적으로는eq .

시도 할 수있는 것은 메소드를 다시 작성하는 구성 요소에 대한 사용자 정의 dataSource를 갖는 것입니다. prepareUpdateUrl 필요한 모든 요청 변수를 고려하고 페이징을 추가하고 범위 필터링을 수행하는 것입니다.

참고 : 이것은 매우 흥미로운 질문입니다. 앞으로 많은 사람들이 이것을 필요로 할 것입니다.


귀하의 답변에 대한 @Marius 감사합니다. 이것은 링크가 항상 범위가 아닌 하나의 ID로 필터링해야하기 때문에 (범위는 다소 기능이지만 URL에 필요하지 않음) 내 상황에서 작동합니다. 당신의 대답과 당신의 설명은 저에게 많은 도움이되었습니다!
Giel Berkers

1
@Marius는 UiCompnent / Listing / Column에서 ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>사용 $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])하고 있기 때문에 이와 같은 URL을 사용할 수 있습니다.
간단한 사람

하나 이상의 매개 변수를 사용하여 필터링하는 방법 (예 : ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> <item name = "filter_url_params"아래에 세 개의 매개 변수 제공) xsi : type = "array">는 개별 필터에 대해 작동하지만 전체적으로 작동하지는 않습니다.
Shathish

@ 마리우스! 우라 라이프 세이버!
Zorox

@Marius : ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌val3 / key / <form_key_h‌e>와 같은 다중 URL 매개 변수 기능을 사용하는 방법을 알고 있습니까? 이미 Shathish에 의해 지정된
인 Ashish 라즈에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.