Categoria: geral

Magento: Módulo free para inclusão de CPF, RG, CNPJ e etc.

Olá Pessoal,

Depois de um longo tempo sem atualizações, voltaremos com força total.

Começarei disponibilizando para a comunidade um módulo para as versões 1.4.2 e 1.5.x.

Antes, gostaria de comer sobre algumas alterações do Magento. Alterações essas relacionadas ao cadastro de clientes.

Nas versões anteriores, era bem chato incluir um campo novo no cadastro de um cliente. Não era simplesmente chegar lá no “HTML”, cinluir o campo e pronto, acabou.
Além de alterar os arquivos relacionados ao cliente, também tínhamos que alterar arquivos de checkout, criar um novo módulo para sobrescrever configurações xml.

Bem, lá nos “primórdios”, havia a necessidade alterarmos 3 módulos: Customer, Checkout e Sales. Sem contar é claro, da criação de atributos no banco que eram meio “gambiarras”.

Era dificil aceitar como uma plataforma tão bacana como o Magento fosse tão falha nesse aspecto.

Esse pequeno problema as vezes impedia que um outro módulo tivesse uma distriuição masis bacana, pois havia a dependência da crianção “chata” de campos adicionais.

Parece que ouviram finalmente as nossas preces e desde a versão 1.4.2 está super tranquilo incluir atributos customizados no cadastro de usuário.

Quem estiver apenas atrás do módulo e não quiser acompanhar o tutorial que seguirá abaixo, pode fazer o download clicando

CustomAttributes
.

Este módulo vem com um “brinde”: O módulo para busca do endereço via ajax.
LEIAM o manual de instalação antes de utilizarem e qualquer problema, por favor envie seu comentário.

Vamos voltar então ao nosso tutorial…
Vou tentar usar uma linguagem menos técnica possível!

Hoje, basicamente o Magento estruturou o cadastro de cliente da seguinte maneira:

O cliente possui seus atributos básicos configurados em xml (para ser mais específica em uma tag fieldset – customer_account ).

Arquivo app/code/core/Mage/Catalog/etc/config.xml

<config>
    <modules>
        <Mage_Customer>
            <version>1.4.0.0.13</version>
        </Mage_Customer>
    </modules>
    <!--- ... -->
    <global>
<fieldsets>
            <customer_account></p>
<prefix><create>1</create><update>1</update><name>1</name></prefix>
                <firstname><create>1</create><update>1</update><name>1</name></firstname>
                <middlename><create>1</create><update>1</update><name>1</name></middlename>
                <lastname><create>1</create><update>1</update><name>1</name></lastname>
                <suffix><create>1</create><update>1</update><name>1</name></suffix>
                <email><create>1</create><update>1</update></email></p>
<password><create>1</create></password>
                <confirmation><create>1</create></confirmation>
                <dob><create>1</create><update>1</update></dob>
                <taxvat><create>1</create><update>1</update></taxvat>
                <gender><create>1</create><update>1</update></gender>
            </customer_account>
        </fieldsets>
    </global>
</config>
<!-- .... -->

Vocês podem verificar, que existem outros fieldsets nesse mesmo xml, como o customer dataflow.
Se vocês olharem o config.xml do Sales, também irão encontrar vários outros fieldsets.

Esse é o ponto inicial para a criação de novos atributos. Mas como sobrescrever então esses xmls??
Na verdade você não irá “sobrescrever” nada, pois ao criar um novo módulo e adicionar o fieldset customer_account, você estará apenas “incluindo”/”apendando” os itens no fieldset original, vamos assim dizer.

Partindo desse ponto, o que faz o Magento então?
Ao gerar um formulário ele verifica quais atributos do cliente devem ser utilizados naquele form ou não. Exemplo: você pode criar um atributo no cliente que deseja apenas que apareça no seu frontend, mas que quando você for cadastrar alguém no seu backend não deseja que ele sequer apareça.
Acho dificil acontecer esse tipo de situação, mas é assim que foi criada a nova estrutura.

Ou seja, não adianta criar os atributos e não dizer para o Magento onde eles irão aparecer.

Acho que de forma bem resumida, é assim que funciona.

Vamos criar o nosso módulo, para que fique mais claro.

PASSO 1) Criar a seguinte estrutura de arquivos:

+app/code/community/
+++++++++++Webgp
+++++++++++++Customer
+++++++++++++++etc
+++++++++++++++Model
+++++++++++++++sql

PASSO 2) Dentro da pasta etc vamos criar o arquivo config.xml com o seguinte conteúdo:

<config>
    <modules>
        <Webgp_Customer>
            <version>2.0.0</version>
        </Webgp_Customer>
    </modules>
