Question

i have a little problem with display saved values in dynamic rows. Code below.

EDIT FORM

<?xml version="1.0"?>
<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">mapping_form.mapping_form_data_source</item>
        </item>
        <item name="label" xsi:type="string" translate="true">Mapping Form</item>
        <item name="template" xsi:type="string">templates/form/collapsible</item>
    </argument>
    <settings>
        <namespace>mapping_form</namespace>
        <dataScope>data.general</dataScope>
        <deps>
            <dep>mapping_form.mapping_form_data_source</dep>
        </deps>
        <buttons>
            <button name="save" class="Vendor\Module\Block\Form\Mapping\Save"/>
            <button name="delete" class="Vendor\Module\Block\Form\Mapping\Delete"/>
            <button name="back" class="Vendor\Module\Block\Form\Mapping\Back"/>
        </buttons>
    </settings>
    <dataSource name="feed_form_data_source" component="Magento_Ui/js/form/provider">
        <settings>
            <submitUrl path="*/*/save"/>
        </settings>
        <dataProvider class="Vendor\Module\Ui\CategoryMappingDataProvider" name="mapping_form_data_source">
            <settings>
                <requestFieldName>feed_category_id</requestFieldName>
                <primaryFieldName>feed_category_id</primaryFieldName>
            </settings>
        </dataProvider>
    </dataSource>
    <fieldset name="general" sortOrder="10">
        <settings>
            <label translate="true">General</label>
        </settings>
        <field name="feed_id" sortOrder="0" formElement="hidden">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">feed_category_id</item>
                </item>
            </argument>
            <settings>
                <dataType>text</dataType>
                <label translate="true">FEED CATEGORY ID</label>
                <dataScope>feed_category_id</dataScope>
            </settings>
        </field>
        <field name="feed_category_name" formElement="input">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">feed_category_name</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
            <settings>
                <dataType>string</dataType>
                <label translate="true">Name</label>
                <dataScope>feed_category_name</dataScope>
            </settings>
        </field>
        <field name="feed_category_code" formElement="input">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">feed_category_code</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
            <settings>
                <dataType>string</dataType>
                <label translate="true">Code</label>
                <dataScope>feed_category_code</dataScope>
            </settings>
        </field>
        <field name="feed_category_excluded_categories">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Magento\Catalog\Ui\Component\Product\Form\Categories\Options
                </item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Exclude categories</item>
                    <item name="componentType" xsi:type="string">field</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="component" xsi:type="string">Magento_Catalog/js/components/new-category</item>
                    <item name="elementTmpl" xsi:type="string">ui/grid/filters/elements/ui-select</item>
                    <item name="dataScope" xsi:type="string">feed_category_excluded_categories</item>
                    <item name="filterOptions" xsi:type="boolean">true</item>
                    <item name="showCheckbox" xsi:type="boolean">false</item>
                    <item name="disableLabel" xsi:type="boolean">true</item>
                    <item name="multiple" xsi:type="boolean">true</item>
                    <item name="levelsVisibility" xsi:type="number">1</item>
                    <item name="sortOrder" xsi:type="number">10</item>
                    <item name="listens" xsi:type="array">
                        <item name="${ $.namespace }.${ $.namespace }:responseData" xsi:type="string">setParsed</item>
                    </item>
                </item>
            </argument>
        </field>
    </fieldset>
    <fieldset name="mapping_categories">
        <settings>
            <label translate="true">Mapping Categories</label>
        </settings>
        <dynamicRows name="dynamic_rows">
            <settings>
                <addButtonLabel translate="true">Add Next Mapping</addButtonLabel>
                <additionalClasses>
                    <class name="admin__field-wide">true</class>
                </additionalClasses>
                <componentType>dynamicRows</componentType>
            </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="componentType" xsi:type="string">container</item>
                    </item>
                </argument>
                <field name="original_category_id" formElement="select">
                    <argument name="data" xsi:type="array">
                        <item name="config" xsi:type="array">
                            <item name="sortOrder" xsi:type="number">10</item>
                            <item name="dataType" xsi:type="string">text</item>
                            <item name="template" xsi:type="string">ui/form/field</item>
                            <item name="elementTmpl" xsi:type="string">Module/form/element/input_text</item>
                            <item name="label" translate="true" xsi:type="string">Category name</item>
                            <item name="formElement" xsi:type="string">input</item>
                            <item name="source" xsi:type="string">original_category_id</item>
                            <item name="dataScope" xsi:type="string">original_category_id</item>
                        </item>
                    </argument>
                </field>
                <field name="original_category_id" formElement="input">
                    <argument name="data" xsi:type="array">
                        <item name="options" xsi:type="object">
                            Magento\Catalog\Ui\Component\Product\Form\Categories\Options
                        </item>
                        <item name="config" xsi:type="array">
                            <item name="fit" xsi:type="boolean">false</item>
                            <item name="label" xsi:type="string" translate="true">Category Name</item>
                            <item name="componentType" xsi:type="string">field</item>
                            <item name="formElement" xsi:type="string">select</item>
                            <item name="component" xsi:type="string">Magento_Catalog/js/components/new-category</item>
                            <item name="elementTmpl" xsi:type="string">ui/grid/filters/elements/ui-select</item>
                            <item name="dataScope" xsi:type="string">original_category_id</item>
                            <item name="filterOptions" xsi:type="boolean">true</item>
                            <item name="showCheckbox" xsi:type="boolean">false</item>
                            <item name="disableLabel" xsi:type="boolean">true</item>
                            <item name="multiple" xsi:type="boolean">false</item>
                            <item name="levelsVisibility" xsi:type="number">1</item>
                            <item name="sortOrder" xsi:type="number">10</item>
                            <item name="listens" xsi:type="array">
                                <item name="${ $.namespace }.${ $.namespace }:responseData" xsi:type="string">setParsed</item>
                            </item>
                        </item>
                    </argument>
                </field>
                <field name="feed_categories">
                    <argument name="data" xsi:type="array">
                        <item name="options" xsi:type="object">Vendor\Module\Ui\Component\Mapping\Form\Categories\Options</item>
                        <item name="config" xsi:type="array">
                            <item name="label" xsi:type="string" translate="true">Mapping Category Name</item>
                            <item name="componentType" xsi:type="string">field</item>
                            <item name="formElement" xsi:type="string">select</item>
                            <item name="component" xsi:type="string">Magento_Catalog/js/components/new-category</item>
                            <item name="elementTmpl" xsi:type="string">ui/grid/filters/elements/ui-select</item>
                            <item name="filterOptions" xsi:type="boolean">true</item>
                            <item name="showCheckbox" xsi:type="boolean">false</item>
                            <item name="disableLabel" xsi:type="boolean">true</item>
                            <item name="multiple" xsi:type="boolean">false</item>
                            <item name="dataScope" xsi:type="string">feed_categories</item>
                            <item name="levelsVisibility" xsi:type="number">1</item>
                            <item name="sortOrder" xsi:type="number">15</item>
                            <item name="listens" xsi:type="array">
                                <item name="${ $.namespace }.${ $.namespace }:responseData" xsi:type="string">setParsed</item>
                            </item>
                        </item>
                    </argument>
                </field>
                <actionDelete template="Magento_Backend/dynamic-rows/cells/action-delete">
                    <argument name="data" xsi:type="array">
                        <item name="config" xsi:type="array">
                            <item name="fit" xsi:type="boolean">false</item>
                        </item>
                    </argument>
                    <settings>
                        <additionalClasses>
                            <class name="some-class">true</class>
                        </additionalClasses>
                        <dataType>text</dataType>
                        <label>Actions</label>
                        <componentType>actionDelete</componentType>
                    </settings>
                </actionDelete>
            </container>
        </dynamicRows>
    </fieldset>
