Magento 2 ¿cómo guardar el campo personalizado agregado en forma de grupo de clientes?

9

He agregado algunos campos personalizados al formulario de grupo de clientes mediante el uso 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 establecimiento en la API proporcionada. Es completamente diferente de Magento 1.X que solo usa setXXX () para guardar.

Ricky.C
fuente
He intentado usar \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('program_type', $ programType); tipo_programa corresponde a la columna de tabla 'tipo_programa' para guardar en la base de datos, pero falló.
Ricky.C
¿Debo escribir una API personalizada con getter y setter para guardar los campos?
Ricky.C

Respuestas:

23

El mecanismo de atributos de extensión debe usarse en este caso. Permite la extensión de API centrales por módulos de terceros. Pasos genéricos para habilitar el nuevo atributo de extensión:

  1. Declare el atributo de extensión como se describe en los documentos oficiales . Después de borrar vary ejecutar <project_root>/bin/magento setup:di:compile, debe aparecer el setter y getter correspondientes para este nuevo atributo \Magento\Customer\Api\Data\GroupExtensionInterface(esta interfaz se genera automáticamente)
  2. Plugins de escritura para \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById(y cualquier otros métodos de servicio si es necesario) para guardar / cargar nuevo atributo. Como desarrollador de extensiones, solo usted sabe dónde debe almacenarse este atributo, puede ser cualquier tabla. Ver \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSavecomo un ejemplo
  3. Si necesita hacer que este atributo sea visible en la colección (para que se pueda buscar / filtrar), declare joinnodo. Si no es así, solo omita esto
  4. Acceda a su atributo personalizado como:, $customerGroup->getExtensionAttributes()->getMyAttribute()donde se customerGroupimplementa \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()puede ser usado también

A continuación se muestra el ejemplo de configuración que se debe poner a 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>
Alex Paliarush
fuente
Intenté agregar extension_attributes.xml, pero no se genera una nueva interfaz. PD
eliminé
My extension_attribute.xml: <? Xml version = "1.0"?> <config> <extension_attributes for = "Magento \ Customer \ Api \ Data \ GroupInterface"> <atributo código = "group_domain" type = "string" /> </ extension_attributes> </config>
Ricky.C
El archivo debe llamarse extension_attributes.xml (plural). Intente invocar la generación de todas las entidades autogeneradas usando CLI.
Alex Paliarush
lo siento por el error tipográfico en el comentario anterior, el archivo que tengo en realidad es extension_attributes.xml
Ricky.C
Busqué en Google pero no encontré nada. ¿Me puede decir qué comando se debe utilizar? Soy un recién llegado que no está familiarizado con el cli. Gracias.
Ricky.C
2

¡No olvide que un módulo necesita un register.phparchivo y debe usarlo bin/magento module:enable VendorName_ModuleNameantes de que aparezca!

GuruBob
fuente