Quiero agregar un atributo select / dropdown a una categoría y mostrarlo en el back-end para permitir que el propietario de la tienda lo seleccione. Después de investigar un poco, descubrí lo siguiente:
- Crear un atributo a través de Setupscript
- Inclúyalo a través de la declaración del componente UI
Entonces esto es lo que he hecho:
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'
]
);
}
ver / 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>
Pero eso no es suficiente, la clasificación de las pestañas en el backend está mezclada. También se muestra el menú desplegable, pero sin opciones. Entonces descubrí que también tienes que editar Magento\Catalog\Model\Category\DataProvider::getFieldsMap()
. Para hacerlo, tenemos que sobrescribirlo a través de 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>
En el propio proveedor de datos del módulo, debe agregar el atributo en la función. Y luego funciona.
Asi que aqui están mis preguntas:
- No creo que realmente tenga que sobrescribir este proveedor de datos para que funcione, debe haber una mejor manera
- Hay 3 lugares dentro del código donde tiene que declarar el nuevo atributo (script de configuración, componente ui, proveedor de datos), no puedo creer que sea necesaria esta sobrecarga.
- ¿Por qué tiene información redundante para el atributo? Por ejemplo, la etiqueta está dentro de la secuencia de comandos de configuración Y el componente ui donde, como la etiqueta en el backend, se leerá de la declaración del componente ui.