You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Magento 2表单中InsertListing选中值无法随表单提交问题

问题:Magento 2模态框勾选客户后数据未随表单提交

问题场景与现象

后台UI表单点击「选择客户」按钮弹出客户列表模态框,预期勾选客户后,客户ID随父表单一同提交,但提交后POST数据中无选中客户的ID信息。示例POST数据如下:

Array
(
    [name] => Tesy
    [ready_to_send] => false
    [message] => test
    [form_key] => bJBYSJKVwlJVVQmA
)

对应的模态框与表单配置XML:

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">
                pillbox_textmessaging_campaigns_add_form.campaigns_add_form_data_source
            </item>
            <item name="deps" xsi:type="string">
                pillbox_textmessaging_campaigns_add_form.campaigns_add_form_data_source
            </item>
        </item>
        <item name="label" xsi:type="string" translate="true">Add New Campaign</item>
        <item name="config" xsi:type="array">
            <item name="dataScope" xsi:type="string">data</item>
            <item name="namespace" xsi:type="string">pillbox_textmessaging_campaigns_add_form</item>
        </item>
        <item name="template" xsi:type="string">templates/form/collapsible</item>
        <item name="buttons" xsi:type="array">
            <item name="save" xsi:type="string">Pillbox\TextMessaging\Block\Adminhtml\Campaigns\Buttons\Save</item>

        </item>
    </argument>
    <dataSource name="campaigns_add_form_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Pillbox\TextMessaging\Model\Campaigns\FormDataProvider</argument>
            <argument name="name" xsi:type="string">campaigns_add_form_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">id</argument>
            <argument name="requestFieldName" xsi:type="string">id</argument>
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="submit_url" xsi:type="url" path="*/*/save"/>
                </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/form/provider</item>
            </item>
        </argument>
    </dataSource>
    <modal name="customers_modal">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">

                <item name="onCancel" xsi:type="string">
                    actionDone
                </item>
                <item name="options" xsi:type="array">
                    <item name="title" xsi:type="string">
                        All Customers
                    </item>
                    <item name="buttons" xsi:type="array">
                        <item name="0" xsi:type="array">
                            <item name="text" xsi:type="string">
                                Selected
                            </item>
                            <item name="class" xsi:type="string">
                                action-primary
                            </item>
                            <item name="actions" xsi:type="array">
                                <item name="0" xsi:type="array">
                                    <item name="targetName" xsi:type="string">
                                        index = customer_listing
                                    </item>
                                    <item name="actionName" xsi:type="string">save</item>
                                </item>
                                <item name="1" xsi:type="string">
                                    closeModal
                                </item>
                            </item>
                        </item>
                    </item>
                </item>
            </item>
        </argument>
        <insertListing name="customer_listing">
            <settings>
                <dataLinks>
                    <exports>false</exports>
                    <imports>true</imports>
                </dataLinks>
                <autoRender>true</autoRender>
                <selectionsProvider>
                    customer_listing.customer_listing.columns.ids
                </selectionsProvider>
                <dataScope>customer_listing</dataScope>
                <ns>customer_listing</ns>
            </settings>
        </insertListing>
    </modal>
    <fieldset name="campaign_information">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="collapsible" xsi:type="boolean">false</item>
                <item name="label" xsi:type="string" translate="true">Campaign Information</item>
                <item name="sortOrder" xsi:type="number">10</item>
            </item>
        </argument>

        <button name="customers_button"
                component="Magento_Ui/js/form/components/button">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">
                        Select Customers
                    </item>
                    <item name="title" xsi:type="string" translate="true">
                        Customers
                    </item>
                    <item name="displayAsLink" xsi:type="boolean">true</item>
                    <item name="labelVisible" xsi:type="boolean">true</item>
                    <item name="template" xsi:type="string">
                        ui/form/components/button/container
                    </item>
                    <item name="actions" xsi:type="array">
                        <item name="0" xsi:type="array">
                            <item name="targetName" xsi:type="string">
                                pillbox_textmessaging_campaigns_add_form.pillbox_textmessaging_campaigns_add_form.customers_modal
                            </item>
                            <item name="actionName" xsi:type="string">
                                toggleModal
                            </item>
                        </item>
                    </item>
                </item>
            </argument>
        </button>
        <field name="name">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Campaign Name</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="sortOrder" xsi:type="number">10</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>

        </field>
        <field name="message">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Message Content</item>
                    <item name="formElement" xsi:type="string">textarea</item>
                    <item name="sortOrder" xsi:type="number">20</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
        </field>
        <htmlContent name="sms_count_html_content">
            <argument name="block" xsi:type="object">
                Pillbox\TextMessaging\Block\Adminhtml\Shared\HtmlContent\TextFormCountHtml
            </argument>
        </htmlContent>
        <field name="ready_to_send" formElement="checkbox">
            <settings>
                <label translate="true">Ready To Send?</label>
                <tooltip>
                    <description translate="true">Check the box if you would like to send the campaign immediately.
                    </description>
                </tooltip>
            </settings>
            <formElements>
                <checkbox>
                    <settings>
                        <prefer>toggle</prefer>
                        <valueMap>
                            <map name="false" xsi:type="boolean">false</map>
                            <map name="true" xsi:type="boolean">true</map>
                        </valueMap>
                    </settings>
                </checkbox>
            </formElements>
        </field>
    </fieldset>
