Je veux ajouter un attribut select / dropdown à une catégorie et l'afficher dans le backend pour permettre au propriétaire du magasin de le sélectionner. Après quelques recherches, j'ai découvert ce qu'il fallait faire:
- Créer un attribut via Setupscript
- Incluez-le via la déclaration du composant UI
Voici donc ce que j'ai fait:
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>
Mais cela ne suffit pas, le tri des onglets dans le backend est mélangé. La liste déroulante est également rendue, mais sans options. J'ai donc découvert que vous devez également modifier Magento\Catalog\Model\Category\DataProvider::getFieldsMap()
. Pour ce faire, nous devons l'écraser via di.xml:
<?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>
Dans le fournisseur de données du module, vous devez ajouter l'attribut dans la fonction. Et puis ça marche.
Donc, voici mes questions:
- Je ne pense pas que vous devez vraiment remplacer ce fournisseur de données pour le faire fonctionner, il doit y avoir une meilleure façon
- Il y a 3 endroits dans le code où vous devez déclarer le nouvel attribut (script de configuration, composant d'interface utilisateur, fournisseur de données), je ne peux pas croire que cette surcharge soit nécessaire?
- Pourquoi avez-vous des informations redondantes pour l'attribut? Par exemple, l'étiquette se trouve dans le script de configuration ET le composant ui où l'étiquette dans le backend sera lue à partir de la déclaration du composant ui.