Como adicionar um atributo personalizado do cliente no formulário de edição de endereço do cliente?

19

customer_addressAdicionei um atributo personalizado do cliente como tipo e ele é executado corretamente no administrador e no checkout de uma página, bem como no endereço de entrega e cobrança.

Eu criei: my_namespace/my_module/etc/module.xmle registration.php composer.jsonarquivos no diretório base do 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();
    }
}

Agora preciso adicionar um campo de atributo no formulário de cliente adde editendereço relacionados ao arquivo magento_customer / view / frontend / templates / address / edit.phtml

Adicionei o campo, mas não consigo obter e salvar o valor desse atributo.

Ale
fonte
qual versão do magento?
Sohel Rana
magento CE 2.1.0
Ale
Oi Ale, Você pode compartilhar seu código de trabalho para o atributo de endereço do cliente personalizado. Eu também preciso adicionar a mesma funcionalidade.
Rahul

Respostas:

9

Os atributos personalizados do cliente nunca 'aparecerão' no front-end, como no back-end. O código que os exibe no frontend está localizado em um arquivo phtml personalizado.

O Magento EE tem essa funcionalidade embutida. Não estou sugerindo que você precise gastar esse dinheiro, apenas estou dizendo que ele possui. Se você quiser ir em frente e tentar adicionar atributos personalizados, é um pouco complexo.

Primeiro de tudo, você deve fazer tudo isso em um módulo ou simplesmente não funcionará corretamente e será difícil depurar / atualizar mais tarde.

Você tem que fazer o seguinte:

  • Crie o atributo (você fez isso se ele aparecer no administrador)
  • substituir o layout de front-end para referenceContainer form.additional.info
  • adicione um arquivo phtml de modelo para mostrar os atributos adicionais
  • adicione um arquivo PHP de bloco para carregar os novos atributos e criar o HTML
  • outras coisas, como aprender a automatizar o processo e carregar múltiplos, em vez de codificá-lo para carregar apenas o nome daquele que você criou.

Você pode carregar seus atributos personalizados no bloco PHP. Em seguida, basta adicionar seu layout da customer_account_create.xmlseguinte forma:

<?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>

Este é o molho mágico para carregar seu bloco PHP, carregar seu phtml e colocá-lo na página correta.

Esta não é uma resposta completa, honestamente, há muito mais, mas você entende a ideia básica.

CarComp
fonte
você pode completar sua resposta? o que você digitou no bloco e no arquivo de modelo?
22417
A ação setEntityModelClass pode salvar automaticamente nosso atributo ou precisamos escrever um código para salvar o atributo também?
Siddhesh
2

Não é possível responder à sua pergunta, porque não há código suficiente, mas dê um pequeno conselho. Você verificou este tutorial Adicionando o tutorial attirbute do cliente ?

Desde o Magento 2.1, há uma alteração e os métodos -> save () estão obsoletos. Você deve começar a usar Repositórios. Por exemplo, para o EAV do cliente, você deve usar

Magento \ Eav \ Model \ AttributeRepository

No seu caso, a segunda parte do script deve ser alterada para

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