</form>

Data Provider

<?php


namespace Vendor\Module\Ui;

use Vendor\Module\Query\Mapping\GetListQuery;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\ReportingInterface;
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider;
use Magento\Ui\DataProvider\SearchResultFactory;

class CategoryMappingDataProvider extends DataProvider
{
    /**
     * @var GetListQuery
     */
    private $getListQuery;

    /**
     * @var SearchResultFactory
     */
    private $searchResultFactory;

    /**
     * @var array
     */
    private $loadedData = [];

    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        ReportingInterface $reporting,
        SearchCriteriaBuilder $searchCriteriaBuilder,
        RequestInterface $request,
        FilterBuilder $filterBuilder,
        GetListQuery $getListQuery,
        SearchResultFactory $searchResultFactory,
        array $meta = [],
        array $data = []
    )
    {
        parent::__construct($name, $primaryFieldName, $requestFieldName, $reporting, $searchCriteriaBuilder, $request, $filterBuilder, $meta, $data);
        $this->getListQuery = $getListQuery;
        $this->searchResultFactory = $searchResultFactory;
    }

    /**
     * @inheirtDoc
     */
    public function getSearchResult()
    {
        $searchCriteria = $this->getSearchCriteria();
        $result = $this->getListQuery->execute($searchCriteria);

        return $this->searchResultFactory->create($result->getItems(), $result->getTotalCount(), $searchCriteria, "feed_category_id");
    }

    /**
     * @return array
     */
    public function getData(): array
    {
        if ($this->loadedData) {
            return $this->loadedData;
        }

        $this->loadedData = parent::getData();
        $itemsById = [];

        foreach ($this->loadedData['items'] as $item) {
            if(isset($item['feed_category_excluded_categories'])) {
                $item['feed_category_excluded_categories'] = explode(",", $item['feed_category_excluded_categories']);
            }

            if (isset($item['feed_categories'])) {
                $item['mapping_categories']['dynamic_rows']['record']['feed_categories'] = $item['feed_categories'];
            }

            $itemsById[(int)$item['feed_category_id']] = $item;
        }

        if ($id = $this->request->getParam('feed_category_id')) {
            $this->loadedData['items'][0] = $itemsById[(int)$id];
        }

        return $this->loadedData;
    }
}

