Magento 2: ฉันจะโหลดกริด admin ด้วยค่าตัวกรองที่กำหนดไว้ล่วงหน้าได้อย่างไร


14

ฉันต้องการสร้างลิงค์ไปยังกริดที่กำหนดเองในผู้ดูแลระบบของฉันด้วยตัวกรองที่กำหนดไว้ล่วงหน้า กริดนั้นสร้างขึ้นด้วย UI Listing Component (XML) และมีคอลัมน์ที่เรียก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

ดังนั้นฉันจึงลองโหลดหน้าเว็บที่มีพารามิเตอร์ URL เดียวกับคำขอ XHR รวมถึงเพียงเพิ่มพารามิเตอร์ที่จำเป็นเท่านั้น:

?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 Component list XML

อย่างไรก็ตามฉันจะตรวจสอบว่าคำถามที่อ้างถึงจะช่วยกรณีการใช้งานของฉันหรือไม่



2
@RaphaelatDigitalPianism ฉันไม่คิดว่ามันจะซ้ำกัน คำถามที่คุณเชื่อมโยงพูดถึงเกี่ยวกับกริดสร้างในแบบเก่า บางสิ่งบางอย่างระหว่างบล็อกกริดและ ui- ส่วนประกอบ โดยทั่วไปมันเป็นสิ่งที่คุณยังมีบล็อกกริดอยู่ แต่มันถูกกำหนดค่าในไฟล์ xml แทนที่จะเป็นprepareColumnsวิธี
Marius

@Marius โหวตถอนคืน))
Raphael ที่ Digital Pianism

1
ฉันแก้ไขคำถามของฉันเนื่องจากฉันไม่คิดว่านี่เป็นของซ้ำ (ฉันได้ทำการวิจัยของฉันแล้ว ;-))
Giel Berkers

@Giel Berkers ฉันได้รับปัญหาเดียวกัน
bhargav shastri

คำตอบ:


9

นี่คือสิ่งที่ฉันค้นพบ
สิ่งนี้ยังไม่สมบูรณ์ แต่สามารถพาคุณไปในเส้นทางที่ถูกต้อง
ฉันทำการทดสอบโดยแก้ไขส่วนประกอบของรายการ UI ของหน้า ui
ฉันเพิ่มสิ่งนี้

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

ในcms_page_listing.xmlภายในโหนด dataSource ภายในอาร์กิวเมนต์ data / config ดังนั้นตอนนี้ดูเหมือนว่านี้

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

นี้จะช่วยให้ฉันโทรหาที่ ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2url
และฉันเห็นเฉพาะหน้าเว็บที่มี id 2
แต่มันไม่ทำงานสำหรับตัวกรองช่วงและค่าตัวกรองจะไม่ถูกกรอกข้อมูลมันยังแสดงเป็นช่องว่าง

ตอนนี้นี่คือเหตุผลที่เป็นไปได้

ชั้น 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

สิ่งที่คุณสามารถลองได้คือมีแหล่งข้อมูลที่กำหนดเองสำหรับส่วนประกอบของคุณที่คุณเขียนวิธีใหม่prepareUpdateUrlและทำให้คำนึงถึงตัวแปรคำขอทั้งหมดที่คุณต้องการและอาจเพิ่มเพจจิ้งและช่วงการกรอง

หมายเหตุด้านข้าง: นี่เป็นคำถามที่น่าสนใจมาก ฉันแน่ใจว่าผู้คนจำนวนมากจะต้องการสิ่งนี้ในอนาคต


ขอบคุณ @Marius สำหรับคำตอบของคุณ สิ่งนี้ใช้ได้กับสถานการณ์ของฉันเนื่องจากลิงก์จำเป็นต้องกรองตาม ID เดียวเสมอไม่ใช่ตามช่วง (ช่วงนั้นมีคุณสมบัติมากหรือน้อย แต่ไม่จำเป็นต้องใช้ URL ของฉัน) คำตอบและคำอธิบายของคุณช่วยฉันได้มาก!
Giel Berkers

1
@Marius ฉันสามารถใช้ url เช่นนี้ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>ได้เพราะฉันใช้$this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])ใน UiCompnent / Listing / Column
ผู้ชายธรรมดา

ฉันจะใช้มากกว่าหนึ่ง param ในการกรองได้อย่างไรเช่น ROOT / admin / cms / หน้า / ดัชนี / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> ให้สาม params ภายใต้ <item name = "filter_url_params" xsi: type = "array"> ใช้งานได้สำหรับตัวกรองแต่ละตัว แต่ไม่สามารถใช้ร่วมกันได้
Shathish

@Marius! ประหยัดชีวิต!
Zorox

@Marius: คุณมีความคิดวิธีการใช้ฟังก์ชั่นสำหรับหลายพารามิเตอร์ URL เช่น ROOT / admin / cms / หน้า / ดัชนี / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> เป็น ระบุโดย Shathish
Ashish Raj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.