¿Cómo agregar un atributo personalizado del cliente en el formulario de edición de la dirección del cliente?

19

customer_addressAgregué un atributo personalizado del cliente como tipo y se ejecuta correctamente en el administrador y en la comprobación de una página, así como en la dirección de envío y facturación.

Creé: my_namespace/my_module/etc/module.xmly registration.php composer.jsonarchivos en el directorio base del módulo.

my_namespace / my_module / Setup / InstallData.php

namespace Namespace\Module\Setup;

use Magento\Framework\Module\Setup\Migration;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{
    /**
     * Customer setup factory
     *
     * @var CustomerSetupFactory
     */
    private $customerSetupFactory;

    /**
     * Init
     *
     * @param CustomerSetupFactory $customerSetupFactory
     */
    public function __construct(\Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory)
    {
        $this->customerSetupFactory = $customerSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $setup->startSetup();

        // insert attribute
        $customerSetup->addAttribute('customer_address', 'attr_code',  [
            'label' => 'My attribute',
            'type' => 'varchar',
            'input' => 'text',
            'position' => 45,
            'visible' => true,
            'required' => false,
            'system' => 0
        ]);

        $MyAttribute = $customerSetup->getEavConfig()->getAttribute('customer_address', 'attr_code');
        $MyAttribute->setData(
            'used_in_forms',
            ['adminhtml_customer_address', 'customer_address_edit', 'customer_register_address']
        );
        $MyAttribute->save();

        $setup->endSetup();
    }
}

Ahora necesito agregar un campo de atributo en el formulario de cliente addy editdirección relacionado con el archivo magento_customer / view / frontend / templates / address / edit.phtml

Agregué el campo pero no puedo obtener y guardar el valor de ese atributo.

Cerveza inglesa
fuente
¿Qué versión de magento?
Sohel Rana
magento CE 2.1.0
Ale
Hola Ale, ¿puedes compartir tu código de trabajo para el atributo de dirección de cliente personalizado? También necesito agregar la misma funcionalidad.
Rahul

Respuestas:

9

Los atributos personalizados del cliente nunca "aparecerán" en la interfaz como lo hacen en el backend. El código que los muestra en la interfaz se encuentra en un archivo phtml personalizado.

Magento EE tiene esta funcionalidad incorporada. No estoy sugiriendo que NECESITES gastar ese dinero, solo digo que lo tiene. Si desea seguir adelante e intentar agregar atributos personalizados, es algo complejo.

En primer lugar, debe hacer todo esto en un módulo o simplemente no funcionará correctamente, y será difícil depurarlo / actualizarlo más tarde.

Tienes que hacer estas cosas:

  • Crea el atributo (lo has hecho si aparece en admin)
  • anular el diseño de la interfaz para referenciaContainer form.additional.info
  • agregue un archivo phtml de plantilla para mostrar los atributos adicionales
  • agregue un archivo PHP de bloque para cargar los nuevos atributos y crear el HTML
  • otras cosas como aprender a automatizar el proceso y cargar múltiples en lugar de codificarlo para cargar solo el nombre del que creó.

Puede cargar sus atributos personalizados en Block PHP. Luego, simplemente agregue su diseño de la customer_account_create.xmlsiguiente manera:

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <update handle="customer_form_template_handle"/>
    <body>
        <referenceContainer name="form.additional.info">
            <block class="Company\Customformattributes\Block\FormCustomer" template="Company_Customformattributes::customattributes.phtml" name="customer_form_user_attributes" cacheable="false">
                <action method="setFormCode">
                    <argument name="code" xsi:type="string">customer_account_edit</argument>
                </action>
                <action method="setEntityModelClass">
                    <argument name="code" xsi:type="string">Magento\Customer\Model\Customer</argument>
                </action>
            </block>
        </referenceContainer>
    </body>
</page>

Esta es la salsa mágica para cargar su bloque PHP, cargar su phtml y llevarlo a la página correcta.

Honestamente, esta no es una respuesta completa, hay mucho más, pero se entiende la idea básica.

CarComp
fuente
¿puedes por favor completar tu respuesta? ¿Qué ha ingresado en el archivo de bloque y plantilla?
chirag
¿La acción setEntityModelClass puede guardar automáticamente nuestro atributo o también necesitamos escribir código para guardar el atributo?
siddhesh
2

No puedo responder a su pregunta, porque no se proporciona suficiente código, pero tenga un pequeño consejo. ¿Revisaste este tutorial Tutorial para agregar attirbute de clientes ?

Desde Magento 2.1 hay un cambio y los métodos -> save () están en desuso. Debería comenzar a utilizar repositorios en su lugar. Por ejemplo, para el cliente EAV, debe usar

Magento \ Eav \ Model \ AttributeRepository

En su caso, la segunda parte del script debe cambiarse a

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
pietr
fuente