Magent 2.4.2 Dynamic rows in edit form (ui components)
-
12-05-2021 - |
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