Magento 2 ¿cómo guardar el campo personalizado agregado en forma de grupo de clientes?
-
13-12-2019 - |
Pregunta
Agregué algunos campos personalizados al formulario de grupo de clientes usando upgradeSchema.php
.
Después de eso, descubrí que los campos originales, como el código de grupo de clientes y la identificación fiscal, se guardan utilizando métodos de configuración en la API proporcionada.Es completamente diferente de Magento 1.X que solo usa setXXX() para guardar.
Solución
El mecanismo de atributos de extensión debe usarse en este caso. Permite la extensión de las API principales por los módulos de terceros. Pasos genéricos para habilitar el nuevo atributo de extensión:
- Declare Atributo de extensión como se describe en la documentos oficiales . Después de borrar
var
y ejecutar<project_root>/bin/magento setup:di:compile
, el programa correspondiente y el getter para este nuevo atributo deben aparecer en\Magento\Customer\Api\Data\GroupExtensionInterface
(esta interfaz se genera automáticamente) - escribe complementos para
\Magento\Customer\Api\GroupRepositoryInterface::save
,\Magento\Customer\Api\GroupRepositoryInterface::getById
(y cualquier otro método de servicio según sea necesario) para guardar / cargar un nuevo atributo. Como desarrollador de extensión, solo usted sabe dónde debe almacenarse este atributo, puede ser cualquier mesa. Ver\Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSave
como ejemplo - Si necesita hacer que este atributo sea visible en la cobro (para que se pueda buscar / filtrable), declare el nodo
join
. Si no, entonces solo omita esto - Acceda a su atributo personalizado como:
$customerGroup->getExtensionAttributes()->getMyAttribute()
, dondecustomerGroup
implementa\Magento\Customer\Api\Data\GroupInterface
. Se puede utilizarsetMyAttribute()
también
A continuación se muestra el ejemplo de la configuración que debe ponerse en VendorName/ModuleName/etc/extension_attributes.xml
<?xml version="1.0"?>
<config>
<extension_attributes for="Magento\Customer\Api\Data\GroupInterface">
<!--Data interface can be used as a type of attribute, see example in CatalogInventory module-->
<attribute code="name_of_attribute" type="string">
<resources>
<resource ref="VendorName_ModuleName::someAclNode"/>
</resources>
<!--Join is optional, only if you need to have added attribute visible in groups list-->
<join reference_table="table_where_attribute_is_stored" reference_field="group_id_field_in_that_table" join_on_field="group_id">
<field>name_of_added_attribute_field_in_that_table</field>
</join>
</attribute>
</extension_attributes>
</config>
Otros consejos
No olvides que un módulo necesita un register.php
archivo en él, y debe utilizar bin/magento module:enable VendorName_ModuleName
¡Antes de que aparezca!