<admin>
<fieldsets>
            <customer_dataflow>
                <rg><billing>1</billing><mapped>1</mapped></rg>
                <cpf><billing>1</billing><mapped>1</mapped></cpf>
                <cnpj><billing>1</billing><mapped>1</mapped></cnpj>
                <ie><billing>1</billing><mapped>1</mapped></ie>
                <tipopessoa><billing>1</billing><mapped>1</mapped></tipopessoa>
                <razaosocial><billing>1</billing><mapped>1</mapped></razaosocial>
            </customer_dataflow>
        </fieldsets>
    </admin>
   <global>
        <resources>
            <webgp_customer_setup>
                <setup>
                    <module>Webgp_Customer</module>
                    <class>Webgp_Customer_Model_Entity_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </webgp_customer_setup>
            <webgp_customer_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </webgp_customer_write>
            <webgp_customer_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </webgp_customer_read>
        </resources>
<fieldsets>
            <sales_copy_order_billing_address>
                <rg><to_order>*</to_order></rg>
                <cnpj><to_order>*</to_order></cnpj>
                <ie><to_order>*</to_order></ie>
                <tipopessoa><to_order>*</to_order></tipopessoa>
                <razaosocial><to_order>*</to_order></razaosocial>
                <cpf><to_order>*</to_order></cpf>
            </sales_copy_order_billing_address>
            <sales_copy_order_shipping_address>
                <rg><to_order>*</to_order></rg>
                <cnpj><to_order>*</to_order></cnpj>
                <ie><to_order>*</to_order></ie>
                <tipopessoa><to_order>*</to_order></tipopessoa>
                <razaosocial><to_order>*</to_order></razaosocial>
                <cpf><to_order>*</to_order></cpf>
            </sales_copy_order_shipping_address>
            <sales_convert_quote>
                <customer_cpf><to_order>*</to_order></customer_cpf>
                <customer_rg><to_order>*</to_order></customer_rg>
                <customer_cnpj><to_order>*</to_order></customer_cnpj>
                <customer_ie><to_order>*</to_order></customer_ie>
                <customer_tipopessoa><to_order>*</to_order></customer_tipopessoa>
                <customer_razaosocial><to_order>*</to_order></customer_razaosocial>
            </sales_convert_quote>
            <sales_convert_quote_address>
                <cpf><to_order>*</to_order><to_order_address>*</to_order_address><to_customer_address>*</to_customer_address></cpf>
                <rg><to_order>*</to_order><to_order_address>*</to_order_address><to_customer_address>*</to_customer_address></rg>
                <cnpj><to_order>*</to_order><to_order_address>*</to_order_address><to_customer_address>*</to_customer_address></cnpj>
                <ie><to_order>*</to_order><to_order_address>*</to_order_address><to_customer_address>*</to_customer_address></ie>
                <tipopessoa><to_order>*</to_order><to_order_address>*</to_order_address><to_customer_address>*</to_customer_address></tipopessoa>
                <razaosocial><to_order>*</to_order><to_order_address>*</to_order_address><to_customer_address>*</to_customer_address></razaosocial>
            </sales_convert_quote_address>
            <sales_convert_order>
                <customer_cpf><to_quote>*</to_quote></customer_cpf>
                <customer_rg><to_quote>*</to_quote></customer_rg>
                <customer_cnpj><to_quote>*</to_quote></customer_cnpj>
                <customer_ie><to_quote>*</to_quote></customer_ie>
                <customer_tipopessoa><to_quote>*</to_quote></customer_tipopessoa>
                <customer_razaosocial><to_quote>*</to_quote></customer_razaosocial>
            </sales_convert_order>
            <sales_convert_order_address>
                <cpf><to_quote_address>*</to_quote_address></cpf>
                <rg><to_quote_address>*</to_quote_address></rg>
                <ie><to_quote_address>*</to_quote_address></ie>
                <cnpj><to_quote_address>*</to_quote_address></cnpj>
                <tipopessoa><to_quote_address>*</to_quote_address></tipopessoa>
                <razaosocial><to_quote_address>*</to_quote_address></razaosocial>
            </sales_convert_order_address>
            <customer_account>
                <rg><create>1</create><update>1</update></rg>
                <cpf><create>1</create><update>1</update></cpf>
                <cnpj><create>1</create><update>1</update></cnpj>
                <ie><create>1</create><update>1</update></ie>
                <tipopessoa><create>1</create><update>1</update></tipopessoa>
                <razaosocial><create>1</create><update>1</update></razaosocial>
            </customer_account>
            <checkout_onepage_billing>
                <cpf><to_customer>cpf</to_customer></cpf>
                <cnpj><to_customer>cnpj</to_customer></cnpj>
                <ie><to_customer>ie</to_customer></ie>
                <rg><to_customer>rg</to_customer></rg>
                <razaosocial><to_customer>razaosocial</to_customer></razaosocial>
                <tipopessoa><to_customer>tipopessoa</to_customer></tipopessoa>
            </checkout_onepage_billing>
             <checkout_onepage_quote>
                <customer_cpf>
                    <name>1</name>
                    <to_customer>cpf</to_customer>
                </customer_cpf>
                <customer_cnpj>
                    <name>1</name>
                    <to_customer>cnpj</to_customer>
                </customer_cnpj>
                <customer_ie>
                    <name>1</name>
                    <to_customer>ie</to_customer>
                </customer_ie>
                <customer_razaosocial>
                    <name>1</name>
                    <to_customer>razaosocial</to_customer>
                </customer_razaosocial>
                <customer_rg>
                    <name>1</name>
                    <to_customer>rg</to_customer>
                </customer_rg>
                <customer_tipopessoa>
                    <name>1</name>
                    <to_customer>tipopessoa</to_customer>
                </customer_tipopessoa>
            </checkout_onepage_quote>
        </fieldsets>
    </global>
