Ich möchte einer Kategorie ein Auswahl- / Dropdown-Attribut hinzufügen und es im Backend anzeigen, damit der Ladenbesitzer es auswählen kann. Nach einigen Recherchen fand ich Folgendes heraus:
- Erstellen Sie ein Attribut über Setupscript
- Fügen Sie es über die UI-Komponentendeklaration ein
Das habe ich also getan:
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
/** @var $eavSetup \Magento\Eav\Setup\EavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$eavSetup->addAttribute(
\Magento\Catalog\Model\Category::ENTITY,
'attribute_code',
[
'type' => 'int',
'label' => 'Top Navigation CMS Block',
'input' => 'select',
'source' => 'Magento\Catalog\Model\Category\Attribute\Source\Page',
'required' => false,
'sort_order' => 10,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
'group' => 'MyOwnGroup'
]
);
}
view / adminhtml / ui_component / category_form.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">
<fieldset name="content">
<field name="attribute_code">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="sortOrder" xsi:type="number">61</item>
<item name="dataType" xsi:type="string">string</item>
<item name="formElement" xsi:type="string">select</item>
<item name="label" xsi:type="string" translate="true">Top Navigation CMS Block</item>
</item>
</argument>
</field>
</fieldset>
</form>
Das reicht aber nicht aus, die Sortierung der Tabs im Backend ist durcheinander. Auch das Dropdown wird gerendert, jedoch ohne Optionen. Also habe ich herausgefunden, dass man auch bearbeiten muss Magento\Catalog\Model\Category\DataProvider::getFieldsMap()
. Dazu müssen wir es über di.xml überschreiben:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Catalog\Model\Category\DataProvider" type="Vendor\Module\Model\Category\DataProvider" />
</config>
Im moduleigenen Datenprovider müssen Sie das Attribut in die Funktion einfügen. Und dann funktioniert es.
Also hier sind meine Fragen:
- Ich denke nicht, dass Sie diesen Datenprovider wirklich überschreiben müssen, damit er funktioniert. Es muss einen besseren Weg geben
- Es gibt 3 Stellen im Code, an denen Sie das neue Attribut deklarieren müssen (Setup-Skript, UI-Komponente, Datenprovider). Ich kann nicht glauben, dass so viel Overhead notwendig ist.
- Warum haben Sie redundante Informationen für das Attribut? Das Label befindet sich beispielsweise im Setup-Skript UND in der UI-Komponente, wobei das Label im Backend aus der Deklaration der UI-Komponente gelesen wird.