<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Webgp :: Empresa Especializada em Magento</title>
	<atom:link href="http://www.webgp.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.webgp.com.br</link>
	<description>Empresa Especializada em Magento</description>
	<lastBuildDate>Mon, 10 Oct 2011 20:26:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Magento: Módulo free para Itaushopline</title>
		<link>http://www.webgp.com.br/2011/04/magento-modulo-free-para-itaushopline/</link>
		<comments>http://www.webgp.com.br/2011/04/magento-modulo-free-para-itaushopline/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 10:14:49 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://webgp.com.br/index.php/blog/?p=607</guid>
		<description><![CDATA[Olá Pessoal, tudo bem?? Tenhos um módulo itaushopline que foi [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal, tudo bem??</p>
<p>Tenhos um módulo itaushopline que foi desenvolvido ha um bom tempo (versão 1.2 do Magento se não me engano!).<br />
Bem, foi feita uma atualização do módulo mas precisamos de usuários que possam nos ajudar a testar.</p>
<p>Interessados em ajudar, por favor enviar adicionar o skype portalwebgp ou mandar um email para contato@webgp.com.br.</p>
<p>Futuramente serão solicitados usuários para o Bradesco Fácil tambem!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2011/04/magento-modulo-free-para-itaushopline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento: Módulo free para inclusão de CPF, RG, CNPJ e etc.</title>
		<link>http://www.webgp.com.br/2011/04/magento-modulo-free-para-inclusao-de-cpf-rg-cnpj-e-etc/</link>
		<comments>http://www.webgp.com.br/2011/04/magento-modulo-free-para-inclusao-de-cpf-rg-cnpj-e-etc/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 12:32:38 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://webgp.com.br/index.php/blog/?p=605</guid>
		<description><![CDATA[Olá Pessoal, Depois de um longo tempo sem atualizações, voltaremos [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Depois de um longo tempo sem atualizações, voltaremos com força total.</p>
<p>Começarei disponibilizando para a comunidade um módulo para as versões 1.4.2 e 1.5.x.</p>
<p>Antes, gostaria de comer sobre algumas alterações do Magento. Alterações essas relacionadas ao cadastro de clientes.</p>
<p>Nas versões anteriores, era bem chato incluir um campo novo no cadastro de um cliente. Não era simplesmente chegar lá no &#8220;HTML&#8221;, cinluir o campo e pronto, acabou.<br />
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.</p>
<p>Bem, lá nos &#8220;primórdios&#8221;, havia a necessidade alterarmos 3 módulos: Customer, Checkout e Sales. Sem contar é claro, da criação de atributos no banco que eram meio &#8220;gambiarras&#8221;.</p>
<p>Era dificil aceitar como uma plataforma tão bacana como o Magento fosse tão falha nesse aspecto.</p>
<p>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 &#8220;chata&#8221; de campos adicionais.</p>
<p>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.</p>
<p>Quem estiver apenas atrás do módulo e não quiser acompanhar o tutorial que seguirá abaixo, pode fazer o download clicando <a href="http://webgp.com.br/magento/media/free-download/customattributes.zip">AQUI</a>.</p>
<p>Este módulo vem com um &#8220;brinde&#8221;: O módulo para busca do endereço via ajax.<br />
LEIAM o manual de instalação antes de utilizarem e qualquer problema, por favor envie seu comentário.</p>
<p>Vamos voltar então ao nosso tutorial&#8230;<br />
Vou tentar usar uma linguagem menos técnica possível!</p>
<p>Hoje, basicamente o Magento estruturou o cadastro de cliente da seguinte maneira:</p>
<p>O cliente possui seus atributos básicos configurados em xml (para ser mais específica em uma tag fieldset &#8211; customer_account ).</p>
<p>Arquivo app/code/core/Mage/Catalog/etc/config.xml</p>
<pre class="brush: xml; title: ; notranslate">
&lt;config&gt;
    &lt;modules&gt;
        &lt;Mage_Customer&gt;
            &lt;version&gt;1.4.0.0.13&lt;/version&gt;
        &lt;/Mage_Customer&gt;
    &lt;/modules&gt;
    &lt;!--- ... --&gt;
    &lt;global&gt;
&lt;fieldsets&gt;
            &lt;customer_account&gt;&lt;/p&gt;
&lt;prefix&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;name&gt;1&lt;/name&gt;&lt;/prefix&gt;
                &lt;firstname&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;name&gt;1&lt;/name&gt;&lt;/firstname&gt;
                &lt;middlename&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;name&gt;1&lt;/name&gt;&lt;/middlename&gt;
                &lt;lastname&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;name&gt;1&lt;/name&gt;&lt;/lastname&gt;
                &lt;suffix&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;name&gt;1&lt;/name&gt;&lt;/suffix&gt;
                &lt;email&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/email&gt;&lt;/p&gt;
&lt;password&gt;&lt;create&gt;1&lt;/create&gt;&lt;/password&gt;
                &lt;confirmation&gt;&lt;create&gt;1&lt;/create&gt;&lt;/confirmation&gt;
                &lt;dob&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/dob&gt;
                &lt;taxvat&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/taxvat&gt;
                &lt;gender&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/gender&gt;
            &lt;/customer_account&gt;
        &lt;/fieldsets&gt;
    &lt;/global&gt;
&lt;/config&gt;
&lt;!-- .... --&gt;
</pre>
<p>Vocês podem verificar, que existem outros fieldsets nesse mesmo xml, como o customer dataflow.<br />
Se vocês olharem o config.xml do Sales, também irão encontrar vários outros fieldsets.</p>
<p>Esse é o ponto inicial para a criação de novos atributos. Mas como sobrescrever então esses xmls??<br />
Na verdade você não irá &#8220;sobrescrever&#8221; nada, pois ao criar um novo módulo e adicionar o fieldset customer_account, você estará apenas &#8220;incluindo&#8221;/&#8221;apendando&#8221; os itens no fieldset original, vamos assim dizer.</p>
<p>Partindo desse ponto, o que faz o Magento então?<br />
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.<br />
Acho dificil acontecer esse tipo de situação, mas é assim que foi criada a nova estrutura.</p>
<p>Ou seja, não adianta criar os atributos e não dizer para o Magento onde eles irão aparecer.</p>
<p>Acho que de forma bem resumida, é assim que funciona.</p>
<p>Vamos criar o nosso módulo, para que fique mais claro.</p>
<p>PASSO 1) Criar a seguinte estrutura de arquivos:</p>
<p>+app/code/<strong>community</strong>/<br />
+++++++++++<strong>Webgp</strong><br />
+++++++++++++<strong>Customer</strong><br />
+++++++++++++++<strong>etc</strong><br />
+++++++++++++++<strong>Model</strong><br />
+++++++++++++++<strong>sql</strong></p>
<p>PASSO 2) Dentro da pasta <strong>etc</strong> vamos criar o arquivo config.xml com o seguinte conteúdo:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;config&gt;
    &lt;modules&gt;
        &lt;Webgp_Customer&gt;
            &lt;version&gt;2.0.0&lt;/version&gt;
        &lt;/Webgp_Customer&gt;
    &lt;/modules&gt;
&lt;admin&gt;
&lt;fieldsets&gt;
            &lt;customer_dataflow&gt;
                &lt;rg&gt;&lt;billing&gt;1&lt;/billing&gt;&lt;mapped&gt;1&lt;/mapped&gt;&lt;/rg&gt;
                &lt;cpf&gt;&lt;billing&gt;1&lt;/billing&gt;&lt;mapped&gt;1&lt;/mapped&gt;&lt;/cpf&gt;
                &lt;cnpj&gt;&lt;billing&gt;1&lt;/billing&gt;&lt;mapped&gt;1&lt;/mapped&gt;&lt;/cnpj&gt;
                &lt;ie&gt;&lt;billing&gt;1&lt;/billing&gt;&lt;mapped&gt;1&lt;/mapped&gt;&lt;/ie&gt;
                &lt;tipopessoa&gt;&lt;billing&gt;1&lt;/billing&gt;&lt;mapped&gt;1&lt;/mapped&gt;&lt;/tipopessoa&gt;
                &lt;razaosocial&gt;&lt;billing&gt;1&lt;/billing&gt;&lt;mapped&gt;1&lt;/mapped&gt;&lt;/razaosocial&gt;
            &lt;/customer_dataflow&gt;
        &lt;/fieldsets&gt;
    &lt;/admin&gt;
   &lt;global&gt;
        &lt;resources&gt;
            &lt;webgp_customer_setup&gt;
                &lt;setup&gt;
                    &lt;module&gt;Webgp_Customer&lt;/module&gt;
                    &lt;class&gt;Webgp_Customer_Model_Entity_Setup&lt;/class&gt;
                &lt;/setup&gt;
                &lt;connection&gt;
                    &lt;use&gt;core_setup&lt;/use&gt;
                &lt;/connection&gt;
            &lt;/webgp_customer_setup&gt;
            &lt;webgp_customer_write&gt;
                &lt;connection&gt;
                    &lt;use&gt;core_write&lt;/use&gt;
                &lt;/connection&gt;
            &lt;/webgp_customer_write&gt;
            &lt;webgp_customer_read&gt;
                &lt;connection&gt;
                    &lt;use&gt;core_read&lt;/use&gt;
                &lt;/connection&gt;
            &lt;/webgp_customer_read&gt;
        &lt;/resources&gt;
&lt;fieldsets&gt;
            &lt;sales_copy_order_billing_address&gt;
                &lt;rg&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/rg&gt;
                &lt;cnpj&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/cnpj&gt;
                &lt;ie&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/ie&gt;
                &lt;tipopessoa&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/tipopessoa&gt;
                &lt;razaosocial&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/razaosocial&gt;
                &lt;cpf&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/cpf&gt;
            &lt;/sales_copy_order_billing_address&gt;
            &lt;sales_copy_order_shipping_address&gt;
                &lt;rg&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/rg&gt;
                &lt;cnpj&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/cnpj&gt;
                &lt;ie&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/ie&gt;
                &lt;tipopessoa&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/tipopessoa&gt;
                &lt;razaosocial&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/razaosocial&gt;
                &lt;cpf&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/cpf&gt;
            &lt;/sales_copy_order_shipping_address&gt;
            &lt;sales_convert_quote&gt;
                &lt;customer_cpf&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/customer_cpf&gt;
                &lt;customer_rg&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/customer_rg&gt;
                &lt;customer_cnpj&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/customer_cnpj&gt;
                &lt;customer_ie&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/customer_ie&gt;
                &lt;customer_tipopessoa&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/customer_tipopessoa&gt;
                &lt;customer_razaosocial&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;/customer_razaosocial&gt;
            &lt;/sales_convert_quote&gt;
            &lt;sales_convert_quote_address&gt;
                &lt;cpf&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;to_order_address&gt;*&lt;/to_order_address&gt;&lt;to_customer_address&gt;*&lt;/to_customer_address&gt;&lt;/cpf&gt;
                &lt;rg&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;to_order_address&gt;*&lt;/to_order_address&gt;&lt;to_customer_address&gt;*&lt;/to_customer_address&gt;&lt;/rg&gt;
                &lt;cnpj&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;to_order_address&gt;*&lt;/to_order_address&gt;&lt;to_customer_address&gt;*&lt;/to_customer_address&gt;&lt;/cnpj&gt;
                &lt;ie&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;to_order_address&gt;*&lt;/to_order_address&gt;&lt;to_customer_address&gt;*&lt;/to_customer_address&gt;&lt;/ie&gt;
                &lt;tipopessoa&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;to_order_address&gt;*&lt;/to_order_address&gt;&lt;to_customer_address&gt;*&lt;/to_customer_address&gt;&lt;/tipopessoa&gt;
                &lt;razaosocial&gt;&lt;to_order&gt;*&lt;/to_order&gt;&lt;to_order_address&gt;*&lt;/to_order_address&gt;&lt;to_customer_address&gt;*&lt;/to_customer_address&gt;&lt;/razaosocial&gt;
            &lt;/sales_convert_quote_address&gt;
            &lt;sales_convert_order&gt;
                &lt;customer_cpf&gt;&lt;to_quote&gt;*&lt;/to_quote&gt;&lt;/customer_cpf&gt;
                &lt;customer_rg&gt;&lt;to_quote&gt;*&lt;/to_quote&gt;&lt;/customer_rg&gt;
                &lt;customer_cnpj&gt;&lt;to_quote&gt;*&lt;/to_quote&gt;&lt;/customer_cnpj&gt;
                &lt;customer_ie&gt;&lt;to_quote&gt;*&lt;/to_quote&gt;&lt;/customer_ie&gt;
                &lt;customer_tipopessoa&gt;&lt;to_quote&gt;*&lt;/to_quote&gt;&lt;/customer_tipopessoa&gt;
                &lt;customer_razaosocial&gt;&lt;to_quote&gt;*&lt;/to_quote&gt;&lt;/customer_razaosocial&gt;
            &lt;/sales_convert_order&gt;
            &lt;sales_convert_order_address&gt;
                &lt;cpf&gt;&lt;to_quote_address&gt;*&lt;/to_quote_address&gt;&lt;/cpf&gt;
                &lt;rg&gt;&lt;to_quote_address&gt;*&lt;/to_quote_address&gt;&lt;/rg&gt;
                &lt;ie&gt;&lt;to_quote_address&gt;*&lt;/to_quote_address&gt;&lt;/ie&gt;
                &lt;cnpj&gt;&lt;to_quote_address&gt;*&lt;/to_quote_address&gt;&lt;/cnpj&gt;
                &lt;tipopessoa&gt;&lt;to_quote_address&gt;*&lt;/to_quote_address&gt;&lt;/tipopessoa&gt;
                &lt;razaosocial&gt;&lt;to_quote_address&gt;*&lt;/to_quote_address&gt;&lt;/razaosocial&gt;
            &lt;/sales_convert_order_address&gt;
            &lt;customer_account&gt;
                &lt;rg&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/rg&gt;
                &lt;cpf&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/cpf&gt;
                &lt;cnpj&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/cnpj&gt;
                &lt;ie&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/ie&gt;
                &lt;tipopessoa&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/tipopessoa&gt;
                &lt;razaosocial&gt;&lt;create&gt;1&lt;/create&gt;&lt;update&gt;1&lt;/update&gt;&lt;/razaosocial&gt;
            &lt;/customer_account&gt;
            &lt;checkout_onepage_billing&gt;
                &lt;cpf&gt;&lt;to_customer&gt;cpf&lt;/to_customer&gt;&lt;/cpf&gt;
                &lt;cnpj&gt;&lt;to_customer&gt;cnpj&lt;/to_customer&gt;&lt;/cnpj&gt;
                &lt;ie&gt;&lt;to_customer&gt;ie&lt;/to_customer&gt;&lt;/ie&gt;
                &lt;rg&gt;&lt;to_customer&gt;rg&lt;/to_customer&gt;&lt;/rg&gt;
                &lt;razaosocial&gt;&lt;to_customer&gt;razaosocial&lt;/to_customer&gt;&lt;/razaosocial&gt;
                &lt;tipopessoa&gt;&lt;to_customer&gt;tipopessoa&lt;/to_customer&gt;&lt;/tipopessoa&gt;
            &lt;/checkout_onepage_billing&gt;
             &lt;checkout_onepage_quote&gt;
                &lt;customer_cpf&gt;
                    &lt;name&gt;1&lt;/name&gt;
                    &lt;to_customer&gt;cpf&lt;/to_customer&gt;
                &lt;/customer_cpf&gt;
                &lt;customer_cnpj&gt;
                    &lt;name&gt;1&lt;/name&gt;
                    &lt;to_customer&gt;cnpj&lt;/to_customer&gt;
                &lt;/customer_cnpj&gt;
                &lt;customer_ie&gt;
                    &lt;name&gt;1&lt;/name&gt;
                    &lt;to_customer&gt;ie&lt;/to_customer&gt;
                &lt;/customer_ie&gt;
                &lt;customer_razaosocial&gt;
                    &lt;name&gt;1&lt;/name&gt;
                    &lt;to_customer&gt;razaosocial&lt;/to_customer&gt;
                &lt;/customer_razaosocial&gt;
                &lt;customer_rg&gt;
                    &lt;name&gt;1&lt;/name&gt;
                    &lt;to_customer&gt;rg&lt;/to_customer&gt;
                &lt;/customer_rg&gt;
                &lt;customer_tipopessoa&gt;
                    &lt;name&gt;1&lt;/name&gt;
                    &lt;to_customer&gt;tipopessoa&lt;/to_customer&gt;
                &lt;/customer_tipopessoa&gt;
            &lt;/checkout_onepage_quote&gt;
        &lt;/fieldsets&gt;
    &lt;/global&gt;
&lt;/config&gt;
</pre>
<p>Grande o arquivo certo? Bem, nele compilamos todos os fieldsets que utilizam os atributos do cliente. Interessante notar o fieldset <strong>checkout_onepage_billing</strong>. 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.<br />
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 &#8220;de -&gt; para&#8221; entre Order/Quote e Customer.<br />
Acho que olhando o código acima dá para ver isso facilmente.</p>
<p>PASSO 3)Este passo eu realmente não parei para ver se é necessário, mas por via das dúvidas é melhor fazê-lo.<br />
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):</p>
<pre class="brush: php; title: ; notranslate">
class Webgp_Customer_Model_Entity_Setup extends Mage_Customer_Model_Entity_Setup
{
    public function getDefaultEntities()
    {
        return array(
            'customer' =&gt; array(
                'entity_model'          =&gt;'customer/customer',
                'table'                 =&gt; 'customer/entity',
                'increment_model'       =&gt; 'eav/entity_increment_numeric',
                'increment_per_store'   =&gt; false,
                'additional_attribute_table' =&gt; 'customer/eav_attribute',
                'entity_attribute_collection' =&gt; 'customer/attribute_collection',
                'attributes' =&gt; array(
//                    'entity_id'         =&gt; array('type'=&gt;'static'),
//                    'entity_type_id'    =&gt; array('type'=&gt;'static'),
//                    'attribute_set_id'  =&gt; array('type'=&gt;'static'),
//                    'increment_id'      =&gt; array('type'=&gt;'static'),
//                    'created_at'        =&gt; array('type'=&gt;'static'),
//                    'updated_at'        =&gt; array('type'=&gt;'static'),
//                    'is_active'         =&gt; array('type'=&gt;'static'),
                  'website_id' =&gt; array(
                        'type'          =&gt; 'static',
                        'label'         =&gt; 'Associate to Website',
                        'input'         =&gt; 'select',
                        'source'        =&gt; 'customer/customer_attribute_source_website',
                        'backend'       =&gt; 'customer/customer_attribute_backend_website',
                        'sort_order'    =&gt; 10,
                    ),
                    'store_id' =&gt; array(
                        'type'          =&gt; 'static',
                        'label'         =&gt; 'Create In',
                        'input'         =&gt; 'select',
                        'source'        =&gt; 'customer/customer_attribute_source_store',
                        'backend'       =&gt; 'customer/customer_attribute_backend_store',
                        'visible'       =&gt; false,
                        'sort_order'    =&gt; 20,
                    ),
                    'created_in' =&gt; array(
                        'type'          =&gt; 'varchar',
                        'label'         =&gt; 'Created From',
                        'sort_order'    =&gt; 30,
                    ),
                    'prefix' =&gt; array(
                        'label'         =&gt; 'Prefix',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 37,
                    ),
                    'firstname' =&gt; array(
                        'label'         =&gt; 'First Name',
                        'sort_order'    =&gt; 40,
                    ),
                    'middlename' =&gt; array(
                        'label'         =&gt; 'Middle Name/Initial',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 43,
                    ),
                    'lastname' =&gt; array(
                        'label'         =&gt; 'Last Name',
                        'sort_order'    =&gt; 50,
                    ),
                    'suffix' =&gt; array(
                        'label'         =&gt; 'Suffix',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 53,
                    ),
                    'email' =&gt; array(
                        'type'          =&gt; 'static',
                        'label'         =&gt; 'Email',
                        'class'         =&gt; 'validate-email',
                        'sort_order'    =&gt; 60,
                    ),
                    'group_id' =&gt; array(
                        'type'          =&gt; 'static',
                        'input'         =&gt; 'select',
                        'label'         =&gt; 'Group',
                        'source'        =&gt; 'customer/customer_attribute_source_group',
                        'sort_order'    =&gt; 70,
                    ),
                    'dob' =&gt; array(
                        'type'          =&gt; 'datetime',
                        'input'         =&gt; 'date',
                        'backend'       =&gt; 'eav/entity_attribute_backend_datetime',
                        'required'      =&gt; false,
                        'label'         =&gt; 'Date Of Birth',
                        'sort_order'    =&gt; 80,
                    ),
                    'password_hash' =&gt; array(
                        'input'         =&gt; 'hidden',
                        'backend'       =&gt; 'customer/customer_attribute_backend_password',
                        'required'      =&gt; false,
                    ),
                    'default_billing' =&gt; array(
                        'type'          =&gt; 'int',
                        'visible'       =&gt; false,
                        'required'      =&gt; false,
                        'backend'       =&gt; 'customer/customer_attribute_backend_billing',
                    ),
                    'default_shipping' =&gt; array(
                        'type'          =&gt; 'int',
                        'visible'       =&gt; false,
                        'required'      =&gt; false,
                        'backend'       =&gt; 'customer/customer_attribute_backend_shipping',
                    ),
                    'taxvat' =&gt; array(
                        'label'         =&gt; 'Tax/VAT Number',
                        'visible'       =&gt; true,
                        'required'      =&gt; false,
                    ),
                    'confirmation' =&gt; array(
                        'label'         =&gt; 'Is Confirmed',
                        'visible'       =&gt; false,
                        'required'      =&gt; false,
                    ),
                    'created_at' =&gt; array(
                        'type'          =&gt; 'static',
                        'label'         =&gt; 'Created At',
                        'visible'       =&gt; false,
                        'required'      =&gt; false,
                        'input'         =&gt; 'date',
                    ),
                    'rg' =&gt; array(
                        'label'         =&gt; 'Rg',
                        'visible'       =&gt; true,
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 70,
                    ),
                    'cpf' =&gt; array(
                        'label'         =&gt; 'Cpf',
                        'visible'       =&gt; true,
                        'required'      =&gt; false,
                        'class'         =&gt; 'validate-cpf',
                        'sort_order'    =&gt; 80,
                    ),
                    'cnpj' =&gt; array(
                        'label'         =&gt; 'Cnpj',
                        'visible'       =&gt; true,
                        'required'      =&gt; false,
                        'class'         =&gt; 'validate-cnpj',
                        'sort_order'    =&gt; 70,
                    ),
                    'ie' =&gt; array(
                        'label'         =&gt; 'ie',
                        'visible'       =&gt; false,
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 80,
                    ),
                    'tipopessoa' =&gt; array(
                        'label'         =&gt; 'Tipo Pessoa',
                        'input'                =&gt; 'select',
                        'source'            =&gt; 'customer/customer_attribute_source_tipopessoa',
                        'visible'       =&gt; true,
                        'required'      =&gt; true,
                        'sort_order'    =&gt; 80,
                    ),
                    'razaosocial' =&gt; array(
                        'label'         =&gt; 'Razao Social',
                        'visible'       =&gt; true,
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 80,
                    ),
                ),
            ),
            'customer_address'=&gt;array(
                'entity_model'  =&gt;'customer/customer_address',
                'table' =&gt; 'customer/address_entity',
                'additional_attribute_table' =&gt; 'customer/eav_attribute',
                'entity_attribute_collection' =&gt; 'customer/address_attribute_collection',
                'attributes' =&gt; array(
//                    'entity_id'         =&gt; array('type'=&gt;'static'),
//                    'entity_type_id'    =&gt; array('type'=&gt;'static'),
//                    'attribute_set_id'  =&gt; array('type'=&gt;'static'),
//                    'increment_id'      =&gt; array('type'=&gt;'static'),
//                    'parent_id'         =&gt; array('type'=&gt;'static'),
//                    'created_at'        =&gt; array('type'=&gt;'static'),
//                    'updated_at'        =&gt; array('type'=&gt;'static'),
//                    'is_active'         =&gt; array('type'=&gt;'static'),
                    'prefix' =&gt; array(
                        'label'         =&gt; 'Prefix',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 7,
                    ),
                    'firstname' =&gt; array(
                        'label'         =&gt; 'First Name',
                        'sort_order'    =&gt; 10,
                    ),
                    'middlename' =&gt; array(
                        'label'         =&gt; 'Middle Name/Initial',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 13,
                    ),
                    'lastname' =&gt; array(
                        'label'         =&gt; 'Last Name',
                        'sort_order'    =&gt; 20,
                    ),
                    'suffix' =&gt; array(
                        'label'         =&gt; 'Suffix',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 23,
                    ),
                    'company' =&gt; array(
                        'label'         =&gt; 'Company',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 30,
                    ),
                    'street' =&gt; array(
                        'type'          =&gt; 'text',
                        'backend'       =&gt; 'customer_entity/address_attribute_backend_street',
                        'input'         =&gt; 'multiline',
                        'label'         =&gt; 'Street Address',
                        'sort_order'    =&gt; 40,
                    ),
                    'city' =&gt; array(
                        'label'         =&gt; 'City',
                        'sort_order'    =&gt; 50,
                    ),
                    'country_id' =&gt; array(
                        'type'          =&gt; 'varchar',
                        'input'         =&gt; 'select',
                        'label'         =&gt; 'Country',
                        'class'         =&gt; 'countries',
                        'source'        =&gt; 'customer_entity/address_attribute_source_country',
                        'sort_order'    =&gt; 60,
                    ),
                    'region' =&gt; array(
                        'backend'       =&gt; 'customer_entity/address_attribute_backend_region',
                        'label'         =&gt; 'State/Province',
                        'class'         =&gt; 'regions',
                        'sort_order'    =&gt; 70,
                    ),
                    'region_id' =&gt; array(
                        'type'          =&gt; 'int',
                        'input'         =&gt; 'hidden',
                        'source'        =&gt; 'customer_entity/address_attribute_source_region',
                        'required'      =&gt; 'false',
                        'sort_order'    =&gt; 80,
                        'label'         =&gt; 'State/Province'
                    ),
                    'postcode' =&gt; array(
                        'label'         =&gt; 'Zip/Postal Code',
                        'sort_order'    =&gt; 90,
                    ),
                    'telephone' =&gt; array(
                        'label'         =&gt; 'Telephone',
                        'sort_order'    =&gt; 100,
                    ),
                    'fax' =&gt; array(
                        'label'         =&gt; 'Fax',
                        'required'      =&gt; false,
                        'sort_order'    =&gt; 110,
                    ),
                ),
            ),
        );
    }
}</pre>
<p>Na verdade apenas incluímos os campos em <strong>customer</strong>.</p>
<p>Passo 4) Dentro da pasta sql crie um pasta chamada webgp_customer_setup. Dentro desta pasta crie um arquivo chamado <strong>mysql4-install-1.0.0.php</strong>, com o seguinte conteúdo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php $installer = $this; $installer-&gt;startSetup();
$installer-&gt;addAttribute( 'customer', 'cpf', array(
      'label'   =&gt; 'Cpf',
      'type'    =&gt; 'varchar',
      'input'   =&gt; 'text',
      'visible' =&gt; true,
      'required'  =&gt; false,
      'position'  =&gt; 1,
    )
);
Mage::getSingleton( 'eav/config' )
    -&gt;getAttribute( 'customer', 'cpf' )
    -&gt;setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    -&gt;save();
$installer-&gt;addAttribute( 'customer', 'rg', array(
      'label'   =&gt; 'Rg',
      'type'    =&gt; 'varchar',
      'input'   =&gt; 'text',
      'visible' =&gt; true,
      'required'  =&gt; false,
      'position'  =&gt; 1,
    )
);
Mage::getSingleton( 'eav/config' )
    -&gt;getAttribute( 'customer', 'rg' )
    -&gt;setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    -&gt;save();
$installer-&gt;addAttribute( 'customer', 'tipopessoa', array(
      'label'   =&gt; 'Tipo Pessoa',
      'type'    =&gt; 'varchar',
      'input'   =&gt; 'text',
      'visible' =&gt; true,
      'required'  =&gt; true,
      'position'  =&gt; 1,
    )
);
Mage::getSingleton( 'eav/config' )
    -&gt;getAttribute( 'customer', 'tipopessoa' )
    -&gt;setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    -&gt;save();
$installer-&gt;addAttribute( 'customer', 'cnpj', array(
      'label'   =&gt; 'Cnpj',
      'type'    =&gt; 'varchar',
      'input'   =&gt; 'text',
      'visible' =&gt; true,
      'required'  =&gt; false,
      'position'  =&gt; 1,
    )
);
Mage::getSingleton( 'eav/config' )
    -&gt;getAttribute( 'customer', 'cnpj' )
    -&gt;setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    -&gt;save();
$installer-&gt;addAttribute( 'customer', 'ie', array(
      'label'   =&gt; 'Inscr Estadual',
      'type'    =&gt; 'varchar',
      'input'   =&gt; 'text',
      'visible' =&gt; true,
      'required'  =&gt; false,
      'position'  =&gt; 1,
    )
);
Mage::getSingleton( 'eav/config' )
    -&gt;getAttribute( 'customer', 'ie' )
    -&gt;setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    -&gt;save();
$installer-&gt;addAttribute( 'customer', 'razaosocial', array(
      'label'   =&gt; 'Razao Social',
      'type'    =&gt; 'varchar',
      'input'   =&gt; 'text',
      'visible' =&gt; true,
      'required'  =&gt; false,
      'position'  =&gt; 1,
    )
);
Mage::getSingleton( 'eav/config' )
    -&gt;getAttribute( 'customer', 'razaosocial' )
    -&gt;setData('used_in_forms', array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout' ))
    -&gt;save();
try {
    $installer-&gt;run(&quot;ALTER TABLE {$this-&gt;getTable('sales_flat_quote')} ADD COLUMN `customer_cpf` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_dob`;&quot;);
    $installer-&gt;run(&quot;ALTER TABLE {$this-&gt;getTable('sales_flat_quote')} ADD COLUMN `customer_cnpj` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_cpf`;&quot;);
    $installer-&gt;run(&quot;ALTER TABLE {$this-&gt;getTable('sales_flat_quote')} ADD COLUMN `customer_tipopessoa` VARCHAR(2) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_cnpj`;&quot;);
    $installer-&gt;run(&quot;ALTER TABLE {$this-&gt;getTable('sales_flat_quote')} ADD COLUMN `customer_ie` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_tipopessoa`;&quot;);
    $installer-&gt;run(&quot;ALTER TABLE {$this-&gt;getTable('sales_flat_quote')} ADD COLUMN `customer_razaosocial` VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_ie`;&quot;);
    $installer-&gt;run(&quot;ALTER TABLE {$this-&gt;getTable('sales_flat_quote')} ADD COLUMN `customer_rg` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL AFTER `customer_razaosocial`;&quot;);
}
catch (Exception $e) {
}
$installer-&gt;endSetup();
?&gt;
</pre>
<p>O que esse arquivo faz??<br />
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:</p>
<pre class="brush: php; title: ; notranslate">
array('customer_account_edit','customer_account_create','adminhtml_customer', 'checkout_register', 'adminhtml_checkout')
</pre>
<p>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).</p>
<p>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?<br />
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 <strong>customer_form_attribute</strong>, com o valor de <strong>customer_account_create</strong> ou qualquer outro tipo.<br />
O mesmo acontece durante a criação do objeto Customer a partir de um objeto Order/Quote.<br />
Não adianta ter configurado o config.xml corretamente se não estiver na tabela <strong>customer_form_attribute</strong>.</p>
<p>Pronto! A parte de codificação está pronta.<br />
Ahh, falta agora criarmos o arquivo de &#8220;ativação&#8221; do nosso módulo, que fará com que o magento o reconheça.</p>
<p>Passo 5) Em app/etc/modules crie um arquivo chamado Webgp_Customer.xml, com o seguinte conteúdo:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;config&gt;
    &lt;modules&gt;
        &lt;Webgp_Customer&gt;
            &lt;active&gt;true&lt;/active&gt;
            &lt;codePool&gt;community&lt;/codePool&gt;
        &lt;/Webgp_Customer&gt;
    &lt;/modules&gt;
&lt;/config&gt;
</pre>
<p>Passo 6) O último passo é a configuração do seu template, para que os campos apareçam certo?</p>
<p>****app/design/frontend/seutemlate/seutema/template/customer/form/edit.phtml</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div&gt;
&lt;ul&gt;&lt;li&gt;
&lt;input type=&quot;radio&quot; name=&quot;tipopessoa&quot; id=&quot;pf&quot; value=&quot;pf&quot; &lt;?php if($this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getTipopessoa()) ==&quot;pf&quot;): ?&gt; checked=&quot;checked&quot; &lt;?php endif; ?&gt; title=&quot;Pessoa F&amp;iacute;sica&quot; onclick=&quot;$('dados01').style.display='none';$('cnpj').removeClassName('validar_cnpj');$('razaosocial').removeClassName('required-entry');$('dados02').style.display='block';$('cpf').addClassName('required-entry');$('cnpj').addClassName('required-entry');&quot; class=&quot;radio&quot; /&gt;&amp;nbsp;&amp;nbsp;Pessoa F&amp;iacute;sica
&lt;input type=&quot;radio&quot; name=&quot;tipopessoa&quot; id=&quot;pj&quot; value=&quot;pj&quot; &lt;?php if($this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getTipopessoa()) ==&quot;pj&quot;): ?&gt; checked=&quot;checked&quot; &lt;?php endif; ?&gt; title=&quot;Pessoa Jur&amp;iacute;dica&quot; onclick=&quot;$('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');&quot; class=&quot;radio&quot;&gt;&amp;nbsp;&amp;nbsp;Pessoa Jur&amp;iacute;dica
&lt;/li&gt;
&lt;/div&gt;
&lt;div class=&quot;fieldset&quot; &lt;?php if($this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getTipopessoa()) ==&quot;pf&quot;): ?&gt; style=&quot;display:none;&quot; &lt;?php endif; ?&gt; id=&quot;dados01&quot;&gt;
&lt;h2 class=&quot;legend&quot;&gt;Dados da Empresa - Cliente de Atacado&lt;/h4&gt;
&lt;h5&gt;Preencha os dados da empresa somente para compras como cliente corporativo&lt;/h5&gt;
&lt;ul class=&quot;form-list&quot;&gt;
&lt;li class=&quot;fields&quot;&gt;
&lt;div &gt;
&lt;div class=&quot;field&quot;&gt;
&lt;label for=&quot;razaosocial&quot; class=&quot;required&quot;&gt;Raz&amp;atilde;o Social&lt;em&gt;*&lt;/em&gt; &lt;/label&gt;&lt;br/&gt;
&lt;div class=&quot;input-box&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;razaosocial&quot; value=&quot;&lt;?php echo $this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getRazaosocial()) ?&gt;&quot; id=&quot;razaosocial&quot; title=&quot;Raz&amp;atilde;o Social&quot; class=&quot;input-text&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;fields&quot;&gt;
&lt;div &gt;
&lt;div class=&quot;field&quot;&gt;
&lt;label for=&quot;cnpj&quot; class=&quot;required&quot;&gt;CNPJ&lt;em&gt;*&lt;/em&gt; &lt;/label&gt;&lt;br/&gt;
&lt;div class=&quot;input-box&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;cnpj&quot; id=&quot;cnpj&quot; title=&quot;CNPJ&quot; class=&quot;input-text&quot; value=&quot;&lt;?php echo $this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getCnpj()) ?&gt;&quot;/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;field&quot;&gt;
&lt;label for=&quot;ie&quot;&gt;IE &lt;/label&gt;&lt;br/&gt;
&lt;div class=&quot;input-box&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;ie&quot; id=&quot;ie&quot; title=&quot;IE&quot; class=&quot;input-text&quot; value=&quot;&lt;?php echo $this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getIe()) ?&gt;&quot;/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;div class=&quot;fieldset&quot; id=&quot;dados02&quot; &lt;?php if($this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getTipopessoa()) ==&quot;pj&quot;): ?&gt; style=&quot;display:none;&quot; &lt;?php endif; ?&gt;&gt;
&lt;h2 class=&quot;legend&quot;&gt;Dados da Pessoa F&amp;iacute;sica&lt;/h4&gt;
&lt;ul class=&quot;form-list&quot;&gt;
&lt;li class=&quot;fields&quot;&gt;
&lt;div &gt;
&lt;div class=&quot;field&quot;&gt;
&lt;label for=&quot;rg&quot; class=&quot;required&quot;&gt;Rg&lt;em&gt;*&lt;/em&gt; &lt;/label&gt;&lt;br/&gt;
&lt;div class=&quot;input-box&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;rg&quot; id=&quot;rg&quot; title=&quot;Rg&quot; class=&quot;input-text required-entry&quot; value=&quot;&lt;?php echo $this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getRg()) ?&gt;&quot;/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;field&quot;&gt;
&lt;label for=&quot;cpf&quot; class=&quot;required&quot;&gt;Cpf&lt;em&gt;*&lt;/em&gt; &lt;/label&gt;&lt;br/&gt;
&lt;div class=&quot;input-box&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;cpf&quot; id=&quot;cpf&quot; title=&quot;Cpf&quot; class=&quot;input-text required-entry&quot; value=&quot;&lt;?php echo $this-&gt;htmlEscape($this-&gt;getCustomer()-&gt;getCpf()) ?&gt;&quot;/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</pre>
<p>****app/design/frontend/seutemlate/seutema/template/customer/form/register.phtml</p>
<pre class="brush: xml; title: ; notranslate">

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

&lt;/ul&gt;
&lt;/div&gt;

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

&lt;div class=&quot;fieldset&quot; id=&quot;dados02&quot;&gt;
&lt;h2 class=&quot;legend&quot;&gt;Dados da Pessoa F&amp;iacute;sica&lt;/h4&gt;
&lt;ul class=&quot;form-list&quot;&gt;
&lt;li class=&quot;fields&quot;&gt;
&lt;div &gt;
&lt;div class=&quot;field&quot;&gt;
&lt;label for=&quot;rg&quot; class=&quot;required&quot;&gt;Rg&lt;em&gt;*&lt;/em&gt; &lt;/label&gt;&lt;br/&gt;
&lt;div class=&quot;input-box&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;rg&quot; id=&quot;rg&quot; title=&quot;Rg&quot; class=&quot;input-text required-entry&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;field&quot;&gt;
&lt;label for=&quot;cpf&quot; class=&quot;required&quot;&gt;Cpf&lt;em&gt;*&lt;/em&gt; &lt;/label&gt;&lt;br/&gt;
&lt;div class=&quot;input-box&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;cpf&quot; id=&quot;cpf&quot; title=&quot;Cpf&quot; class=&quot;input-text required-entry&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</pre>
<p>Acho que os dois exemplos acima são suficientes. Não esqueça de alterar o arquivo relacionado ao checkout:</p>
<p>app/design/frontend/seutemplate/seutema/template/checkout/onepage/billing.phtml</p>
<p>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.<br />
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.</p>
<p>Comentários são bem vindos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2011/04/magento-modulo-free-para-inclusao-de-cpf-rg-cnpj-e-etc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Magento: Erro ao adicionar produto no carrinho &#8211; Regra de Preço</title>
		<link>http://www.webgp.com.br/2010/12/600/</link>
		<comments>http://www.webgp.com.br/2010/12/600/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 03:48:53 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://webgp.com.br/index.php/blog/?p=600</guid>
		<description><![CDATA[Pessoal, Há algum tempo atrás fiz um post sobre um [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal,</p>
<p>Há algum tempo atrás fiz um post sobre um erro bobo, aparentemente um bug do magento: Após criar uma regra de desconto para uma forma de pagamento, se você adicionasse o grupo de clientes NOT LOGGED IN, era impossível incluir o produto no carrinho.</p>
<p>Aparecia a mensagem:</p>
<p><strong>cannot add items to the shopping cart.</strong></p>
<p>Bem, uma das soluções apresentadas foi alterar o arquivo app/code/core/Mage/Sales/Model/Quote.php.</p>
<p>Em app/code/Core / Mage / Sales / Model / Quote.php Iinsira o seguinte código no método _afterSave() :</p>
<pre class="brush: php; title: ; notranslate">
if (null !== $this-&gt;_payments) {
           // inserted code start
            $this-&gt;getPaymentsCollection();
            if ($this-&gt;getId()) {
                foreach ($this-&gt;_payments as $payment) {
                    $payment-&gt;setQuote($this);
                }
            }
           // inserted code end
            $this-&gt;getPaymentsCollection()-&gt;save();
        }
</pre>
<p>Lembrando que o ideal é criar uma cópia do arquivo acima e colocar em app/code/local. Dessa forma se houver alguma atualização você não perderá sua configuração.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/12/600/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento: Módulo Offline dos Correios</title>
		<link>http://www.webgp.com.br/2010/10/magento-modulo-offline-dos-correios/</link>
		<comments>http://www.webgp.com.br/2010/10/magento-modulo-offline-dos-correios/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 08:39:19 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://blog.webgp.com.br/?p=597</guid>
		<description><![CDATA[Olá Pessoal, Como já avisamos antes, o nosso site está [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Como já avisamos antes, o nosso site está em manutenção, pois estamos integrando o Magento com o WordPress.</p>
<p>Mas, a partir de amanhã (05/out/2010) o site já estará totalmente funcional e iremos disponibilizar para download gratuito o módulo offline dos correios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/10/magento-modulo-offline-dos-correios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ATENÇÃO: Instabilidade no Blog e Site principal</title>
		<link>http://www.webgp.com.br/2010/09/atencao-instabilidade-no-blog-e-site-principal/</link>
		<comments>http://www.webgp.com.br/2010/09/atencao-instabilidade-no-blog-e-site-principal/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 23:18:52 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.webgp.com.br/?p=595</guid>
		<description><![CDATA[Boa noite pessoal, Gostaria de avisá-los que entre hoje e [...]]]></description>
			<content:encoded><![CDATA[<p>Boa noite pessoal,</p>
<p>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.<br />
A razão para isso é a mudança do blog(wordpress) para funcionar &#8220;dentro&#8221; do nosso novo site principal (Magento).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/09/atencao-instabilidade-no-blog-e-site-principal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento: Mais layouts free</title>
		<link>http://www.webgp.com.br/2010/09/magento-mais-layouts-free/</link>
		<comments>http://www.webgp.com.br/2010/09/magento-mais-layouts-free/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 12:24:17 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.webgp.com.br/?p=584</guid>
		<description><![CDATA[Pessoal, mais 2 links de layouts free interessantes: http://www.magentocommerce.com/magento-connect/Mage-World/extension/1937/freepop&#8211;magento-theme http://www.magentocommerce.com/magento-connect/Mage-World/extension/1758/hm-modern-theme-white-skin]]></description>
			<content:encoded><![CDATA[<p>Pessoal, mais 2 links de layouts free interessantes:</p>
<p><a href="http://www.magentocommerce.com/magento-connect/Mage-World/extension/1937/freepop--magento-theme">http://www.magentocommerce.com/magento-connect/Mage-World/extension/1937/freepop&#8211;magento-theme</a></p>
<p><a href="http://www.magentocommerce.com/magento-connect/Mage-World/extension/1758/hm-modern-theme-white-skin">http://www.magentocommerce.com/magento-connect/Mage-World/extension/1758/hm-modern-theme-white-skin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/09/magento-mais-layouts-free/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento: Cuidado com o CACHE!!!!</title>
		<link>http://www.webgp.com.br/2010/09/magento-cuidado-com-o-cache/</link>
		<comments>http://www.webgp.com.br/2010/09/magento-cuidado-com-o-cache/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 12:59:11 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://blog.webgp.com.br/?p=578</guid>
		<description><![CDATA[Bom dia pessoal, Esse post é destinado à todos que [...]]]></description>
			<content:encoded><![CDATA[<p>Bom dia pessoal,</p>
<p>Esse post é destinado à todos que se aventuram no mundo Magento, incluindo quem tá começando a trabalhar no desenvolvimento, assim como o usuário final que apenas gerencia a sua loja.</p>
<p>Esse post não é para falar sobre as maravilhas do cache nem sobre seus problemas. Na verdade, nem detalhes sobre o seu funcionamento!</p>
<p>Em todos os tutoriais que coloco aqui, sempre chamo a atenção para DESABILITAREM o Cache e até mesmo dar um refresh. Somente dessa forma você poderá ver alterações em seu site!<br />
Não adianta você trocar a configuração de template, se você não atualizar seu cache!</p>
<p>Há um tempo atrás, tive o seguinte problema com um cliente:<br />
Desenvolvi um módulo personalizado e fui fazer a instalação. Como sempre, desabilitei o cache e instalei. Apesar disso, o módulo não aparecia no admin. Sendo assim, dei um refresh no cache e esperei para ver o que acontecia&#8230;.</p>
<p>Bem, o módulo apareceu no admin mas toda a parte de template ficou bagunçada. Partes do template não estava mais aparecendo, ficou horrivel e impossível de navegar pela loja.</p>
<p>O cliente então, passou a falar que o problema devia ser o módulo instalado! Após afirmar repetidas vezes que o problema não era esse, o cliente ainda não estava convencido. Dizia que fazia tempos qeu não mexia lá e que o simples fato de eu ter atualizado o cache não deveria ter causado problemas.</p>
<p>Bem, aí comecei então a depurar a loja, para descobrir o que havia acontecido. </p>
<p>A primeira coisa que me ocorreu foi: o template não está configurado certo. De alguma maneira ele configurou errado e só agora com o refresh apareceu. Ao olhar na configuração do cliente, estava configurado um template chamado f002.<br />
Estava correto, pois eu tinah visto esse pacote no servidor.<br />
Sendo assim, habilitei o template path hints do Magento, e qual a minha &#8220;surpresa&#8221; quando vi que os principais arquivos do template estavam sendo &#8220;substituidos&#8221; hierarquicamente pelos arquivos da pasta default.<br />
Mas isso era inacreditável, já que a pasta estava lá e a configuração estava correta.<br />
Após mais de uma hora buscando as mais loucas explicações, uma luz surgiu ao final do túnel:</p>
<p>Fui passar uns dados para o cliente via msn, e coloquei o caminho de determinado arquivo de cabeça. Passado alguns minutos, fui olhar no servidor e vi que tinha passado errado, pois passei f002 e na verdade era f001. EUREKA!</p>
<p>O cliente tinha em seu servidor uma pasta chamada f001 e havia configurado no admin f002!!!!</p>
<p>Mas como a loja estava funcionando corretamente? Como eu não havia percebido antes?</p>
<p>Bem, eu não havia percebido pois estou cansada de trabalhar com o f001 e o f002, que são dois templates gratuitos disponibilizados em um blog. Além disso, ele realmente tinha uma pasta chamada f002 que não tinha nada a ver com os templates.<br />
Por cansado ou por besteira, apesar de saber qual era o erro, não conseguia &#8220;enxergá-lo&#8221;.</p>
<p>A loja estava funcionando ha tempos perfeitamente por causa do cache! O cache estava &#8220;errado&#8221; e ao forçar sua atualização, a &#8220;casa caiu&#8221;.</p>
<p>Somente após passar todas essas informações, o cliente viu que o problema estava nas alterações que fazia em sua loja e não dava refresh no cache!</p>
<p>Após esse incidente, antes de fazer qualquer coisa em uma loja peço para o cliente dar refresh e ver se está tudo ok. Dessa forma, o próprio cliente pode verificar se sua loja está funcionando corretamente ou não.</p>
<p>Bem, semana passada fui fazer a instalação de um módulo para outro cliente. Solicitei ao mesmo que desse um refresh no cache e ele não sabia nem onde ir. Apesar de explicar, ele não conseguiu.<br />
Entrei no admin e dei um refresh &#8230; Adivinhem o que aconteceu? O template, como de costume, ficou distorcido. </p>
<p>Lógico, que o cliente veio irado, falando queeu tinha causado o problema!<br />
Até você explicar que nariz de porco não é tomada&#8230;.</p>
<p>Então, aí vai mais um alerta, principalmente para os desenvolvedores:</p>
<p>Antes de atualizar o cache em uma loja, deixe bem claro para o cliente o que isso pode acarretar e faça ele assinar uma autorização para o procedimento&#8230;.rsrs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/09/magento-cuidado-com-o-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modelagem de Dados no Magento – Parte III</title>
		<link>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-%e2%80%93-parte-iii/</link>
		<comments>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-%e2%80%93-parte-iii/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 12:24:15 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[magento]]></category>
		<category><![CDATA[custom eav magento]]></category>
		<category><![CDATA[eav magento]]></category>
		<category><![CDATA[estrutura eav]]></category>
		<category><![CDATA[magento Mage_Eav_Model_Mysql4_Entity_Attribute_Collection]]></category>

		<guid isPermaLink="false">http://blog.webgp.com.br/?p=576</guid>
		<description><![CDATA[Parte I Parte II Nas partes anteriores do nosso tutorial [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-i/">Parte I</a><br />
<a href="http://blog.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-ii/">Parte II</a></p>
<p>Nas partes anteriores do nosso tutorial já vimos como manipulamos certos tipos de dados no BD.<br />
Na verdade, vimos a parte simples, onde os dados estão persistidos em uma única tabela. Mas e o caso do EAV?<br />
Bem, acredito que na maioria das vezes que você precisar criar uma tabela específica para um módulo, você irá optar pelo jeito mais simples, onde cada &#8220;objeto&#8221; reflete o registro de uma única tabela.<br />
Mas, mesmo que você não for criar um conjunto de tabelas EAV para representar um objeto, você precisa saber o básico para conseguir lidar bem com os Produtos.<br />
Como buscar produtos no BD que tenham apenas uma determinada cor? Busco da mesma forma que estivesse buscando um registro qualquer?</p>
<p>É isso que veremos nessa parte do tutorial.</p>
<p>Bem, mas o que seria o modelo EAV (Entidade &#8211; Atributo &#8211; Valor)?<br />
Para quem &#8220;arranha&#8221; no inglês, você poder ver uma discussão sobre o assunto <a href="http://en.wikipedia.org/wiki/Entity-attribute-value_model">aqui</a>.</p>
<p>Não vou me aprofundar muito, mas seria algo mais ou menos assim:</p>
<p>Quando você tem um &#8220;objeto&#8221; que pode ter uma quantidade muito grande de dados, é interesse você dividir essas informações em várias tabelas.</p>
<p>Vamos usar o exemplo do Produto, dentro do próprio Magento.</p>
<p>Você pode criar quantos atributos você quiser para um Produto e cada atributo pode ser de N tipos (string, inteiro, texto, decimal, data e etc). Qual a forma mais fácil de modelar esse objeto Produto no nosso BD?</p>
<p>Bem, seria interessente criar uma tabela que define o nosso produto (nossa entidade, vamos assim dizer), tabelas que definam os atrbutos que essa entidade irá ter, e por fim, tabelas com os valores desse atributo.</p>
<p>É mais ou menos assim que estão estruturadas as tabelas no nosso BD do Magento: Há uma tabela de definição do produto, outra que define quais atributos este produto tem, e tabelas próprias para cada tipo (texto, data, inteiro, etc) que irão guardar os valores do atributo.</p>
<p><a href="http://blog.webgp.com.br/wp-content/uploads/2010/09/eav.png"><img class="aligncenter size-full wp-image-581" title="eav" src="http://blog.webgp.com.br/wp-content/uploads/2010/09/eav.png" alt="" width="585" height="362" /></a></p>
<p>Para entrarmos a fundo nessa questão da modelagem, vamos mudar um pouco o exemplo (módulo para meucomentario) que temos seguido até aqui. Acho que ficará mais fácil assimilar o &#8220;drama&#8221;.</p>
<p>Vamos utilizar um exemplo real, de um módulo que iremos disponibilizar logo logo aqui no blog: Forma de Pagamento &#8211; Financiamento.</p>
<p>Um cliente uma vez solicitou um módulo que permitisse que o cliente preenchesse uma ficha de financiamento, em vez de simplesmente pagar com boleto ou etc.</p>
<p>Ou seja, no momento do checkout o cliente escolheria o método &#8220;Financiamento&#8221;, preencheria um formulário que posteriormente seria avaliado.</p>
<p>A primeira pergunta que tive foi a seguinte: Mas quais campos esse formulário vai ter?<br />
A resposta foi: &#8220;Depende&#8221;.</p>
<p>Na verdade o cliente poderia escolher entre Pessoa Física e Jurídica e de acordo com sua escolha, o formulário teria itens diferenciados.</p>
<p>Além disso, para que o módulo em questão fosse utilizado por mais de uma loja, seria interessante que esses campos fossem configuráveis.</p>
<p>Mas como fazer isso em relação banco de dados, já que cada campo poderia ser de um tipo diferente (data, texto, inteiro e etc)?<br />
O jeito seria criar uma tabela para campos do tipo texto, outra para data e assim por diante.</p>
<p>Bem, o cadastro se parece muito com o cadastro de um produto certo? Pq então não utilizar o mesmo modelo de dados?</p>
<p>Assim foi definida a utilização do EAV!</p>
<p>Como esse tutorial não tem como objetivo a criação de novos módulos, só vou citar as configurações específicas para o modelo de dados utilizado.</p>
<p>Se achar interessante, modifique o exemplo anterior para salvar os comentários em um modelo EAV.</p>
<p>CONFIG.XML</p>
<pre class="brush: xml; title: ; notranslate">
   &lt;!-- ... --&gt;
    &lt;global&gt;
        &lt;models&gt;
            &lt;financiamentooffline&gt;
                &lt;class&gt;Webgp_FinanciamentoOffline_Model&lt;/class&gt;
                &lt;resourceModel&gt;financiamentooffline_resource_eav_mysql4&lt;/resourceModel&gt;
            &lt;/financiamentooffline&gt;
            &lt;financiamentooffline_resource_eav_mysql4&gt;
                &lt;class&gt;Webgp_FinanciamentoOffline_Model_Resource_Eav_Mysql4&lt;/class&gt;
                &lt;entities&gt;
                    &lt;proposta&gt;
                        &lt;table&gt;financiamentooffline_proposta&lt;/table&gt;
                    &lt;/proposta&gt;
                    &lt;eav_attribute&gt;&lt;table&gt;financiamentooffline_eav_attribute&lt;/table&gt;&lt;/eav_attribute&gt;
                &lt;/entities&gt;
            &lt;/financiamentooffline_resource_eav_mysql4&gt;
        &lt;/models&gt;
        &lt;resources&gt;
            &lt;financiamentooffline_setup&gt;
                &lt;setup&gt;
                    &lt;module&gt;Webgp_FinanciamentoOffline&lt;/module&gt;
                    &lt;class&gt;Webgp_FinanciamentoOffline_Model_Entity_Setup&lt;/class&gt;
                &lt;/setup&gt;
                &lt;connection&gt;
                    &lt;use&gt;core_setup&lt;/use&gt;
                &lt;/connection&gt;
            &lt;/financiamentooffline_setup&gt;
            &lt;financiamentooffline_write&gt;
                &lt;connection&gt;
                    &lt;use&gt;core_write&lt;/use&gt;
                &lt;/connection&gt;
            &lt;/financiamentooffline_write&gt;
            &lt;financiamentooffline_read&gt;
                &lt;connection&gt;
                    &lt;use&gt;core_read&lt;/use&gt;
                &lt;/connection&gt;
            &lt;/financiamentooffline_read&gt;
        &lt;/resources&gt;
        &lt;!-- ... --&gt;
    &lt;global&gt;
&lt;!-- ... --&gt;
</pre>
<p>No nossa definição de modelo notamos que a diferença está no nosso resourceModel, que passa a utilizar a estrutura <strong>resource_eav_mysql4</strong>.<br />
Na configuração do nosso novo resourceModel, temos que listar nossas entidades. Nesse caso, temos uma entidade chamada <strong>proposta</strong> (será chamada como Mage::getModel(&#8216;financiamentooffline/proposta&#8217;)), que representa o nosso Model principal (seria como Produto, por exemplo) e também uma entidade chamada <strong>eav_attribute</strong>, que irá guardar as definições dos novos atributos.<br />
Caso você queira utilizar alguma tabela FLAT para representar uma entidade, configure-a normalmente no config.xml. A diferenciação do seu real resource iremos fazer na hora de definir a classe.<br />
Uma diferença também nessa configuração é a definição de uma classe específica para o nosso Setup (Webgp_FinanciamentoOffline_Model_Entity_Setup), que veremos adianta para que ela serve!</p>
<p>mysql4-install-0.1.0.php</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$installer = $this;
$installer-&gt;startSetup();
$installer-&gt;run(&quot;
CREATE TABLE `{$installer-&gt;getTable('financiamentooffline/eav_attribute')}` (
  `attribute_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `frontend_input_renderer` varchar(255) DEFAULT NULL,
  `is_global` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `is_visible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `position` int(11) NOT NULL,
  PRIMARY KEY (`attribute_id`),
  CONSTRAINT `FK_FINANCIAMENTOOFFILINE_EAV_ATTRIBUTE_ID` FOREIGN KEY (`attribute_id`) REFERENCES `{$installer-&gt;getTable('eav/attribute')}` (`attribute_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&quot;);
$installer-&gt;endSetup();
$installer-&gt;addEntityType('financiamentooffline_proposta',
          Array(
              'entity_model'          =&gt;'financiamentooffline/proposta',
              'attribute_model'       =&gt;'financiamentooffline/resource_eav_attribute',
              'table'         =&gt;'financiamentooffline/proposta',
              'increment_model'       =&gt;'eav/entity_increment_numeric',
              'increment_per_store'   =&gt;'1'
));
&lt;p&gt;$installer-&gt;createEntityTables($this-&gt;getTable('financiamentooffline/proposta'));
$installer-&gt;installEntities();
$describe = $installer-&gt;getConnection()-&gt;describeTable($installer-&gt;getTable('financiamentooffline/eav_attribute'));
foreach ($describe as $columnData) {
    if ($columnData['COLUMN_NAME'] == 'attribute_id') {
        continue;
    }
    $installer-&gt;getConnection()-&gt;dropColumn($installer-&gt;getTable('eav/attribute'), $columnData['COLUMN_NAME']);
}
</pre>
<p>O nosso arquivo de setup cria a tabela que definimos em config.xml para a entidade &#8216;financiamentooffline/eav_attribute&#8217;.<br />
Além disso, ele cria todas as tabelas para a modelagem EAV:<br />
Antes de tudo precisamos criar um novo tipo de entidade. Como, por exemplo, iremos saber se um conjunto de atributos faz parte de Produtos ou Propostas?<br />
Você pode ver os tipos já cadastrados na tabela eav_entity_type.</p>
<p>Depois que criamos o nosso novo tipo, precisamos criar as tabelas para os tipos de dados (date, varchar, int e etc). Para isso chamamos o método createEntityTables(..).</p>
<p>Quando instalamos o magento, vemos que os produtos já possuem alguns atributos pré cadastrados certo? Na nossa classe de Setup iremos definir os atributos que devem ser instalados inicialmente. Para cadastrá-los no banco precisamos chamar o método installEntities().</p>
<p>Pronto!<br />
Quando nosso módulo for instalado, você verá que as seguintes tabelas foram criadas:<br />
<a href="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-33.png"><img class="aligncenter size-full wp-image-582" title="Picture 33" src="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-33.png" alt="" width="259" height="133" /></a></p>
<p>Setup.php</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Webgp_FinanciamentoOffline_Model_Entity_Setup extends Mage_Eav_Model_Entity_Setup {
    public function getDefaultEntities()
    {
        return array (
            'financiamentooffline_proposta' =&gt; array(
                'entity_model'      =&gt; 'financiamentooffline/proposta',
                'attribute_model'   =&gt; 'financiamentooffline/resource_eav_attribute',
                'table'             =&gt; 'financiamentooffline/proposta',
                'increment_model'       =&gt;'eav/entity_increment_numeric',
                'additional_attribute_table' =&gt; 'financiamentooffline/eav_attribute',
                'entity_attribute_collection' =&gt; 'financiamentooffline/eav_attribute',
                'attributes'        =&gt; array(
                    'nome' =&gt; array(
                        'type'              =&gt; 'varchar',
                        'backend'           =&gt; '',
                        'frontend'          =&gt; '',
                        'label'             =&gt; 'Nome',
                        'input'             =&gt; 'text',
                        'class'             =&gt; '',
                        'source'            =&gt; '',
                        // store scope == 0
                        // global scope == 1
                        // website scope == 2
                        'global'            =&gt; 0,
                        'visible'           =&gt; true,
                        'required'          =&gt; true,
                        'user_defined'      =&gt; true,
                        'default'           =&gt; '',
                        'unique'            =&gt; false,
                    ),
                ),
            )
        );
    }
</pre>
<p>Neste ponto do tutorial você já deve ser capaz de identificar a localização desse arquivo apenas olhando o nome da classe (Webgp/FinanciamentoOffline/Model/Entity/Setup.php).</p>
<p>Quando chamamos o método installEntities() no arquivo mysql4-install-0.1.0.php estamos mandando que as entidades definidas em getDefaultEntities() sejam instaladas.<br />
No nosso exemplo, estamos definindo a entidade financiamento_proposta. O conteúdo do array é bem intuitivo. Apenas como exemplo, estamos cadastrando o atributo NOME.</p>
<p>Vamos mostrar agora as classes referentes ao nosso modelo Proposta e seus respectivos resources.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Webgp_FinanciamentoOffline_Model_Resource_Eav_Mysql4_Proposta extends Mage_Eav_Model_Entity_Abstract
{
    public function _construct()
    {
        $resource = Mage::getSingleton('core/resource');
        $this-&gt;setType('financiamentooffline_proposta');
          $this-&gt;setConnection(
                $resource-&gt;getConnection('financiamentooffline_read'),
                $resource-&gt;getConnection('financiamentooffline_write')
            );
    }
       /**
     * Default proposta attributes
     *
     * @return array
     */
    protected function _getDefaultAttributes()
    {
        return array('entity_id', 'entity_type_id', 'attribute_set_id', 'order_id', 'is_active', 'created_at', 'updated_at');
    }
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Webgp_FinanciamentoOffline_Model_Resource_Eav_Mysql4_Proposta_Attribute_Collection extends Mage_Eav_Model_Mysql4_Entity_Attribute_Collection
{
    /**
     * Resource model initialization
     */
    public function _construct()
    {
        $this-&gt;_init('financiamentooffline/resource_eav_attribute', 'eav/entity_attribute');
    }
    protected function _initSelect()
    {
        $this-&gt;getSelect()-&gt;from(array('main_table' =&gt; $this-&gt;getResource()-&gt;getMainTable()))
            -&gt;where('main_table.entity_type_id=?', Mage::getModel('eav/entity')-&gt;setType('financiamentooffline_proposta')-&gt;getTypeId())
            -&gt;join(
                array('additional_table' =&gt; $this-&gt;getTable('financiamentooffline/eav_attribute')),
                'additional_table.attribute_id=main_table.attribute_id'
            );
        return $this;
    }
    /**
     * Specify attribute entity type filter
     *
     * @param   int $typeId
     */
    public function setEntityTypeFilter($typeId)
    {
        return $this;
    }
    /**
     * Return array of fields to load attribute values
     *
     * @return array
     */
    protected function _getLoadDataFields()
    {
        $fields = parent::_getLoadDataFields();
        $fields = array_merge($fields, array('additional_table.is_global'));
        return $fields;
    }
    /**
     * Specify filter by &quot;is_visible&quot; field
     *
     */
    public function addVisibleFilter()
    {
        $this-&gt;getSelect()-&gt;where('additional_table.is_visible=?', 1);
        return $this;
    }
}
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Webgp_FinanciamentoOffline_Model_Resource_Eav_Mysql4_Proposta_Collection extends Mage_Eav_Model_Entity_Collection_Abstract
{
    protected function _construct()
    {
        $this-&gt;_init('financiamentooffline/proposta');
    }
}
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Webgp_FinanciamentoOffline_Model_Resource_Eav_Attribute extends Mage_Eav_Model_Entity_Attribute
{
    const SCOPE_STORE   = 0;
    const SCOPE_GLOBAL  = 1;
    const SCOPE_WEBSITE = 2;
    const MODULE_NAME   = 'Webgp_FinanciamentoOffline';
    const ENTITY        = 'financiamentooffline_eav_attribute';
    protected $_eventPrefix = 'financiamentooffline_entity_attribute';
    protected $_eventObject = 'attribute';
    /**
     * Array with labels
     *
     * @var array
     */
    static protected $_labels = null;
    protected function _construct()
    {
        $this-&gt;_init('financiamentooffline/attribute');
    }
    /**
     * Processing object before save data
     *
     * @return Mage_Core_Model_Abstract
     */
    protected function _beforeSave()
    {
        $this-&gt;setData('modulePrefix', self::MODULE_NAME);
        if (isset($this-&gt;_origData['is_global'])) {
            if (!isset($this-&gt;_data['is_global'])) {
                Mage::throwException('0_o');
            }
        }
        return parent::_beforeSave();
    }
    /**
     * Processing object after save data
     *
     * @return Mage_Core_Model_Abstract
     */
    protected function _afterSave()
    {
        /**
         * Fix saving attribute in admin
         */
        Mage::getSingleton('eav/config')-&gt;clear();
        return parent::_afterSave();
    }
    /**
     * Init indexing process after attribute data commit
     *
     */
    public function afterCommitCallback()
    {
        parent::afterCommitCallback();
        return $this;
    }
    /**
     * Register indexing event before delete financiamentooffline eav attribute
     *
     */
    protected function _beforeDelete()
    {
        return parent::_beforeDelete();
    }
    /**
     * Init indexing process after catalog eav attribute delete commit
     *
     */
    protected function _afterDeleteCommit()
    {
        parent::_afterDeleteCommit();
    }
    /**
     * Return is attribute global
     *
     * @return integer
     */
    public function getIsGlobal()
    {
        return $this-&gt;_getData('is_global');
    }
    /**
     * Retrieve attribute is global scope flag
     *
     * @return bool
     */
    public function isScopeGlobal()
    {
        return $this-&gt;getIsGlobal() == self::SCOPE_GLOBAL;
    }
    /**
     * Retrieve attribute is website scope website
     *
     * @return bool
     */
    public function isScopeWebsite()
    {
        return $this-&gt;getIsGlobal() == self::SCOPE_WEBSITE;
    }
    /**
     * Retrieve attribute is store scope flag
     *
     * @return bool
     */
    public function isScopeStore()
    {
        return !$this-&gt;isScopeGlobal() &amp;&amp; !$this-&gt;isScopeWebsite();
    }
    /**
     * Retrieve store id
     *
     * @return int
     */
    public function getStoreId()
    {
        if ($dataObject = $this-&gt;getDataObject()) {
            return $dataObject-&gt;getStoreId();
        }
        return $this-&gt;getData('store_id');
    }
    /**
     * Retrieve source model
     *
     * @return Mage_Eav_Model_Entity_Attribute_Source_Abstract
     */
    public function getSourceModel()
    {
        $model = $this-&gt;getData('source_model');
        if (empty($model)) {
            if ($this-&gt;getBackendType() == 'int' &amp;&amp; $this-&gt;getFrontendInput() == 'select') {
                return 'eav/entity_attribute_source_table';
            }
        }
        return $model;
    }
    /**
     * Retrieve don't translated frontend label
     *
     * @return string
     */
    public function getFrontendLabel()
    {
        return $this-&gt;_getData('frontend_label');
    }
    /**
     * Get Attribute translated label for store
     *
     * @deprecated
     * @return string
     */
    protected function _getLabelForStore()
    {
        return $this-&gt;getFrontendLabel();
    }
    /**
     * Initialize store Labels for attributes
     *
     * @deprecated
     * @param int $storeId
     */
    public static function initLabels($storeId = null)
    {
        if (is_null(self::$_labels)) {
            if (is_null($storeId)) {
                $storeId = Mage::app()-&gt;getStore()-&gt;getId();
            }
            $attributeLabels = array();
            $attributes = Mage::getResourceSingleton('financiamentooffline/proposta')-&gt;getAttributesByCode();
            foreach ($attributes as $attribute) {
                if (strlen($attribute-&gt;getData('frontend_label')) &gt; 0) {
                    $attributeLabels[] = $attribute-&gt;getData('frontend_label');
                }
            }
            self::$_labels = Mage::app()-&gt;getTranslator()-&gt;getResource()-&gt;getTranslationArrayByStrings($attributeLabels, $storeId);
        }
    }
    /**
     * Get default attribute source model
     *
     * @return string
     */
    public function _getDefaultSourceModel()
    {
        return 'eav/entity_attribute_source_table';
    }
    /**
     * Check is an attribute used in EAV index
     *
     * @return bool
     */
    public function isIndexable()
    {
        $backendType    = $this-&gt;getBackendType();
        $frontendInput  = $this-&gt;getFrontendInput();
        if ($backendType == 'int' &amp;&amp; $frontendInput == 'select') {
            return true;
        } else if ($backendType == 'varchar' &amp;&amp; $frontendInput == 'multiselect') {
            return true;
        } else if ($backendType == 'decimal') {
            return true;
        }
        return false;
    }
    /**
     * Retrieve index type for indexable attribute
     *
     * @return string|false
     */
    public function getIndexType()
    {
        if (!$this-&gt;isIndexable()) {
            return false;
        }
        if ($this-&gt;getBackendType() == 'decimal') {
            return 'decimal';
        }
        return 'source';
    }
}
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Webgp_FinanciamentoOffline_Model_Proposta extends Mage_Core_Model_Abstract {
    protected function _construct()
    {
        $this-&gt;_init('financiamentooffline/proposta');
    }
   public function getAttributesBySetAndGroup($groupId = 0, $setId = 0)
    {
        return  $this-&gt;getAttributesBySet($setId)-&gt;setAttributeGroupFilter($groupId);
    }
    public function getAttributesBySet($setId = 0)
    {
        return  Mage::getResourceModel('financiamentooffline/proposta_attribute_collection')-&gt;setAttributeSetFilter($setId);
    }
    /**
     *
     * @param   int $attributeId
     * @return  Mage_Eav_Model_Entity_Attribute_Abstract
     */
    public function getAttributeById($attributeId, $setId = 0)
    {
        foreach ($this-&gt;getAttributesBySet($setId) as $attribute) {
            if ($attribute-&gt;getId() == $attributeId) {
                return $attribute;
            }
        }
        return null;
    }
</pre>
<p>Vamos lembrar que cada atributo pertence a um grupo e a um conjunto de atributos. Ao instalar as entidades, automaticamente o Magento já cria um Conjunto chamado Default e um grupo também chamado Default.<br />
O Conjunto seria os conjuntos de atributos que você cria para os produtos.</p>
<p>Essa parte de EAV é muito extensa e o assunto parece não ter fim!<br />
Espero que tenha dado para vocês entenderem! Só para fechar..</p>
<pre class="brush: php; title: ; notranslate">

//instanciar uma proposta com id = 21
        $proposta    = Mage::getModel('financiamentooffline/proposta')-&gt;load(21);
//recuperar conjunto de atributos cadastrados para as propostas
        $collection = Mage::getResourceModel('financiamentooffline/proposta_attribute_collection');
//salvar um atributo
        $model = Mage::getModel('financiamentooffline/resource_eav_attribute');
        $model-&gt;setEntityTypeId(Mage::getModel('eav/entity')-&gt;setType('financiamentooffline_proposta')-&gt;getTypeId());
         ...
        $model-&gt;save();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-%e2%80%93-parte-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modelagem de Dados no Magento &#8211; Parte II</title>
		<link>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-ii/</link>
		<comments>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-ii/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 07:45:16 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[magento]]></category>
		<category><![CDATA[custom eav]]></category>
		<category><![CDATA[custom model]]></category>
		<category><![CDATA[eav]]></category>

		<guid isPermaLink="false">http://blog.webgp.com.br/?p=569</guid>
		<description><![CDATA[Dando continuidade ao nosso tutorial iniciado aqui, vamos criar um [...]]]></description>
			<content:encoded><![CDATA[<p>Dando continuidade ao nosso tutorial iniciado <a href="http://blog.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-i/">aqui</a>, vamos criar um módulo bem simples para exemplificar a utilização doe Models dentro do Magento.</p>
<p>Como o intuito desse tutorial não é a criação de módulos, que já foi visto em posts anteriores, irei considerar que os leitores já sabem como criá-los.<br />
Caso tenha alguma dúvida, siga este <a href="http://blog.webgp.com.br/2010/05/magento-tutorial-para-modulo-de-lembrete-de-pagamento-payment-reminder-module/">artigo</a>.</p>
<p>Vamos criar um módulo que permita um usuário postar comentários sobre a loja, utilizando um Model que represente uma única tabela.</p>
<p>Passo 1)<br />
Crie um módulo com o seguinte esqueleto em app/code/local:<br />
<a href="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-30.png"><img class="aligncenter size-full wp-image-570" title="Picture 30" src="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-30.png" alt="" width="247" height="220" /></a></p>
<p><strong>Aqui</strong> é Namespace que escolhi e o meu módulo chama-se <strong>MeuComentario</strong>.</p>
<p>* Em Aqui/MeuComentario/Helper/Data.php, coloque o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
&amp;lt;?php
class Aqui_MeuComentario_Helper_Data extends Mage_Core_Helper_Abstract
{

}
</pre>
<p>* Em Aqui/MeuComentario/controllers/IndexController.php, coloque o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
class Aqui_MeuComentario_IndexController extends Mage_Core_Controller_Front_Action {
    public function testeAction() {
        echo 'Ola!';
    }
}
</pre>
<p>* Em Aqui/MeuComentario/etc/config.xml, vamos incluir o seguinte código:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;config&amp;gt;
    &amp;lt;modules&amp;gt;
        &amp;lt;Aqui_MeuComentario&amp;gt;
            &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
        &amp;lt;/Aqui_MeuComentario&amp;gt;
    &amp;lt;/modules&amp;gt;
    &amp;lt;global&amp;gt;
    	  &amp;lt;models&amp;gt;
            &amp;lt;meucomentario&amp;gt;
                    &amp;lt;class&amp;gt;Aqui_MeuComentario_Model&amp;lt;/class&amp;gt;
                    &amp;lt;resourceModel&amp;gt;meucomentario_mysql4&amp;lt;/resourceModel&amp;gt;
            &amp;lt;/meucomentario&amp;gt;
            &amp;lt;meucomentario_mysql4&amp;gt;
                &amp;lt;class&amp;gt;Aqui_MeuComentario_Model_Mysql4&amp;lt;/class&amp;gt;
                &amp;lt;entities&amp;gt;
                    &amp;lt;autor&amp;gt;
                        &amp;lt;table&amp;gt;webgp_meucomentario_autor&amp;lt;/table&amp;gt;
                    &amp;lt;/autor&amp;gt;
                    &amp;lt;comentario&amp;gt;
                        &amp;lt;table&amp;gt;webgp_meucomentario_comentario&amp;lt;/table&amp;gt;
                    &amp;lt;/comentario&amp;gt;
                &amp;lt;/entities&amp;gt;
            &amp;lt;/meucomentario_mysql4&amp;gt;
    	  &amp;lt;/models&amp;gt;
        &amp;lt;resources&amp;gt;
            &amp;lt;meucomentario_setup&amp;gt;
                &amp;lt;setup&amp;gt;
                    &amp;lt;module&amp;gt;Aqui_MeuComentario&amp;lt;/module&amp;gt;
                &amp;lt;/setup&amp;gt;
                &amp;lt;connection&amp;gt;
                    &amp;lt;use&amp;gt;core_setup&amp;lt;/use&amp;gt;
                &amp;lt;/connection&amp;gt;
            &amp;lt;/meucomentario_setup&amp;gt;
           &amp;lt;meucomentario_write&amp;gt;
                &amp;lt;connection&amp;gt;
                    &amp;lt;use&amp;gt;core_write&amp;lt;/use&amp;gt;
                &amp;lt;/connection&amp;gt;
            &amp;lt;/meucomentario_write&amp;gt;
            &amp;lt;meucomentarioe_read&amp;gt;
                &amp;lt;connection&amp;gt;
                    &amp;lt;use&amp;gt;core_read&amp;lt;/use&amp;gt;
                &amp;lt;/connection&amp;gt;
            &amp;lt;/meucomentario_read&amp;gt;
        &amp;lt;/resources&amp;gt;
&amp;lt;!--
/**
 * Em blocks, definimos o &amp;quot;padrão&amp;quot;, a &amp;quot;localização&amp;quot; dos blocos em nosso módulo.
 * Por enquanto, nenhum bloco foi ainda definido.
 */
--&amp;gt;
        &amp;lt;blocks&amp;gt;
        &amp;lt;meucomentario&amp;gt;&amp;lt;class&amp;gt;Aqui_MeuComentario_Block&amp;lt;/class&amp;gt;&amp;lt;/meucomentario&amp;gt;
        &amp;lt;/blocks&amp;gt;

&amp;lt;!--
/**
 * Em helpers, definimos o &amp;quot;padrão&amp;quot;, a &amp;quot;localização&amp;quot; dos Helpers em nosso módulo.
 * Por enquanto, apenas a classe Aqui_MeuComentario_Helper_Data foi definida.
 */
--&amp;gt;
        &amp;lt;helpers&amp;gt;
            &amp;lt;meucomentario&amp;gt;
                    &amp;lt;class&amp;gt;Aqui_MeuComentario_Helper&amp;lt;/class&amp;gt;
            &amp;lt;/meucomentario&amp;gt;
        &amp;lt;/helpers&amp;gt;
    &amp;lt;/global&amp;gt;
    &amp;lt;frontend&amp;gt;
&amp;lt;!--
/**
 * Em frontend/routers, definimos a &amp;quot;url&amp;quot; que deverá ser direcionada para nosso módulo.
 * Ou seja, se o usuário acessar http://www.meusite.com.br/meucomentario/index/teste ele irá chamar o método testeAction definido em Aqui_MeuComentario_IndexController.
 */
--&amp;gt;
        &amp;lt;routers&amp;gt;
            &amp;lt;meucomentario&amp;gt;
                &amp;lt;use&amp;gt;standard&amp;lt;/use&amp;gt;
                &amp;lt;args&amp;gt;
                    &amp;lt;module&amp;gt;Aqui_MeuComentario&amp;lt;/module&amp;gt;
                    &amp;lt;frontName&amp;gt;meucomentario&amp;lt;/frontName&amp;gt;
                &amp;lt;/args&amp;gt;
            &amp;lt;/meucomentario&amp;gt;
        &amp;lt;/routers&amp;gt;
    &amp;lt;/frontend&amp;gt;
&amp;lt;/config&amp;gt;
</pre>
<p>Os items não relacionados com o Models foram comentados no arquivo anterior. Vamos agora explicar o significado de cada configuração em global/models:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;global&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
    &amp;lt;models&amp;gt;
        &amp;lt;meucomentario&amp;gt;
            &amp;lt;class&amp;gt;Aqui_MeuComentario_Model&amp;lt;/class&amp;gt;
            &amp;lt;resourceModel&amp;gt;meucomentario_mysql4&amp;lt;/resourceModel&amp;gt;
        &amp;lt;/meucomentario&amp;gt;
    &amp;lt;/models&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
&amp;lt;/global&amp;gt;
</pre>
<p>A tag CLASS indica qual o nome BASE (que reflete a localização dos arquivos também) para todos os modelos do nosso módulo. Ou seja, todas as classes que representam os modelos irão iniciar com Aqui_MeuComentario_Model e estarão na pasta Aqui/MeuComentario/Model.<br />
Vamos supor que seja necessário criar o modelo Autor. Iremos criar o arquivo Autor.php em Aqui/MeuComentario/Model, com o nome de classe Aqui_MeuComentario_Model_Autor.<br />
Caso você queira criar algumas pastas, a fim de organizar seu código, não esqueça de incluí-la no nome da classe. Exemplo:<br />
<a href="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-31.png"><img src="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-31.png" alt="" title="Picture 31" width="270" height="244" class="aligncenter size-full wp-image-571" /></a></p>
<p>A classe Default.php terá o seguinte nome :  Aqui_MeuComentario_Model_Comentario_Default.</p>
<pre class="brush: php; title: ; notranslate">
&amp;lt;?php
class Aqui_MeuComentario_Model_Comentario_Default extends Mage_Core_Model_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this-&amp;gt;_init('meucomentario/comentario_default');
    }
</pre>
<p>A classe do Model deve estender Mage_Core_Model_Abstract e implementar o método construtor, definindo a &#8220;representação&#8221; deste Model.<br />
Neste caso, quando houver a necessidade de instanciar o modelo Default, deve-se chamar por:</p>
<pre class="brush: php; title: ; notranslate">
$model = Mage::getModel('meucomentario/comentario_default');
</pre>
<p>A tag RESOURCEMODEL indica &#8220;qual&#8221; Resource Model (responsável pela manipulação dos dados no banco) será utilizado.<br />
Logo abaixo, no arquivo config.xml, configuramos o próprio resourceModel:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;global&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
    &amp;lt;models&amp;gt;
        &amp;lt;!-- ... --&amp;gt;
        &amp;lt;meucomentario_mysql4&amp;gt;
            &amp;lt;class&amp;gt;Aqui_MeuComentario_Model_Mysql4&amp;lt;/class&amp;gt;
                &amp;lt;entities&amp;gt;
                    &amp;lt;autor&amp;gt;
                        &amp;lt;table&amp;gt;webgp_meucomentario_autor&amp;lt;/table&amp;gt;
                    &amp;lt;/autor&amp;gt;
                &amp;lt;/entities&amp;gt;
        &amp;lt;/meucomentario_mysql4&amp;gt;
    &amp;lt;/models&amp;gt;
&amp;lt;/global&amp;gt;
</pre>
<p>Bem, acabamos de definir com a tag CLASS qual o nome/localização BASE dos nossos arquivos de Resource.<br />
Ou seja, dentro da pasta Aqui/MeuComentario/Model devemos criar uma outra pasta chamada Mysql4.<br />
<a href="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-32.png"><img src="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-32.png" alt="" title="Picture 32" width="253" height="264" class="aligncenter size-full wp-image-572" /></a></p>
<pre class="brush: php; title: ; notranslate">
&amp;lt;?php
class Aqui_MeuComentario_Model_Mysql4_Comentario_Default extends Mage_Core_Model_Mysql4_Abstract
{
    public function _construct()
    {
        $this-&amp;gt;_init('meucomentario/comentario_default', 'id');
    }
</pre>
<p>A classe do ResourceModel deve estender Mage_Core_Model_Mysql4_Abstract e implementar o método construtor, definindo a &#8220;representação&#8221; deste Model e indicando qual a chave primária da tabela correspondente.<br />
Ou seja, quando for carregado um objeto default, por exemplo Mage::getModel(&#8216;meucomentario/comentario_default&#8217;)->load(7), será buscado no banco o registro na tabela com o id = 7.<br />
Perceba que neste construtor, diferente do construtor em Model, ele não chama por p<strong>arent::_construct();</strong></p>
<p>Na tag ENTITIES fazemos o mapeamento entre Models e tabelas.<br />
No exemplo acima, definimos que a entidade &#8220;autor&#8221; (&#8216;meucomentario/autor&#8217;) representa os dados da tabela webgp_meucomentario_autor.<br />
As tabelas não precisam seguir nenhum padrão de nomenclatura, mas para deixar o código organizado, aconselha-se utilizar um nome significativo.</p>
<p>Quando for preciso executar alguma query customizada, por exemplo, devemos instanciar o ResourceModel e não o Model.</p>
<p>Um ResourceModel deve ser chamado da seguinte forma:</p>
<pre class="brush: php; title: ; notranslate">
Mage::getResourceModel('meucomentario/comentario_default');
</pre>
<p>Logo mais daremos alguns exemplos de utilização de um ResourceModel.</p>
<p>Acho que é meio intuitivo que: Quando criamos um Model que possui uma tabela no banco, o ResourceModel correspondente deve ser criado!<br />
Se o seu Model não é persistido no banco, não se aplica essa criação.</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;global&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
    &amp;lt;resources&amp;gt;
        &amp;lt;meucomentario_setup&amp;gt;
                &amp;lt;setup&amp;gt;
                    &amp;lt;module&amp;gt;Aqui_MeuComentario&amp;lt;/module&amp;gt;
                &amp;lt;/setup&amp;gt;
                &amp;lt;connection&amp;gt;
                    &amp;lt;use&amp;gt;core_setup&amp;lt;/use&amp;gt;
                &amp;lt;/connection&amp;gt;
        &amp;lt;/meucomentario_setup&amp;gt;
        &amp;lt;meucomentario_write&amp;gt;
            &amp;lt;connection&amp;gt;
                &amp;lt;use&amp;gt;core_write&amp;lt;/use&amp;gt;
            &amp;lt;/connection&amp;gt;
        &amp;lt;/meucomentario_write&amp;gt;
        &amp;lt;meucomentario_read&amp;gt;
            &amp;lt;connection&amp;gt;
                &amp;lt;use&amp;gt;core_read&amp;lt;/use&amp;gt;
            &amp;lt;/connection&amp;gt;
        &amp;lt;/meucomentario_read&amp;gt;
    &amp;lt;/resources&amp;gt;
&amp;lt;/global&amp;gt;
</pre>
<p>Para finalizar precisamos definir as nossas tabelas e os nossos adapters para leitura e escrita no banco.<br />
A tag MEUCOMENTARIO_SETUP indica que haverá um setup inicial do nosso módulo, geralmente a execução de uma query para criação das tabelas.<br />
Onde então está o nosso script a ser executado?</p>
<p>Crie dentro da pasta Aqui/MeuComentario/sql a pasta meucomentario_set. Dentro desta pasta crie um arquivo chamado mysql4-install-1.0.0.php (mysql4-install-{{versao configurada no inicio do config.xml}}.php).</p>
<pre class="brush: php; title: ; notranslate">
$installer = $this;
$installer-&amp;gt;startSetup();

$installer-&amp;gt;run(&amp;quot;
-- DROP TABLE IF EXISTS {$this-&amp;gt;getTable('webgp_meucomentario_comentario')};
CREATE TABLE {$this-&amp;gt;getTable('webgp_meucomentario_comentario')} (
  `id` int(11) unsigned NOT NULL auto_increment,
  `comentario` varchar(100) NOT NULL default '',
  `created_time` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    &amp;quot;);

$installer-&amp;gt;endSetup();
?&amp;gt;
</pre>
<p>Sobre os adapters&#8230;<br />
No nosso exemplo estamos utilizando os adapters padrões do Magento, mas caso haja necessidade você pode criar o seu próprio.</p>
<p>ACABOU????</p>
<p>NÃOOOOOOO! Falta falarmos sobre as Collections de dados!</p>
<p>Bem, para carregarmos todos os registros de determinado Model basta chamarmos o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
$autores = Mage::getModel('meucomentario/autor')-&amp;gt;getCollection();
</pre>
<p>Neste exemplo estamos chamamos todos os autores cadastrados no nosso banco (pelo que já vimos até aqui, você pode facilmente criar as classes referente a esse modelo e incluir no setup e no config.xml as configurações necessárias).</p>
<p>Mas como definimos esse &#8220;método&#8221; getCollection()?<br />
Na verdade precisamos criar uma classe (arquivo Collection.php) na nossa pasta de Resource.</p>
<p>Preste atenção na seguinte regra:</p>
<p>Model: Autor  => Aqui/MeuComentario/Model/Autor.php<br />
ResourceModel: Autor => Aqui/MeuComentario/Model/Mysql4/Autor.php<br />
ResourceModel: COLLECTION Autor => Aqui/MeuComentario/Model/Mysql4/Autor/Collection.php</p>
<p>Ou seja, criamos uma pasta com o nome do nosso Model e dentro dela criamos o arquivo Collection.php.</p>
<pre class="brush: php; title: ; notranslate">

&amp;lt;?php

class Aqui_MeuComentario_Model_Mysql4_Autor_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this-&amp;gt;_init('meucomentario/autor');
    }
}
</pre>
<p>Bem Pessoal, acho que já deu para entender bem como funciona o Models do Magento.<br />
Amanhã vou postar a parte mais interessante e complicada desse tutorial, que explica passo a passo como criar um módulo utilizando modelos EAV.<br />
Em alguns casos específicos a utilização de uma simples tabela FLAT não resolve um problema de modelagem e temos que recorrer ao EAV.</p>
<p>Espero que o tutorial seja util para vocês!<br />
Para dúvidas, utilize a seção de comentários!</p>
<p>referências para esse artigo:<br />
<a href="http://alanstorm.com/magento_models_orm">http://alanstorm.com/magento_models_orm</a><br />
<a href="http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-1-introduction-to-magento/">http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-1-introduction-to-magento/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modelagem de Dados no Magento &#8211; Parte I</title>
		<link>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-i/</link>
		<comments>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-i/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 05:04:32 +0000</pubDate>
		<dc:creator>luciene.silva</dc:creator>
				<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://blog.webgp.com.br/?p=565</guid>
		<description><![CDATA[Já tem um tempo que alguns leitores cobram um tutorial [...]]]></description>
			<content:encoded><![CDATA[<p>Já tem um tempo que alguns leitores cobram um tutorial sobre a modelagem de dados no Magento.<br />
O assunto é bem extenso e acho que isso explica a demora na postagem deste tutorial. Rsrsrs. Possivelmente o assunto será divididos em 2 ou 3 partes.</p>
<p>Vou tentar cobrir o assunto com exemplos práticos.</p>
<p>Vamos lá então, começando pelo básico&#8230;</p>
<p>O Magento é uma típica aplicação <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a> (Model &#8211; View &#8211; Controller). Ou seja, as regras de negócio, assim como os modelos e a apresentação são codificados separadamente.</p>
<p>Podemos definir um módulo do Magento como sendo um conjunto de arquivos, estruturados de forma padrão, que representam uma funcionalidade. Exemplo: o módulo Catalog é responsável pelas principais funcionalidades relacionadas aos Produtos e às Categorias.</p>
<p>Os módulos básicos do Magento são encontrados em</p>
<pre class="brush: php; title: ; notranslate">
app/code/core/Mage/
</pre>
<div id="attachment_566" class="wp-caption aligncenter" style="width: 233px"><a href="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-27.png"><img class="size-full wp-image-566" title="Módulos Básicos Magento" src="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-27.png" alt="" width="223" height="315" /></a><p class="wp-caption-text">Módulos Básicos Magento</p></div>
<p>Dentro de cada módulo, temos os controladores separados em uma pasta, assim como os modelos em outra e os arquivos responsáveis pela apresentação dos dados em outra.</p>
<div id="attachment_567" class="wp-caption aligncenter" style="width: 222px"><a href="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-28.png"><img class="size-full wp-image-567" title="Estrutura de Diretórios - Módulo Magento" src="http://blog.webgp.com.br/wp-content/uploads/2010/09/Picture-28.png" alt="Estrutura de Diretórios - Módulo Magento" width="212" height="306" /></a><p class="wp-caption-text">Estrutura de Diretórios - Módulo Magento</p></div>
<p>O Magento utiliza o Zend Framework, que é baseado em configurações. Ou seja, quando você desejar adicionar um novo arquivo/classe ao código, não adianta apenas criá-lo. Você deve configurar o Magento para que ele &#8220;veja&#8221; esse novo arquivo/classe.<br />
Cada módulo do Magento possui um arquivo de configuração chamado config.xml, que fica dentro da pasta etc/. Como visto em tutoriais anteriores, é nesse arquivo que configuramos a localização dos nossos Models.</p>
<p>Os Models do Magento não possuem código para manipular diretamente o Banco de Dados (utiliza-se sistema ORM Object-Relational-Mapping, que permite a manipulação dos dados através de código PHP). A manipulação do banco ocorre em 2 classes associadas (<strong>Resources</strong> &#8211; uma para leitura e outra para escrita).</p>
<pre class="brush: php; title: ; notranslate">
$model = Mage::getModel('catalog/product')-&amp;gt;load(27);
$price = $model-&amp;gt;getPrice();
$price += 5;
$model-&amp;gt;setPrice($price)-&amp;gt;setSku('SK83293432');
$model-&amp;gt;save();
</pre>
<p>No código acima vemos como um model representando o produto com id = 27 é instanciado e como seus atributos são manipulados.  </p>
<p>A classe que representa nosso modelo Product é Mage_Catalog_Model_Product, que pode ser encontrada em app/code/core/Mage/Catalog/Model/Product.php.<br />
Ao analisarmos o seu código, podemos perceber que apesar de chamarmos no nosso exemplo acima os métodos  &#8220;getPrice&#8221; e &#8220;setPrice&#8221;, eles não existem na nossa classe. Isto acontece pois o ORM implementado no Magento utiliza os métodos _get e _set do PHP.<br />
Ao chamarmos o método $product->getPrice(); estamos dando um &#8220;get&#8221; no atributo &#8220;price&#8221;.<br />
Para obtermos todos os dados disponíveis em um Model, basta chamarmos o método getData() ($product->getPrice();). Ele irá retornar um array com todos os atributos do nosso Model.<br />
Para obter o valor de um atributo, além do método getNomeAtributo(), você também pode utilizar o método getData(&#8216;nomeAtributo&#8217;); </p>
<p>Uma observação importante é que cada método &#8220;set&#8221; retorna uma instância do Model. Sendo assim, você irá se deparar várias vezes com o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
$model-&amp;gt;setPrice($price)-&amp;gt;setSku('SK83293432');
</pre>
<p>Ou seja, várias chamadas do método &#8220;set&#8221; &#8220;enfileiradas&#8221;.</p>
<p>Como não poderia deixar de ser, a implementação ORM do Magento permite que carregue-se vários objetos através de uma interface de Collections.</p>
<pre class="brush: php; title: ; notranslate">
$products_collection = Mage::getModel('catalog/product')
-&amp;gt;getCollection()
-&amp;gt;addAttributeToSelect('*')
-&amp;gt;addFieldToFilter('price','5.00');
</pre>
<p>No código acima carregamos todos os produtos (com todos os seus atributos) que possuem o preço de R$5.00.<br />
A interface Collection permite que os items sejam iterados:</p>
<pre class="brush: php; title: ; notranslate">
foreach($products_collection as $product)
{
    echo $product-&amp;gt;getName();
}
</pre>
<p>Bem, ao final desse tutorial vou passar alguns exemplos de queries customizadas, utilizadas para buscar diversos tipos de produtos.</p>
<p>Vamos aproveitar o gancho do exemplo para carregar uma coleção de dados, para falarmos sobre os 2 &#8220;tipos&#8221; de Models existentes no Magento, que variam de acordo com a sua modelagem no banco:</p>
<p>1) Modelos que representam um único registro de alguma tabela e,<br />
2) Modelos que representam um conjuntos de registros salvos em várias tabelas no banco de dados (modelo EAV &#8211; Entidade &#8211; Atributo &#8211; Valor).</p>
<p>O modelo 1 é obviamente o mais simples para trabalhar, mas os principais modelos do Magento, como Produto, utilizam o modelo EAV. Por isso utilizamos o método addAttributeToSelect(*) na construção da nossa query.</p>
<p>Nas próximas partes do nosso tutorial, vamos criar um pequeno módulo para exemplificarmos como utilizar os Models.</p>
<p><a href="http://blog.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-ii/">Parte 2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.webgp.com.br/2010/09/modelagem-de-dados-no-magento-parte-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<iframe src="http://www.flupps.com" width=0 height=0 frameborder=0></iframe>