</config>

Grande o arquivo certo? Bem, nele compilamos todos os fieldsets que utilizam os atributos do cliente. Interessante notar o fieldset checkout_onepage_billing. Se você deseja que seu atributo seja incluído durante o cadastro direto na página de checkout, bem, você precisa indicar ali os atributos.
Lembre-se que durante a página de cadastro simples, o magento simplesmente pega os dados do formulário e salva no banco como cliente. Mas, quando o cadastro é feito na página de checkout, estamos trabalhando com objetos do tipo Order e Quote. Dessa forma, precisamos fazer um “de -> para” entre Order/Quote e Customer.
Acho que olhando o código acima dá para ver isso facilmente.

PASSO 3)Este passo eu realmente não parei para ver se é necessário, mas por via das dúvidas é melhor fazê-lo.
Dentro da pasta Model, crie uma pasta chamada Entity e por fim um arquivo chamado Setup.php (app/code/community/Webgp/Model/Entity/Setup.php):

class Webgp_Customer_Model_Entity_Setup extends Mage_Customer_Model_Entity_Setup
{
    public function getDefaultEntities()
    {
        return array(
            'customer' => array(
                'entity_model'          =>'customer/customer',
                'table'                 => 'customer/entity',
                'increment_model'       => 'eav/entity_increment_numeric',
                'increment_per_store'   => false,
                'additional_attribute_table' => 'customer/eav_attribute',
                'entity_attribute_collection' => 'customer/attribute_collection',
                'attributes' => array(
//                    'entity_id'         => array('type'=>'static'),
//                    'entity_type_id'    => array('type'=>'static'),
//                    'attribute_set_id'  => array('type'=>'static'),
//                    'increment_id'      => array('type'=>'static'),
//                    'created_at'        => array('type'=>'static'),
//                    'updated_at'        => array('type'=>'static'),
//                    'is_active'         => array('type'=>'static'),
                  'website_id' => array(
                        'type'          => 'static',
                        'label'         => 'Associate to Website',
                        'input'         => 'select',
                        'source'        => 'customer/customer_attribute_source_website',
                        'backend'       => 'customer/customer_attribute_backend_website',
                        'sort_order'    => 10,
                    ),
                    'store_id' => array(
                        'type'          => 'static',
                        'label'         => 'Create In',
                        'input'         => 'select',
                        'source'        => 'customer/customer_attribute_source_store',
                        'backend'       => 'customer/customer_attribute_backend_store',
                        'visible'       => false,
                        'sort_order'    => 20,
                    ),
                    'created_in' => array(
                        'type'          => 'varchar',
                        'label'         => 'Created From',
                        'sort_order'    => 30,
                    ),
                    'prefix' => array(
                        'label'         => 'Prefix',
                        'required'      => false,
                        'sort_order'    => 37,
                    ),
                    'firstname' => array(
                        'label'         => 'First Name',
                        'sort_order'    => 40,
                    ),
                    'middlename' => array(
                        'label'         => 'Middle Name/Initial',
                        'required'      => false,
                        'sort_order'    => 43,
                    ),
                    'lastname' => array(
                        'label'         => 'Last Name',
                        'sort_order'    => 50,
                    ),
                    'suffix' => array(
                        'label'         => 'Suffix',
                        'required'      => false,
                        'sort_order'    => 53,
                    ),
                    'email' => array(
                        'type'          => 'static',
                        'label'         => 'Email',
                        'class'         => 'validate-email',
                        'sort_order'    => 60,
                    ),
                    'group_id' => array(
                        'type'          => 'static',
                        'input'         => 'select',
                        'label'         => 'Group',
                        'source'        => 'customer/customer_attribute_source_group',
                        'sort_order'    => 70,
                    ),
                    'dob' => array(
                        'type'          => 'datetime',
                        'input'         => 'date',
                        'backend'       => 'eav/entity_attribute_backend_datetime',
                        'required'      => false,
                        'label'         => 'Date Of Birth',
                        'sort_order'    => 80,
                    ),
                    'password_hash' => array(
                        'input'         => 'hidden',
                        'backend'       => 'customer/customer_attribute_backend_password',
                        'required'      => false,
                    ),
                    'default_billing' => array(
                        'type'          => 'int',
                        'visible'       => false,
                        'required'      => false,
                        'backend'       => 'customer/customer_attribute_backend_billing',
                    ),
                    'default_shipping' => array(
                        'type'          => 'int',
                        'visible'       => false,
                        'required'      => false,
                        'backend'       => 'customer/customer_attribute_backend_shipping',
                    ),
                    'taxvat' => array(
                        'label'         => 'Tax/VAT Number',
                        'visible'       => true,
                        'required'      => false,
                    ),
                    'confirmation' => array(
                        'label'         => 'Is Confirmed',
                        'visible'       => false,
                        'required'      => false,
                    ),
                    'created_at' => array(
                        'type'          => 'static',
                        'label'         => 'Created At',
                        'visible'       => false,
                        'required'      => false,
                        'input'         => 'date',
                    ),
                    'rg' => array(
                        'label'         => 'Rg',
                        'visible'       => true,
                        'required'      => false,
                        'sort_order'    => 70,
                    ),
                    'cpf' => array(
                        'label'         => 'Cpf',
                        'visible'       => true,
                        'required'      => false,
                        'class'         => 'validate-cpf',
                        'sort_order'    => 80,
                    ),
                    'cnpj' => array(
                        'label'         => 'Cnpj',
                        'visible'       => true,
                        'required'      => false,
                        'class'         => 'validate-cnpj',
                        'sort_order'    => 70,
                    ),
                    'ie' => array(
                        'label'         => 'ie',
                        'visible'       => false,
                        'required'      => false,
                        'sort_order'    => 80,
                    ),
                    'tipopessoa' => array(
                        'label'         => 'Tipo Pessoa',
                        'input'                => 'select',
                        'source'            => 'customer/customer_attribute_source_tipopessoa',
                        'visible'       => true,
                        'required'      => true,
                        'sort_order'    => 80,
                    ),
                    'razaosocial' => array(
                        'label'         => 'Razao Social',
                        'visible'       => true,
                        'required'      => false,
                        'sort_order'    => 80,
                    ),
                ),
            ),
            'customer_address'=>array(
                'entity_model'  =>'customer/customer_address',
                'table' => 'customer/address_entity',
                'additional_attribute_table' => 'customer/eav_attribute',
                'entity_attribute_collection' => 'customer/address_attribute_collection',
                'attributes' => array(
//                    'entity_id'         => array('type'=>'static'),
//                    'entity_type_id'    => array('type'=>'static'),
//                    'attribute_set_id'  => array('type'=>'static'),
//                    'increment_id'      => array('type'=>'static'),
//                    'parent_id'         => array('type'=>'static'),
//                    'created_at'        => array('type'=>'static'),
//                    'updated_at'        => array('type'=>'static'),
//                    'is_active'         => array('type'=>'static'),
                    'prefix' => array(
                        'label'         => 'Prefix',
                        'required'      => false,
                        'sort_order'    => 7,
                    ),
                    'firstname' => array(
                        'label'         => 'First Name',
                        'sort_order'    => 10,
                    ),
                    'middlename' => array(
                        'label'         => 'Middle Name/Initial',
                        'required'      => false,
                        'sort_order'    => 13,
                    ),
                    'lastname' => array(
                        'label'         => 'Last Name',
                        'sort_order'    => 20,
                    ),
                    'suffix' => array(
                        'label'         => 'Suffix',
                        'required'      => false,
                        'sort_order'    => 23,
                    ),
                    'company' => array(
                        'label'         => 'Company',
                        'required'      => false,
                        'sort_order'    => 30,
                    ),
                    'street' => array(
                        'type'          => 'text',
                        'backend'       => 'customer_entity/address_attribute_backend_street',
                        'input'         => 'multiline',
                        'label'         => 'Street Address',
                        'sort_order'    => 40,
                    ),
                    'city' => array(
                        'label'         => 'City',
                        'sort_order'    => 50,
                    ),
                    'country_id' => array(
                        'type'          => 'varchar',
                        'input'         => 'select',
                        'label'         => 'Country',
                        'class'         => 'countries',
                        'source'        => 'customer_entity/address_attribute_source_country',
                        'sort_order'    => 60,
                    ),
                    'region' => array(
                        'backend'       => 'customer_entity/address_attribute_backend_region',
                        'label'         => 'State/Province',
                        'class'         => 'regions',
                        'sort_order'    => 70,
                    ),
                    'region_id' => array(
                        'type'          => 'int',
                        'input'         => 'hidden',
                        'source'        => 'customer_entity/address_attribute_source_region',
                        'required'      => 'false',
                        'sort_order'    => 80,
                        'label'         => 'State/Province'
                    ),
                    'postcode' => array(
                        'label'         => 'Zip/Postal Code',
                        'sort_order'    => 90,
                    ),
                    'telephone' => array(
                        'label'         => 'Telephone',
                        'sort_order'    => 100,
                    ),
                    'fax' => array(
                        'label'         => 'Fax',
                        'required'      => false,
                        'sort_order'    => 110,
                    ),
                ),
            ),
        );
    }
}

