Magento: Novos campos no cadastro de cliente (Addendum do wiki)
1 de fevereiro de 2010Olá.
Já vamos começar este post (agora heterodoxo) com 1 link de referência: http://www.magentocommerce.com/wiki/custom_account/registration_fields. Neste link temos toda a informação necessária para se criar um campo adicional na hora do cadastro do cliente pelo frontend, sendo que todos que seguem este artigo acabam conseguindo adicionar os campos com sucesso, portanto não vou descrever os passos que já estão ali.
O problema: em geral, para a criação de um novo campo no cadastro do usuário, este tutorial sempre foi o suficiente, mas quando tenta-se lidar pelo backend (admin) com estes campos criados surge um problema que exige uma mini-explicação superficial do fluxo de informações do cadastro no Magento. Vamos supor que criamos o campo “CPF”:

Fluxo de informações de dados do cliente no Magento.
Ao ver esta imagem concluímos algo: se os dados do cliente são copiados da tabela customer pra tabela sales isso significa que, ao visualizarmos os dados desta compra, sempre veremos os dados que o cliente tinha na época da compra. Isso é vantajoso: se ele trocou de endereço 1 ano depois dessa compra, podemos saber o endereço que ele tinha na época; se ele resolver entregar seu cadastro para outra pessoa, trocando os dados, continuaremos com todos os dados que ele utilizou nas compras anteriores.
O fluxo de informações fica então assim: Na tabela eav_attribute temos o campo “cpf”. Este campo tem o entity_type_id = 1. Olhando na tabela eav_entity_type percebemos que o entity_type_id = 1 tem o entity_type_code = “customer”, ou seja, campos com este id servem para o cadastro do usuário (isso no Magento 1.3.2.4, essa relação entity_type_id/entity_type_code pode variar de versão pra versão). Beleza, isso faz com que na hora que o cliente se cadastre, o campo CPF seja gravado no banco. Mas na hora da compra, isso não faz com que o campo seja gravado junto da compra, como no fluxo acima. Esse segundo passo (o “addendum” a que me refiro nesse post) é feito da seguinte forma:
Passo 1: Vá até a tabela eav_entity_type no banco e ache o entity_type_id aonde o entity_type_code = “order”. No meu caso o valor é 11.
Passo 2: Rode o seguinte código apenas uma vez (colocando no index.php):
$idOrder = '11';
$installer = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->addAttribute($idOrder, 'customer_cpf', $attrList);
Pronto. Você tem o campo (eav_entity, na verdade) que receberá os dados do cliente a cada compra na tabela sales.
Passo 3: agora, no arquivo Mage/Customer/etc/config.xml ou, idealmente, do módulo que adiciona campos ao cadastro que você estiver desenvolvendo, identifique esta tag e adicione a linha marcada:
<config>
<global>
<fieldsets>
<sales_convert_quote> <!-- achar esta tag -->
<customer_cpf><to_order>*</to_order></customer_cpf> <!-- adicionar esta linha -->
</sales_convert_quote>
</fieldsets>
</global>
</config>
Isso vai fazer com que o campo “cpf” que você havia criado pro cliente seja gravado também na compra, trazendo as vantagens acima citadas. Agora, como ver esta informação na tela do pedido? O cliente se cadastrou, usou meu campo novo, os dados estão na tabela sales_* mas a cada pedido que ele faz eu tenho que voltar no cadastro dele pra verificar essa informação…
Passo 4 e final: o que podemos fazer é adicionar um pouco de código ao arquivo app/design/adminhtml/default/default/template/sales/order/view/info.phtml. Este arquivo é chamado quando estamos vendo um pedido, sua fatura, ou seu envio.
Dentro deste arquivo, dentro de um div chamado “box-right”, temos uma tabela com uma listagem de dados trazidas das tabelas sales_*. Como agora, depois das mudanças acima, nosso campo “cpf” também é gravado nesta tabela, basta adicionarmos esta linha a tabela:
<tr>
<td class="label"><label><?php echo Mage::helper('sales')->__('CPF') ?></label></label></td>
<td>
<strong><?php echo $this->htmlEscape($_order->getCustomerCpf())?></strong>
</td>
</tr>
Resultado:

Claro que o ideal é sempre fazer um módulo a parte e nunca sobrescrever arquivos do sistema. OFF-TOPIC: O uso do termo “addendum” fica pra quem é familiarizado com o Zeitgeist.
Abraço, espero ter ajudado.
Tags: cadastro cliente, cadastro do cliente, customer dataflow, dataflow, eav, eav_entity, fluxo dados, Magento, novo campo, novos campos


8 de fevereiro de 2010 às 10:53 am
Alisson, tudo bem?
Eu gostaria de um incluir o campo “Bairro” no Billing e Shipping Address, mas o procedimento que você postou é útil para dados do Customer, como posso fazer a inclusão deste campo nos endereços?
Abraços,
Diego Soares
9 de fevereiro de 2010 às 4:22 pm
O atributo bairro deverá ser do entity_type_code: customer_address – e deverá ir para o customer_bairro, tendo o entity_type_code: order_address.
Por favor, tente e nos avise aqui seu sucesso… =)
Abraço e obrigado pela visita!
10 de março de 2010 às 12:08 pm
Olá Alisson,
Estou com o mesmo problema do Diego. Você pode detalhar melhor como fazer a inclusão deste campo “bairro”, na fase de billing?
Sendo que o valor deste campo seja salvo também no cadastro do cliente?