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.


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>

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!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.