Mapping Interface

<?php


namespace Vendor\Module\Api\Data;

interface CategoryMappingInterface
{
    public const FEED_CATEGORY_ID = "feed_category_id";
    public const FEED_CATEGORY_CODE = "feed_category_code";
    public const FEED_CATEGORY_EXCLUDED_CATEGORIES = "feed_category_excluded_categories";
    public const FEED_CATEGORY_NAME = 'feed_category_name';
    public const ORIGINAL_CATEGORY_ID = 'original_category_id';
    public const FEED_CATEGORIES = 'feed_categories';

    /**
     * @return int|null
     */
    public function getFeedCategoryId(): ?int;

    /**
     * @param int|null $feedCategoryId
     * @return void
     */
    public function setFeedCategoryId(?int $feedCategoryId): void;

    /**
     * @return string|null
     */
    public function getFeedCategoryCode(): ?string;

    /**
     * @param string|null $code
     * @return void
     */
    public function setFeedCategoryCode(?string $code): void;

    /**
     * @return string|null
     */
    public function getFeedCategoryExcludedCategories(): ?string;

    /**
     * @param string|null $excludedCategories
     * @return void
     */
    public function setFeedCategoryExcludedCategories(?string $excludedCategories): void;

    /**
     * @return string|null
     */
    public function getFeedCategoryName(): ?string;

    /**
     * @param string|null $name
     * @return void
     */
    public function setFeedCategoryName(?string $name): void;

    /**
     * @return int|null
     */
    public function getOriginalCategoryId(): ?int;

    /**
     * @param int|null $categoryId
     * @return void
     */
    public function setOriginalCategoryId(?int $categoryId): void;

    /**
     * @return array|null
     */
    public function getFeedCategories(): ?array;

    /**
     * @param array|null $categories
     * @return void
     */
    public function setFeedCategories(?array $categories): void;
}

Mapping Data

<?php


namespace Vendor\Module\Model\Data;

use Vendor\Module\Api\Data\CategoryMappingInterface;
use Magento\Framework\DataObject;

class FeedCategoryMappingData extends DataObject implements CategoryMappingInterface
{
    public function getFeedCategoryId(): ?int
    {
        return $this->getData(self::FEED_CATEGORY_ID) === null ? null : (int) $this->getData(self::FEED_CATEGORY_ID);
    }

    public function setFeedCategoryId(?int $feedCategoryId): void
    {
        $this->setData(self::FEED_CATEGORY_ID, $feedCategoryId);
    }

    public function getFeedCategoryCode(): ?string
    {
        return $this->getData(self::FEED_CATEGORY_CODE) === null ? null : (string) $this->getData(self::FEED_CATEGORY_CODE);
    }

    public function setFeedCategoryCode(?string $code): void
    {
        $this->setData(self::FEED_CATEGORY_CODE, $code);
    }

    public function getFeedCategoryExcludedCategories(): ?string
    {
        return $this->getData(self::FEED_CATEGORY_EXCLUDED_CATEGORIES) === null
            ? null
            : (string) $this->getData(self::FEED_CATEGORY_EXCLUDED_CATEGORIES);
    }

    public function setFeedCategoryExcludedCategories(?string $excludedCategories): void
    {
        $this->setData(self::FEED_CATEGORY_EXCLUDED_CATEGORIES, $excludedCategories);
    }

    public function getFeedCategoryName(): ?string
    {
        return $this->getData(self::FEED_CATEGORY_NAME) === null
            ? null
            : (string) $this->getData(self::FEED_CATEGORY_NAME);
    }

    public function setFeedCategoryName(?string $name): void
    {
        $this->setData(self::FEED_CATEGORY_NAME, $name);
    }

    public function getOriginalCategoryId(): ?int
    {
        return $this->getData(self::ORIGINAL_CATEGORY_ID) === null
            ? null
            : (int) $this->getData(self::ORIGINAL_CATEGORY_ID);
    }

    public function setOriginalCategoryId(?int $categoryId): void
    {
        $this->setData(self::ORIGINAL_CATEGORY_ID, $categoryId);
    }

    public function getFeedCategories(): ?array
    {
        return $this->getData(self::FEED_CATEGORIES) === null
            ? null
            : (array) $this->getData(self::FEED_CATEGORIES);
    }

    public function setFeedCategories(?array $categories): void
    {
        $this->setData(self::FEED_CATEGORIES, $categories);
    }
}

No correct solution

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top