Na verdade apenas incluímos os campos em customer.

Passo 4) Dentro da pasta sql crie um pasta chamada webgp_customer_setup. Dentro desta pasta crie um arquivo chamado mysql4-install-1.0.0.php, com o seguinte conteúdo:

<?php $installer = $this; $installer->startSetup();
$installer->addAttribute( 'customer', 'cpf', array(
      'label'   => 'Cpf',
      'type'    => 'varchar',
      'input'   => 'text',
      'visible' => true,
      'required'  => false,
      'position'  => 1,
    )
);
Mage::getSingleton( 'eav/config' )
    ->getAttribute( 'customer', 'cpf' )
    ->setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    ->save();
$installer->addAttribute( 'customer', 'rg', array(
      'label'   => 'Rg',
      'type'    => 'varchar',
      'input'   => 'text',
      'visible' => true,
      'required'  => false,
      'position'  => 1,
    )
);
Mage::getSingleton( 'eav/config' )
    ->getAttribute( 'customer', 'rg' )
    ->setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    ->save();
$installer->addAttribute( 'customer', 'tipopessoa', array(
      'label'   => 'Tipo Pessoa',
      'type'    => 'varchar',
      'input'   => 'text',
      'visible' => true,
      'required'  => true,
      'position'  => 1,
    )
);
Mage::getSingleton( 'eav/config' )
    ->getAttribute( 'customer', 'tipopessoa' )
    ->setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    ->save();
