如何将数据传递到另一个ui组件DataProvider


9

我有一个网格UI组件,它位于某些已编辑表单的字段集中。我需要将一个entity_id从编辑表单传递到网格,在网格中我可以按某个值过滤某些项的集合,并且网格将显示适当的结果。我使用insertListing组件创建了网格组件。

<insertListing name="slide_grid">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="autoRender" xsi:type="boolean">true</item>
                <item name="source" xsi:type="string">slide</item>
                <item name="loading" xsi:type="boolean">true</item>
                <item name="dataScope" xsi:type="string">some_slider_slide_listing</item>
                <item name="externalProvider" xsi:type="string">${ $.ns }.some_slider_slide_listing_data_source</item>
                <item name="ns" xsi:type="string">some_slider_slide_listing</item>
                <item name="externalData" xsi:type="string">id</item>
                <item name="imports" xsi:type="array">
                    <item name="slider_id" xsi:type="string">${ $.provider }:data.entity_id</item>
                </item>
                <item name="exports" xsi:type="array">
                    <item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
                </item>
            </item>
        </argument>
    </insertListing>

为了将数据传输到外部dataProvider,我正在使用

<item name="exports" xsi:type="array">
                <item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
            </item>

在我的外部数据提供程序内部,我尝试通过请求获取数据。

$this->request->getParam('slider_id');

但是什么都没有。在前端,我发现Magento发送带有我的参数的ajax请求,但是我无法在DataProvider中捕获它并筛选集合。


我从Magento 2核心代码中获得的方法(例如在产品CustomOptions形式的Modifier中)。但是由于某种原因,它对我不起作用。
Mistery '17

您有解决问题的任何方法吗...我也面临着同样的问题,如果您解决了,请提供帮助...
Ashish Raj

我做了一个和你一样的insertListing标签,但是ajax请求的exports标签中没有我的参数....找到了解决方案吗?
thanhdv2811

Answers:


2

对于通过父ui组件的参数添加插入列表,我们可以使用以下代码。

这里externalProvider的标签是我们要插入的上市添加源提供。

这里的imports标记用于当前表单数据源的导入参数

这里的exports标记用于将当前表单数据参数导出到要插入的列表中。

<insertListing name="slide_grid">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="autoRender" xsi:type="boolean">true</item>
            <item name="ns" xsi:type="string">slide_grid</item><-- data source of the inserted listing -->
            <item name="externalProvider" xsi:type="string">colors_one_listing.colors_one_listing_data_source</item><!-- your insert listing data provider source -->
            <item name="imports" xsi:type="array">
                <item name="spd_id" xsi:type="string">${ $.provider }:data.slider_id</item>
            </item>
            <item name="exports" xsi:type="array">
                <item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
            </item>
        </item>
    </argument>
</insertListing>

将具有相关列的联接添加到当前集合中以使其通过两种方式使用:

  1. 按网格数据源>参数名称>“ dataProvider”>参数名称>“数据”>项目名称“ config”>项目名称=“ filter_url_params” =>项目名称>“ slider_id”进行过滤

有关更多详细信息,请检查以下代码:

<dataSource name="..._listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">...\...\Ui\DataProvider\...\Grid\...DataProvider</argument>
        <argument name="name" xsi:type="string">..._listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">id</argument>
        <argument name="requestFieldName" xsi:type="string">slider_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="filter_url_params" xsi:type="array">
                    <item name="slider_id" xsi:type="string">*</item>
                </item>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">id</item>
                </item>
            </item>
        </argument>
    </argument>
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
        </item>
    </argument>
</dataSource>
  1. 过滤插入列表的数据提供程序。

在数据提供程序中,为此参数添加过滤器:

$collection->addFieldToFilter('slider_id', $this->request->getParam('slider_id'));

我喜欢遵循选项1。


dataProvider在定义中没有filter_url_params参数。请更新您的答案。
米开朗基罗

1

在阅读并调试了Magento 2核心文件之后,我找到了一个关于此问题的干净简单的解决方案使用UIComponent insertListing将数据从自定义表单传递到自定义网格非常困难,而且根本没有记录。

在此处输入图片说明

InsertListing对象在标签下有两个参数:我在清单中使用的导出和导入:

