foto
Alisson O Blog

Alisson O Blog

Magento e os idiomas que o computador fala…

Magento: Novos campos no cadastro de cliente (Addendum do wiki)

1 de fevereiro de 2010

Olá.

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

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:
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: , , , , , , , , ,

11 comentários para “Magento: Novos campos no cadastro de cliente (Addendum do wiki)”

  1. Diego Soares disse:

    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

  2. Alisson Oldoni disse:

    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!

  3. André Luiz disse:

    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?

  4. Luis Chaves disse:

    Olá Alisson

    Parabéns pelo post.

    Você poderia me informar qual seria o macete para que no chekout eu consegui-se
    gravar os novos campos na tabela do cliente?

    Não estou conseguindo de jeito nenhum fazer essa façanha.

    Desde já agradeço

    Luis Chaves

  5. Fabiano disse:

    Eu consegui fazer novos atributos de endereço, mas só funciona no 1.3 queria sabe o que preciso alterar para funcionar no 1.4?

    https://docs.google.com/Doc?docid=0Aac6d-CrjMb5ZGRxNDI0dHZfNjlnNjIzYnJjZg&hl=pt_BR

    Abraços!

  6. DinhoMasters disse:

    Olá Alisson!!
    Cara dada uma olhada ai depois no post acho que tem alguns erros!! ou talvez por ser tratar de uma versão mais antiga, talvez posso ser isso… Ali no passo 3 onde vc diz Mage/Customer/etc/config.xml não seria Mage/Sales/etc/config.xml??? Bem pelo menos na versão do magento 1.4.1.0 essa localização “” fica em Sales!!! Outra coisa também na hora de gerar o código na index.php esta dando um erro, pode ser tambem pela versão, mas tou colocando esse comentário, porque pode ser últil para outros que tem a mesma versão!!

    Até a próxima campeão!!

  7. Ajuda! disse:

    Boa tarde! Gostaria de uma ajuda, se possível!
    Eu adicionei o script abaixo para criar o campo de RG no magento. Porém, além de não dar certo, as configurações do cliente voltaram para o inglês, inclusive a account e Login da Home Page. Eu já desfiz as alterações no arquivo, conforme script abaixo, mas continua tudo em inglês. Se vc. puder me dar uma luz de como passar para o português novamente eu agradeceria muito, caso contrário, agradeço da mesma forma pelo espaço oportunizado. Segue abaixo o script:

    —————————

    Primeiramente você deve abrir o arquivo:

    app/design/frontend/default/seutema/customer/widget/taxvat.phtml

    No início do arquivo insira o seguinte conteúdo:

    addAttribute(’customer’, ‘rg’, array(
    ’label’ => ‘Rg’,
    ’visible’ => true,
    ’required’ => false,
    ’position’ => 1,
    ));

    $setup->addAttribute(’quote’, ‘customer_rg’, array(’type’ => ’static’, ‘visible’ => false));
    $setup->addAttribute(’order’, ‘customer_rg’, array(’type’ => ‘varchar’, ‘visible’ => false));

    $setup->getConnection()->addColumn(
    $setup->getTable(’sales_flat_quote’),
    ’customer_rg’,
    ’varchar(255) NULL DEFAULT NULL AFTER `customer_taxvat`’
    );
    ?>

    getRg();
    if (empty($rg)) {
    $rg = $this->getCustomer()->getRg();
    }
    ?>

    Agora essa parte você deve inserir após o bloco

    <label for=”getFieldId(’rg’)?>”>
    __(’RG / Insc. Estadual’) ?>
    isRequired()):?>*

    <input type=”text” id=”getFieldId(’rg’)?>” name=”getFieldName(’rg’)?>” value=”htmlEscape($rg) ?>” getFieldParams() ?> />

    Pronto, o campo Rg vai aparecer ao lado do CPF/CNPJ.

  8. Redner disse:

    Olá,

    Estou utilizando a versão 1.4.2 e este procedimento infelizmente não funciona, alguém saberia me ajudar?

    Preciso apenas replicar as informações extras do cadastro de usuário (CPF, RG, CNPJ…) para as informações do pedido.

  9. Cristian disse:

    Nao entendi essa parte de coloque no index.php e rode uma vez. Eu tenho que colocar aquele codigo em que parte do index? Acessar a loja e depois desfazer a edicao do index.php???? Help!

  10. Marco disse:

    Olá…

    alguém já testou na versão 1.6?

    ABRAÇO

  11. Jorge disse:

    Olá, muito bom o seu post, com ele foi possível identificar como o banco de dados do magento trabalha.

    Criei um campo adicional, alterei os arquivos register.phtml e também billing.phtml, o campo no banco de dados foi criado, mas al gravar as informações do usuário o sistema não está gravando os dados no banco para este campo

    poderia me ajudar, sabe me dizer de algo que precisa ser feito em algum arquivo para poder fazer a ação funcionar?

    obrigado

    Jorge

Deixe um comentário



© 2014 - Indexa Ltda. Todos os direitos reservados.