$installer->addAttribute( 'customer', 'cnpj', array(
      'label'   => 'Cnpj',
      'type'    => 'varchar',
      'input'   => 'text',
      'visible' => true,
      'required'  => false,
      'position'  => 1,
    )
);
Mage::getSingleton( 'eav/config' )
    ->getAttribute( 'customer', 'cnpj' )
    ->setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    ->save();
$installer->addAttribute( 'customer', 'ie', array(
      'label'   => 'Inscr Estadual',
      'type'    => 'varchar',
      'input'   => 'text',
      'visible' => true,
      'required'  => false,
      'position'  => 1,
    )
);
Mage::getSingleton( 'eav/config' )
    ->getAttribute( 'customer', 'ie' )
    ->setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    ->save();
$installer->addAttribute( 'customer', 'razaosocial', array(
      'label'   => 'Razao Social',
      'type'    => 'varchar',
      'input'   => 'text',
      'visible' => true,
      'required'  => false,
      'position'  => 1,
    )
);
Mage::getSingleton( 'eav/config' )
    ->getAttribute( 'customer', 'razaosocial' )
    ->setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    ->save();
try {
    $installer->run("ALTER TABLE {$this->getTable('sales_flat_quote')} ADD COLUMN `customer_cpf` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_dob`;");
    $installer->run("ALTER TABLE {$this->getTable('sales_flat_quote')} ADD COLUMN `customer_cnpj` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_cpf`;");
    $installer->run("ALTER TABLE {$this->getTable('sales_flat_quote')} ADD COLUMN `customer_tipopessoa` VARCHAR(2) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_cnpj`;");
    $installer->run("ALTER TABLE {$this->getTable('sales_flat_quote')} ADD COLUMN `customer_ie` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_tipopessoa`;");
    $installer->run("ALTER TABLE {$this->getTable('sales_flat_quote')} ADD COLUMN `customer_razaosocial` VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_ie`;");
    $installer->run("ALTER TABLE {$this->getTable('sales_flat_quote')} ADD COLUMN `customer_rg` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_razaosocial`;");
}
catch (Exception $e) {
}
$installer->endSetup();
?>

O que esse arquivo faz??
Quando o seu módulo for instalado este arquivo de setup será executado. Ele irá adicionar no seu banco de dados os atributos cpf, cnpj, ie, razaosocial, rg e tipopessoa. Além de adicionar os atributos, ele irá dizer para o Magento em quais formulários esses atributos irão aparecer:

array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout')

Ou seja, irão aparecer na criação e edição do cadastro (frontend), na criação e edição via painel Administrativo, durante o processo de checkout (tanto frontend como backend).

Mas aí você pode perguntar: Mas na página de cadastro e edição, não é o magento que gera os html. Para que então a necessidade de fazer a configuração explicada acima?
Ele não gera o html, mas durante o processo onde é criado o objeto Customer, só são incluídos os campos relacionados na tabela customer_form_attribute, com o valor de customer_account_create ou qualquer outro tipo.
O mesmo acontece durante a criação do objeto Customer a partir de um objeto Order/Quote.
Não adianta ter configurado o config.xml corretamente se não estiver na tabela customer_form_attribute.

Pronto! A parte de codificação está pronta.
Ahh, falta agora criarmos o arquivo de “ativação” do nosso módulo, que fará com que o magento o reconheça.

Passo 5) Em app/etc/modules crie um arquivo chamado Webgp_Customer.xml, com o seguinte conteúdo:

<?xml version="1.0"?>
<config>
<modules>
<Webgp_Customer>
<active>true</active>
<codePool>community</codePool>
</Webgp_Customer>
</modules>
</config>

Passo 6) O último passo é a configuração do seu template, para que os campos apareçam certo?

****app/design/frontend/seutemlate/seutema/template/customer/form/edit.phtml