</form>

原因分析

  1. insertListing的dataLinks中exports设为false,导致选中的客户数据无法同步到父表单的数据源
  2. 父表单缺少用于存储选中客户ID的字段,无承载数据的容器,提交时自然不会包含该数据
  3. 模态框「Selected」按钮的save动作目标指向错误,未关联到父表单的数据源,无法将选中数据写入父表单

解决方案

1. 添加隐藏字段存储选中客户ID

在campaign_information字段集中添加隐藏字段,用于承载选中的客户ID数组:

<field name="selected_customers" formElement="input">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="dataType" xsi:type="string">text</item>
            <item name="formElement" xsi:type="string">hidden</item>
            <item name="dataScope" xsi:type="string">selected_customers</item>
        </item>
    </argument>
</field>

2. 修改insertListing配置开启数据导出

调整insertListing的dataLinks和添加exports配置,将选中的ID同步到父表单的隐藏字段:

<insertListing name="customer_listing">
    <settings>
        <dataLinks>
            <exports>true</exports>
            <imports>true</imports>
        </dataLinks>
        <autoRender>true</autoRender>
        <selectionsProvider>customer_listing.customer_listing.columns.ids</selectionsProvider>
        <dataScope>customer_listing</dataScope>
        <ns>customer_listing</ns>
        <!-- 配置导出规则,将选中项同步到父表单的selected_customers字段 -->
        <exports>
            <link name="selected">${ $.provider }:data.selected_customers</link>
        </exports>
    </settings>
</insertListing>

3. 修正模态框按钮的动作目标

将「Selected」按钮的save动作目标改为父表单的数据源,确保数据正确写入:

<item name="0" xsi:type="array">
    <item name="text" xsi:type="string">Selected</item>
    <item name="class" xsi:type="string">action-primary</item>
    <item name="actions" xsi:type="array">
        <item name="0" xsi:type="array">
            <item name="targetName" xsi:type="string">pillbox_textmessaging_campaigns_add_form.campaigns_add_form_data_source</item>
            <item name="actionName" xsi:type="string">save</item>
        </item>
        <item name="1" xsi:type="string">closeModal</item>
    </item>
</item>

4. 初始化表单数据中的选中字段

在表单的FormDataProvider类的getData()方法中初始化selected_customers字段,避免数据加载时缺失:

public function getData()
{
    $data = parent::getData();
    // 初始化选中客户字段,确保字段存在
    if (!isset($data['selected_customers'])) {
        $data['selected_customers'] = [];
    }
    return $data;
}

完成以上修改后,提交表单时POST数据将包含selected_customers字段,值为选中的客户ID数组。

内容的提问来源于stack exchange,提问作者noname

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:21:06