<fieldset name="relatedto" >
    <settings>
        <label>Related to</label>
        <componentType>fieldset</componentType>
    </settings>

    <insertListing name="threadrelated_listing">
        <settings>
            <dataLinks>
                <exports>false</exports>
                <imports>true</imports>
            </dataLinks>
            <externalProvider>mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_listing_data_source</externalProvider>
            <selectionsProvider>mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_columns.ids</selectionsProvider>
            <autoRender>true</autoRender>
            <dataScope>mycompany_helpdesk_threadrelated_listing</dataScope>
            <ns>mycompany_helpdesk_threadrelated_listing</ns>
            <exports>
                <link name="ticket_id">${ $.externalProvider }:params.ticket_id</link>
            </exports>
            <imports>
                <link name="ticket_id">${ $.provider }:data.ticket_id</link>
            </imports>
        </settings>
    </insertListing>
</fieldset>

经过数小时的了解和在网上找到解决方案后,我没有发现任何线索!

因此,我阅读了Magento Core文件,并且发现Magento网格化了在项目中创建嵌套列表网格的方式。有时它使用旧的块插入方法,而很少使用新的UIComponent列表方法。

我在customer_address_listing.xml(/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml)上找到了客户地址列表网格,它获取了customer_form.xml(/ vendor / magento)中定义的parent_id变量。 /module-customer/view/base/ui_component/customer_form.xml),但问题是:

Magento如何将数据从表单传递到嵌套列表网格?

Magento通过QUERYSTRING参数传递数据!

如果您阅读DataProvider.php文件,您会感到惊讶,因为它通过QUERYSTRING获得了parent_id(客户)变量!查看/vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php第58行:

/**
 * Add country key for default billing/shipping blocks on customer addresses tab
 *
 * @return array
 */
public function getData(): array
{
    $collection = $this->getCollection();
    $data['items'] = [];
    if ($this->request->getParam('parent_id')) {
        $collection->addFieldToFilter('parent_id', $this->request->getParam('parent_id'));
        $data = $collection->toArray();
    }
    foreach ($data['items'] as $key => $item) {
        if (isset($item['country_id']) && !isset($item['country'])) {
            $data['items'][$key]['country'] = $this->countryDirectory->loadByCode($item['country_id'])->getName();
        }
    }

    return $data;
}

但是如何在listinggrid URL中设置参数?我已经找到了filterUrlParams参数,但是这里也有一个奇怪的问题!让我们看一下这段数据源代码片段:

<dataSource name="mycompany_helpdesk_threadrelated_listing_data_source" component="Magento_Ui/js/grid/provider">
    <settings>
        <filterUrlParams>
            <param name="ticket_id">*</param>
        </filterUrlParams>
        <storageConfig>
            <param name="indexField" xsi:type="string">threadrelated_id</param>
        </storageConfig>
        <updateUrl path="mui/index/render"/>
    </settings>
    <dataProvider class="mycompany\Helpdesk\Ui\DataProvider\Threadrelated\ThreadRelatedDataProvider" name="mycompany_helpdesk_threadrelated_listing_data_source">
        <settings>
            <requestFieldName>id</requestFieldName>
            <primaryFieldName>threadrelated_id</primaryFieldName>
        </settings>
    </dataProvider>
</dataSource>

我用通配符(*)设置了ticket_id,这意味着:获取所有票证!但是,如果您未在filterUrlParams中设置任何ID,则insertListing URL没有任何ticket_id SET!所以为什么?!

@ hashish-raj提供的解决方案对我不起作用。

这些都是我已阅读的有关此问题的所有文章:

最后,我发现了使用核心会话的临时解决方法,并将ticket_id参数存储在会话中。然后在自定义数据提供程序中进行检查,并将其应用于集合:

/***
 * @return array
 */
public function getData()
{

    $collection = $this->getSearchResult();

    /** see: check Mycompany\Helpdesk\Controller\Adminhtml\Ticket\Edit **/
    if($this->coreSession->getTicketId()){
        $collection->addFieldToFilter('ticket_id', ['eq' => $this->coreSession->getTicketId()]);
    }

    return $this->searchResultToOutput($collection);

}

如果您有解决方法,或者您已了解Magento如何处理UIComponent之间的这种关系,请分享您的知识!

我在这里打开了一个“赏金”:https : //magento.stackexchange.com/a/306537/2004

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.