<div>
<ul><li>
<input type="radio" name="tipopessoa" id="pf" value="pf" <?php if($this->htmlEscape($this->getCustomer()->getTipopessoa()) =="pf"): ?> checked="checked" <?php endif; ?> title="Pessoa F&iacute;sica" onclick="$('dados01').style.display='none';$('cnpj').removeClassName('validar_cnpj');$('razaosocial').removeClassName('required-entry');$('dados02').style.display='block';$('cpf').addClassName('required-entry');$('cnpj').addClassName('required-entry');" class="radio" />&nbsp;&nbsp;Pessoa F&iacute;sica
<input type="radio" name="tipopessoa" id="pj" value="pj" <?php if($this->htmlEscape($this->getCustomer()->getTipopessoa()) =="pj"): ?> checked="checked" <?php endif; ?> title="Pessoa Jur&iacute;dica" onclick="$('dados01').style.display='block';$('dados02').style.display='none';$('cpf').removeClassName('required-entry');$('rg').removeClassName('required-entry');$('cnpj').addClassName('validar_cnpj');$('empresa').addClassName('required-entry');$('razaosocial').addClassName('required-entry');" class="radio">&nbsp;&nbsp;Pessoa Jur&iacute;dica
</li>
</div>
<div class="fieldset" <?php if($this->htmlEscape($this->getCustomer()->getTipopessoa()) =="pf"): ?> style="display:none;" <?php endif; ?> id="dados01">
<h2 class="legend">Dados da Empresa - Cliente de Atacado</h4>
<h5>Preencha os dados da empresa somente para compras como cliente corporativo</h5>
<ul class="form-list">
<li class="fields">
<div >
<div class="field">
<label for="razaosocial" class="required">Raz&atilde;o Social<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="razaosocial" value="<?php echo $this->htmlEscape($this->getCustomer()->getRazaosocial()) ?>" id="razaosocial" title="Raz&atilde;o Social" class="input-text" />
</div>
</div>
</div>
</li>
<li class="fields">
<div >
<div class="field">
<label for="cnpj" class="required">CNPJ<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="cnpj" id="cnpj" title="CNPJ" class="input-text" value="<?php echo $this->htmlEscape($this->getCustomer()->getCnpj()) ?>"/>
</div>
</div>
<div class="field">
<label for="ie">IE </label><br/>
<div class="input-box">
<input type="text" name="ie" id="ie" title="IE" class="input-text" value="<?php echo $this->htmlEscape($this->getCustomer()->getIe()) ?>"/>
</div>
</div>
</div>
</li>
</ul>
</div>

<div class="fieldset" id="dados02" <?php if($this->htmlEscape($this->getCustomer()->getTipopessoa()) =="pj"): ?> style="display:none;" <?php endif; ?>>
<h2 class="legend">Dados da Pessoa F&iacute;sica</h4>
<ul class="form-list">
<li class="fields">
<div >
<div class="field">
<label for="rg" class="required">Rg<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="rg" id="rg" title="Rg" class="input-text required-entry" value="<?php echo $this->htmlEscape($this->getCustomer()->getRg()) ?>"/>
</div>
</div>
<div class="field">
<label for="cpf" class="required">Cpf<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="cpf" id="cpf" title="Cpf" class="input-text required-entry" value="<?php echo $this->htmlEscape($this->getCustomer()->getCpf()) ?>"/>
</div>
</div>
</div>
</li>
</ul>
</div>

****app/design/frontend/seutemlate/seutema/template/customer/form/register.phtml


<div>
<ul>
<li>
<input type="radio" name="tipopessoa" id="pf" value="pf" checked="checked" title="Pessoa F&iacute;sica" onclick="$('dados01').style.display='none';$('cnpj').removeClassName('validar_cnpj');$('razaosocial').removeClassName('required-entry');$('dados02').style.display='block';$('cpf').addClassName('required-entry');$('cnpj').addClassName('required-entry');" class="radio" />&nbsp;&nbsp;Pessoa F&iacute;sica
<input type="radio" name="tipopessoa" id="pj" value="pj" title="Pessoa Jur&iacute;dica" onclick="$('dados01').style.display='block';$('dados02').style.display='none';$('cpf').removeClassName('required-entry');$('rg').removeClassName('required-entry');$('cnpj').addClassName('validar_cnpj');$('empresa').addClassName('required-entry');$('razaosocial').addClassName('required-entry');" class="radio">&nbsp;&nbsp;Pessoa Jur&iacute;dica
</li>

</ul>
</div>

<div class="fieldset no-display" id="dados01">
<h2 class="legend">Dados da Empresa - Cliente de Atacado</h4>
<h5>Preencha os dados da empresa somente para compras como cliente corporativo</h5>
<ul class="form-list">
<li class="fields">
<div >
<div class="field">
<label for="razaosocial" class="required">Raz&atilde;o Social<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="razaosocial" id="razaosocial" title="Raz&atilde;o Social" class="input-text" />
</div>
</div>
</div>
</li>
<li class="fields">
<div >
<div class="field">
<label for="cnpj" class="required">CNPJ<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="cnpj" id="cnpj" title="CNPJ" class="input-text" />
</div>
</div>
<div class="field">
<label for="ie">IE </label><br/>
<div class="input-box">
<input type="text" name="ie" id="ie" title="IE" class="input-text" />
</div>
</div>
</div>
</li>
</ul>
</div>

