2

I am trying to create dynamicrow filed in admin form vs ui_component (xml).

for example: the dynamic row i am trying to achieve

enter image description here

i add the dynamic row component and it looks like in the image above. after set data and save the data, the data successful saved in db as JSON formatted, but the dynamic row don't get the data back after save.

the dynamic row component:

<dynamicRows name="Params" sortOrder="1" >
    <settings>
        <addButtonLabel translate="true">Add Value</addButtonLabel>
        <additionalClasses>
            <class name="admin__field-wide">false</class>
        </additionalClasses>
        <componentType>dynamicRows</componentType>
        <dndConfig>
            <param name="enabled" xsi:type="boolean">false</param>
        </dndConfig>
    </settings>
    <container name="record" component="Magento_Ui/js/dynamic-rows/record">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="isTemplate" xsi:type="boolean">true</item>
                <item name="is_collection" xsi:type="boolean">true</item>
                <item name="component" xsi:type="string">Magento_Ui/js/dynamic-rows/record</item>
                <item name="componentType" xsi:type="string">container</item>
                <item name="dataScope" xsi:type="string">data.row</item>
            </item>
        </argument>
        <field name="name" formElement="input">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="dataScope" xsi:type="string">name</item>
                    <item name="fit" xsi:type="boolean">false</item>
                    <item name="label" xsi:type="string" translate="true">NAME</item>
                    <item name="dataType" xsi:type="string">text</item>
                </item>
            </argument>
        </field>
        <field name="value" formElement="input">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="prefixName" xsi:type="string">value</item>
                    <item name="prefixElementName" xsi:type="string">option_</item>
                    <item name="dataScope" xsi:type="string">value</item>
                    <item name="fit" xsi:type="boolean">false</item>
                    <item name="label" xsi:type="string" translate="true">VALUE</item>
                    <item name="dataType" xsi:type="string">text</item>
                </item>
            </argument>
        </field>
        <actionDelete name="action_delete">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="fit" xsi:type="boolean">true</item>
                    <item name="prefixElementName" xsi:type="string">option_</item>
                    <item name="prefixName" xsi:type="string">Params.delete</item>
                    <item name="dataType" xsi:type="string">text</item>
                </item>
            </argument>
            <settings>
                <dataType>text</dataType>
                <componentType>actionDelete</componentType>
            </settings>
        </actionDelete>
    </container>
</dynamicRows> 
SagarPPanchal
  • 9,839
  • 6
  • 34
  • 62
tal shulgin
  • 31
  • 1
  • 6

1 Answers1

1

For this, you need to reinject the same informations (here array) in your dataprovider who is link with your model predefined in your my_form.xml.

For me my container name is matritix_advanceform link to module cms_page (you can see in view/adminhtml/ui_component/cms_page_form.xml) so :

<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">cms_page_form.page_form_data_source</item> here
        </item> 
    </argument>
    <settings> 
        <namespace>cms_page_form</namespace>
        <dataScope>data</dataScope>
        <deps>
            <dep>cms_page_form.page_form_data_source</dep>
        </deps>
    </settings>
    <dataSource name="page_form_data_source">
        <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>
        <settings>
            <submitUrl path="cms/page/save"/>
        </settings>
        <dataProvider class="Magento\Cms\Model\Page\DataProvider" name="page_form_data_source"> here
            <settings>
                <requestFieldName>page_id</requestFieldName>
                <primaryFieldName>page_id</primaryFieldName>
            </settings>
        </dataProvider>
    </dataSource>
    <container name="matritix_advanceform">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/dynamic-rows/dynamic-rows</item>
             ...

....

so the information is link to the table cms_page. so i save it (with serialize) in that table where my field name is "matritix_advanceform" and i load it with deserialize, so the result in hard is like this in my dataprovider :

class DataProvider extends \Magento\Cms\Model\Page\DataProvider
{
  public function getData()
    {
...
    $matritix_advanceform = array (
    0  => array("myinput_text" => "test", "record_id" => "0"));

        $this->loadedData[$page->getId()]['matritix_advanceform'] = $matritix_advanceform;

...
return $this->loadedData;
}
}
tweetyx
  • 19
  • 2