domingo, 27 de novembro de 2011

Aperitivo grátis :: Mudando a pasta raiz de sua instalação do Magento

O Magento é um e-commerce feito em Zend, e como esse site fala de Zend, creio não haver problemas em falar do Magento - tirando o fato que eu uso Magento também =)

Então, como primeira dica sobre Magento, vou explicar como resolver o problema de mudar a pasta de instalação de seu Magento DEPOIS que você instalou-o.

Sim, porque , muitas vezes, queremos fazer umas mudanças em nosso site - seja porque queremos colocar um site apenas como seção de outro site, ou apenas está colocando ordem no host no meio de centenas de pastas ... - e resolvemos isso da seguinte maneira:

Na hora de instalação, o magento cria no banco de dados, uma tabela de nome "*core_config_data".
Nessa tabela, existem dois campos de nomes "web/unsecure/base_url" e "web/secure/base_url".
Se você olhar nesses campos, vai perceber que os valores deles são exatamente o diretório raiz da instalação de seu magento.
Nem precisaria dizer o que fazer, mas como sei que têm programador que vai pro trabalho de porre, ou que gosta de ficar codando de madrugada com aquele sono, vou dizer que mude o valor desses campos para o endereço da nova pasta raíz de sua instalação.
Após mudar no banco de dados, apague todo o conteúdo da pasta "var/cache" e rode o magento.


Uma outra maneira de fazer isso é meio sacana.
Você vai até a pasta "app/etc" e muda o nome do arquivo "local.xml" para "local.xml.bkp" ( ou apague de vez o arquivo, o local.xml.bkp" é só por precaução ).
Agora, rode o seu magento. Ele vai entrar na tela de instalação. Siga a instalação normalmente ( mas mantendo o mesmo banco de dados e o mesmo prefixo das tabelas do magento ).
Ao final, os dados sobre o endereço da pasta nova vão estar atualizados.

Se deu tudo certo, volte ao serviço. Até a próxima.



Referências:

CEREBRUM: Mudando manualmente o base URL do Magento


sábado, 19 de novembro de 2011

Você é meu amigo, não é ? :: Relacionamento de tabelas simples com Zend Models

Mais uma pra tentar facilitar a vida dos zendeiros.

Imaginemos a situação onde temos que cadastrar um carro num db.
Vamos registrar o modelo e a cor.
MAS, em vez de usar um campo de cores direto na tabela dos carros, criamos uma tabela de cores separado ( o que ajudaria muito a criar um 'form select' com as opções de cores, por exemplo ) e depois vamos associar a cada carro da tabela de carros, uma cor da tabela de cores.

Sentiram a situação ?

Pois bem, para esse problema, temos as tabelas e os campos

                    carros     cores
                    id         id
                    modelo     cor
                    id_cor

A idéia é intuitiva: a cada 'id' de 'carros', associamos um 'id_cor' que corresponde ao 'id' da tabela 'cores', e dai queremos pegar o nome da cor correspondente ao 'id' em 'cores'.

Pra fazer isso no Zend é bem simples ( agora que aprendi é simples, claro ¬¬ ).

Criemos dois models: um pra tabela 'carros', e outro pra tabela 'cores':

$ zf create model carros
$ zf create model cores

Pois bem, no model 'Carros.php', temos a classe 'Application_Model_Carros'

<?php

class Application_Model_Carros extends Zend_Db_Table_Abstract {

 protected $_name = 'carros';
 protected $_primary = 'id';
 
}

e no model 'Cores.php', temos a classe 'Application_Model_Cores'
<?php

class Application_Model_Cores extends Zend_Db_Table_Abstract {

 protected $_name = 'cores';
 protected $_primary = 'id';
 
}

onde percebe-se que já definimos as tabelas de cada model e os devidos primary keys.
Agora, pra relacionar o campo 'ide_cores' da tabela carros ao campo 'id' da tabela 'cores', declaramos no model 'Application_Model_Carros' a sua dependencia com a tabela 'cores' assim:


<?php

class Application_Model_Carros extends Zend_Db_Table_Abstract {

 protected $_name = 'carros';
 protected $_primary = 'id';

        // Declara a dependencia da tabela 'carros' com a tabela 'cores' 
        // através do model 'Application_Model_Cores'.
 protected $_dependentTables = array('Application_Model_Cores');
 
}

E acabamos com a parte do model para os carros.
No model 'Application_Model_Cores', devemos criar os relacionamentos entre os campos. Para isso, fazemos


<?php

class Application_Model_Cores extends Zend_Db_Table_Abstract {

 protected $_name = 'cores';
 protected $_primary = 'id';

  protected $_referenceMap = array( 
   'refCores' => array( 
    'refTableClass' => 'Application_Model_Carros',
    'refColumns'    => array('id_cor'),
    'columns'       => array('id')
  )
 ); 
}

onde a variável especial '$_referenceMap' cria o mapa de associação desejado entre as tabelas.
Nos arrays, temos que

  • 'refCores' é apenas um label para esse mapeamento, pode ter qualquer nome que você queira
  • 'refTableClass' é classe da tabela pai que depende da tabela 'cores' ( que é a filha
  • 'refColumns' é o campo da tabela pai que está relacionado com um campo da tabela filha ( no caso, o campo 'id_cor' da tabela pai se relaciona com o campo 'id' da tabela filha )
  • 'columns' é o campo da tabela filha que é requerido pela relação com o campo 'refColumns' da tabela 'pai'.

E isso finaliza o nosso tratamento com os models.
Agora, no controller onde você vai trabalhar ( usaremos aqui  como exemplo 'Dados.php' ), digite no seu action

<?php
class DadosController extends Zend_Controller_Action {

    public function init(){
     /* Initialize action controller here */
    }

    public function indexAction(){
 
 // Criamos o objeto do model da tabela 'carros'. 
 $carrosModel = new Application_Model_Carros();

        // Pegamos o carro de 'id' igual a 3.
 $carros = $carroModel->fetchRow('id=3');

        // Aqui pegamos os campos das cores relativos ao carro de 'id'
        // igual a 3.
 $cores = $carros->findDependentRowSet("Application_Model_Cores");
 
        // Imprime o modelo e a cor do carro de 'id' igual a 3.
 print "Modelo :: ".$carros['modelo'];
        print "Cor :: ".$cores[0]['cor'];

    }

}



O que ocorre é simples: fazemos um 'fetchRow' para pegar os campos do carro de 'id' igual a 3 e salvamos no array '$carros'.
Com o método 'findDependentRowSet' pegamos os campos da tabela 'cores' correspondente ao 'id_cor' do carro, conforme as relações entre tabelas que configuramos e salvamos no array '$cores'.
O resto já conhecemos.
Então, podem ir atacando o zend, que mais essa foi resolvida.
Até a próxima.



Referências:


UOL Host : Zend Framework: Relacionamento de tabelas com o Zend_Db_Table

Zend Manual : Zend_Db_Table Relationships