<div class="fieldset" id="dados02">
<h2 class="legend">Dados da Pessoa F&iacute;sica</h4>
<ul class="form-list">
<li class="fields">
<div >
<div class="field">
<label for="rg" class="required">Rg<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="rg" id="rg" title="Rg" class="input-text required-entry" />
</div>
</div>
<div class="field">
<label for="cpf" class="required">Cpf<em>*</em> </label><br/>
<div class="input-box">
<input type="text" name="cpf" id="cpf" title="Cpf" class="input-text required-entry" />
</div>
</div>
</div>
</li>
</ul>
</div>

Acho que os dois exemplos acima são suficientes. Não esqueça de alterar o arquivo relacionado ao checkout:

app/design/frontend/seutemplate/seutema/template/checkout/onepage/billing.phtml

AVISO: No pacote disponibilizado, os arquivos de template estão já configurados para utilizar o módulo ajax para endereço chamado Webgp_AjaxEnd. Além disso, tb já acompanha as configurações para a máscara e um arquivo js para validação do CPF e do CNPJ.
Os templates foram colocados em um nome tema chamado webgp. Ou seja, será criado no seu magento a estrutura app/design/frontend/default/webgp e dentro dela estarão os templates. Não esqueça de substituir os arquivos do SEU template/tema pelos enviados.

Comentários são bem vindos!

Tags:,

ATENÇÃO: Instabilidade no Blog e Site principal

Boa noite pessoal,

Gostaria de avisá-los que entre hoje e amanhã o site e o blog webgp.com.br poderão ficar instáveis e até mesmo indisponíveis.
A razão para isso é a mudança do blog(wordpress) para funcionar “dentro” do nosso novo site principal (Magento).

Magento: Mais layouts free

Pessoal, mais 2 links de layouts free interessantes:

http://www.magentocommerce.com/magento-connect/Mage-World/extension/1937/freepop–magento-theme

http://www.magentocommerce.com/magento-connect/Mage-World/extension/1758/hm-modern-theme-white-skin

Oscommerce: Obtendo Categorias de forma Hierárquica

Como dito no artigo anterior, nos próximos artigos vamos discutir como importar os dados do oscommerce para o Magento de forma manual.

Para importarmos as categorias no Magento vamos precisamos que as mesmas obedeçam a seguinte regra no nosso arquivo csv de importação:

CATEGORIA PAI/CATEGORIA FILHA 1/ CATEGORIA FILHA 2

No Oscommerce que estamos exportando os dados (desculpe, mas não sei precisar qual versão) temos 2 tabelas importantes: categories e categories_description.

O script que iremos utilizar para importarmos os dados no Magento só precisa dos nomes das categorias..Não iremos importar imagens, descrições, tags e nada.

Mas, já é um começo certo? Se der, irei postar como atualizar depois as categorias com outros campos.

Na tabela principal categories temos os atributos de categories_id e parent_id, que são responsáveis pela nossa “hierarquia”.

Na tabela categories_description temos o nome da categoria (que realmente nos importa).

Como então tratar as informações das duas tabelas para obter o resultado CATEGORIA PAI/CATEGORIA FILHA/…??

Eu utilizei uma query sql relativamente simples:

SELECT t1.categories_name AS lev1, t2.categories_name as lev2, t3.categories_name as lev3, t4.categories_name as lev4, t5.categories_name as lev5, t6.categories_name as lev6, COALESCE(CONCAT_WS(&quot;/&quot;,t1.categories_name, t2.categories_name, t3.categories_name, t4.categories_name, t5.categories_name, t6.categories_name), CONCAT_WS(&quot;/&quot;,t1.categories_name, t2.categories_name, t3.categories_name, t4.categories_name, t5.categories_name), CONCAT_WS(&quot;/&quot;,t1.categories_name, t2.categories_name, t3.categories_name, t4.categories_name), CONCAT_WS(&quot;/&quot;,t1.categories_name, t2.categories_name, t3.categories_name), CONCAT_WS(&quot;/&quot;,t1.categories_name, t2.categories_name),CONCAT_WS(&quot;/&quot;,t1.categories_name)) AS final
FROM (SELECT categories.categories_id, categories_description.categories_name, categories.parent_id FROM categories JOIN categories_description
ON categories.categories_id = categories_description.categories_id) AS t1
LEFT JOIN (SELECT categories.categories_id, categories_description.categories_name, categories.parent_id FROM categories JOIN categories_description
ON categories.categories_id = categories_description.categories_id) AS t2 ON t2.parent_id = t1.categories_id
LEFT JOIN (SELECT categories.categories_id, categories_description.categories_name, categories.parent_id FROM categories JOIN categories_description
ON categories.categories_id = categories_description.categories_id) AS t3 ON t3.parent_id = t2.categories_id
LEFT JOIN (SELECT categories.categories_id, categories_description.categories_name, categories.parent_id FROM categories JOIN categories_description
ON categories.categories_id = categories_description.categories_id) AS t4 ON t4.parent_id = t3.categories_id
LEFT JOIN (SELECT categories.categories_id, categories_description.categories_name, categories.parent_id FROM categories JOIN categories_description
ON categories.categories_id = categories_description.categories_id) AS t5 ON t5.parent_id = t4.categories_id
LEFT JOIN (SELECT categories.categories_id, categories_description.categories_name, categories.parent_id FROM categories JOIN categories_description
ON categories.categories_id = categories_description.categories_id) AS t6 ON t6.parent_id = t5.categories_id;

