Я добавил пользовательский атрибут категории. Я связываю связанные категории для последующего использования. Я добавил это к uicomponent xml, чтобы показать элемент:
<field name="related_categories" sortOrder="94">
<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">Add external categories</item>
<item name="componentType" xsi:type="string">field</item>
<item name="formElement" xsi:type="string">multiselect</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">related_categories</item>
<item name="filterOptions" xsi:type="boolean">false</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">94</item>
<item name="required" xsi:type="boolean">false</item>
<item name="listens" xsi:type="array">
<item name="${ $.namespace }.${ $.namespace }:responseData" xsi:type="string">setParsed</item>
</item>
</item>
</argument>
</field>
, что приводит к отображению компонента с несколькими выбранными категориями, это так же, как у magento при выборе категорий в продукте. Я сделал внутреннюю модель для сохранения массива в строку через запятую. Проблема в том, что я получаю данные даже после того, как я их очищаю.
/**
* @param DataObject $dataObject
* @return $this
*/
public function beforeSave($dataObject)
{
$attributeCode = $this->getAttribute()->getName();
if (in_array($attributeCode, self::ATTRIBUTE_CODES)) {
$data = $dataObject->getData($attributeCode); // has the category id array even though I cleared the input in the form before submitting
// $ _POST не будет иметь этих данных, так почему же у $ dataObject все еще есть эти данные?
Я добавил атрибут, подобный этому (пример поставщика и имени модуля замаскирован в примере):
$result = $eavSetup->addAttribute(
\Magento\Catalog\Model\Category::ENTITY,
'related_categories',
[
'backend' => 'VENDOR\MODULE\Model\Category\Attribute\Backend\Custom',
'type' => 'text',
'label' => 'Related external categories',
'input' => 'multiselect',
'required' => false,
'sort_order' => 94,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
'group' => 'General Information',
'used_in_product_listing' => true,
'visible_on_front' => true,
'is_used_in_grid' => true,
'is_visible_in_grid' => false,
'is_filterable_in_grid' => true,
]
);
Итак, чтобы подвести итог:
- показывает, что компонент пользовательского интерфейса - я могу выбрать несколько категорий - я могу сохранить их успешно - сохраненные элементы предварительно выбираются правильно при возврате на страницу редактирования категории -Я удаляю все выбранные категории -Я нажимаю сохранить -Мне осталась одна категория, которая все еще сохраняется и выбирается в элементе.
Что я пропустил?