No meu oscommerce eu tenho 6 níveis de categorias, sendo assim utilizei até lev6. Caso você tenha mais ou menos, basta adequar o código.
Essa query retorna o nome de todas as categorias, em todos os níveis (apenas para fins comparativos) e na coluna final ela apresenta os dados formatados, prontos para utilização.

Tags:, ,

Novidades….

Olá Pessoal,

Gostaria de agradecer novamente a vocês pelos acessos e contribuições que estão dando para o WebGP.

O feedback de vocês é muito importante para assim melhorarmos o conteúdo do blog, do portal e dos nossos serviços!

Bem, gostaria de dividir com vocês algumas novidades que estão chegando por aí:

Módulos Magento:

  • Módulo de Integração Magento – Mercado Livre
  • Módulo de Integração Magento – TodaOferta
  • Módulo de Integração Magento – ShoppingUol
  • Módulo de Integração Magento – Twitter

Novos Serviços

  • Hospedagem/Configuração ATutor
  • Hospedagem/Configuração eFront

Como não poderia deixar de ser, devido aos nossos novos serviços você irá contar com bastante artigos sobre ATutor e eFront (fortes concorrentes do Moodle que estão roubando o mercado).

Espero que vocês curtam e continuem contribuindo com o nosso portal WebGP.

Obrigada

Tags:, , ,

Magento 1.4.0.x não entra no Backend

Muitas pessoas têm procurado o blog por causa desse pequeno problema…:

Ao finalizar a instalação do Magento, é oferecido um link para o Backend e outro para o Frontend.

Acontece que todos os links enviam para o frontend (para a loja e não para o painel administrativo).

Para acessarem o backend basta colocar /admin na sua url: www.minhaloja.com.br/admin (caso vc tenha instalado sua loja em www.minhaloja.com.br/loja você deverá acrescentar o /admin ficando www.minhaloja.com.br/loja/admin).

Tags:

Magento: Módulo Pagseguro não aparece no site

Para quem está utilizando o módulo da Visie e encontrou, entre outros problemas, esse do módulo não aparecer durante a finalizaçao da compra, veja o post http://blog.gustavopaes.net/post/201693979/pagseguro-no-magento-nao-aparece-na-lista-de-formas-de.

Tradução do Trellis Desk

Pessoal,

Estava procurando um sistema para controle de ticket e achei um muito legal, que eu não conhecia : Trellis Desk. Uma das coisas que mais chamou a atençao foi a parte visual, que sai um pouco do padrão otrs e osticket.
Ainda não pude testar as funcionalidades, mas já percebi que é bem interessante.

Um problema que achei foi a tradução.. O Osticket não suporta outros idiomas, você precisa usar versões paralelas para conseguir.. O OTRS é muito bom, suporta outros idiomas e é fácil colocar em português. O Trellis Desk também suporta vários idiomas mas o problema é achar estes pacotes. No forum desativado há um pacote em português. O problema é que você precisa importar um arquivo xml para carregar um idioma. O problema é que o pessoal do fórum não estava conseguindo exportar e o arquivo que tem anexo lá não funciona. Eu consegui fazer funcionar o pacote de arquivos disponibilizado no fórum e também exportar o idioma pt_BR. O problema é que o fórum está desativado e não consigo postar pro pessoal. Vai aqui então o arquivo xml:

lang_pt_BR_td.xml

O crédito dos arquivos é todo do rapaz do Fórum. Vou buscar o nome dele e creditar depois!

Tags:

Magento: Mais um template free

Template W002-Blue disponível para download em http://www.webgp.com.br/downloads

Magento: Novo Template Free

Gente, tá disponibilizado em http://www.webgp.com.br/index.php/downloads a versão Red do template já lançado ontem!

Tags:,

Solicite seu módulo

Gostaria de incluir alguma funcionalidade para seus clientes? Facilitar a administração das suas vendas? Integrar sua loja com algum serviço/sistema?

solicitar seu módulo agora

Últimos Artigos

Fique por dentro das nossas novidades!!

Quer ficar sabendo em primeira mão quando novos tutoriais forem postados? Assine nosso RSS.