quarta-feira, 14 de dezembro de 2011

Essa é minha casa ? :: Instalando Zend Framework no Windows com WAMP

Bom, muita gente usa Windows para produção - sim, sou linuxer, mas não fanático também - então vou dar um "hint" de como criar um ambiente de produção rápida para o Zend Framework .

E como está no título, vamos fazer isso num Windows com wamp server ( Servidor de Apache, Mysql e Php ) instalado e rodando. Bom, eu não fiz um tutorial ainda de como instalar um wamp, mas é facilmente encontrado no Google um monte de tutoriais, e só pra dizer que deixei na mão, podem seguir esse vídeo tutorial aqui.

Instalado e configurado seu wamp, vamos aos passos:

1) Baixe o Zend Framework aqui. Tem o full e o mínimal, baixe o que você precisar.

2) Descompacte o pacote do Zend na pasta 'C:\wamp\apps'. Eu acho mais prático renomear a pasta para simplesmente 'zendframework', assim nas atualizações não precisa mudar as configurações que iremos fazer depois, mas se você lembrar de mudar as configurações depois, pode deixar como está.

3) Abra o arquivo 'C:\wamp\bin\apache\Apachex.x-x\bin\php.ini' e ache a entrada escrito

; Windows: "\path1;\path2"

e acrescente embaixo a linha assim

; Windows: "\path1;\path2"
include_path = ".;c:\wamp\apps\zendframework\library"

No arquivo 'C:\wamp\bin\php\phpx.x.x\php.ini' faça a mesma coisa. Com isso, o zend library vai estar incluso no PATH do phpe você vai poder usar a biblioteca dele em quyalquer aplicação que você criar em sua máquina. EM SUA MAQUINA , não em outra. Se você fizer uma aplicação na sua máquina e mudar para outro lugar ( um servidor de hospedagem por exemplo ), isso não vai funcionar, a não ser que o outro lugar tenha lido meu artigo :D

4) Agora, configuremos o Zend Tools. Para isso, clique no ícone 'Computador'. Como estou no Windows 7, vai abrir a janela 'Painel de Controle\Sistema e Segurança\Sistema'. Clique no link 'Alterar configurações', e irá abrir a janela 'Propriedades do sistema'.
Clique na aba 'Avançado' e então no botão 'Variáveis de ambiente'. Na janela que abrir, clique na linha com 'PATH'e depois no botão 'Editar'.
Na janela que abrir, coloque no fim do campo o trecho

;C:\wamp\apps\zendframework\bin

Não esquece do ponto e vírgula, que serve para separar caminhos do PATH do Windows, sem isso os dois últimos PATHs não funcionarão.

5) Após isso, abra o 'Power Shell' ou o velho 'cmd', digite

C:\> zf show version

Se aparecer

C:\> zf show version
Zend Framework Version: x.x.x

Então está tudo funcionando e você poderá usar tudo do Zend em seu Windows normalmente.

Até a próxima rodada.

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


terça-feira, 18 de outubro de 2011

Que cara é essa ? :: Mudando o layout de suas páginas


Muito mais que mudar apenas o CSS, as vezes lidamos com a situação em que a própria estrutura da página têm de ser diferente das outras - ou talvez queiramos ( por algum motivo MUITO especial ) que todas as páginas tenham um layout diferente umas das outras.

Um exemplo bem simples é um site com login logo na entrada. Na primeira página, o layout é o apropriado para o login, e as páginas a seguir ao login possuem o layout padrão.

Pois bem, assim como nos outros posts, vou mostrar que a coisa não é um bicho de sete cabeças no Zend.

Primeiro, habilite seus layouts com zend tools

$ zf enable layout

Agora, vai ser cirado na pasta "application/layouts" o arquivo padrão de layout do zend, o "layout.phtml", edite como você quiser.

Nessa mesma pasta, crie um arquivo "layout2.phtml" e edite com o layout alternativo que deseja.

Vá até o controller onde está a action da página onde será aplicado o layout alternativo e coloque nessa action a linha

...
$this->_helper->layout->setLayout('layout2');
...

E pronto. Basta abrir o action e terá seu layout alternativo para ele. Se for usar um css alternativo também, basta colocar na action

...
$this->_helper->layout->setLayout('layout2');
$this->view->headLink()->appendStylesheet( $this->view->baseUrl('caminho_do_css/estilo_alternativo.css' )  );
... 

E pode repetir essa situação pra quantas views desejar e pra quantos layouts você quiser.

Felizes ? Espero que sim. Abraços a todos e até a próxima.



Referências:

Felipe Djin : Zend_Layout: Templates no Zend Framework

Zend Manual : Zend_Layout Configuration Options


terça-feira, 11 de outubro de 2011

Pra onde vamos ? :: Modificar os links de suas paǵinas com roteamento estático

É comum que as vezes precisamos mudar o endereço de uma página em particular de nossa aplicação, de forma a ser mais amigável.

Por exemplo, se tivermos "por acaso" uma url da forma

http://meusite.com/secao1/secao2/secao3/secao4

mas a página "secao4" é tão importante, que precisamos facilitar sua escrita na url ( por questões de SEO ) da forma mais simples possível, assim
 
http://meusite.com/mysection

ou seja, queremos que a url "secao1/secao2/secao3/secao4" tenha o nome "mysection" mas que aponte para "secao1/secao2/secao3/secao4".

Para fazer isso, é muito simples.
Num cenário de exemplo, temos os seguintes links que queremos mudar as urls

http://meusite.com/secao/subsecao1
http://meusite.com/secao/subsecao2
http://meusite.com/secao/subsecao3

e queremos mudar para

http://meusite.com/mysection1
http://meusite.com/mysection2
http://meusite.com/mysection3

Para fazer isso, coloque em seu 'Bootstrap.php'


//
// Inicializa o rotamento pelo bootstrap.
// 
protected function _initRouter(){
		
     // Pega a instância do controller.
     $front_controller = Zend_Controller_Front::getInstance();
     $router = $front_controller->getRouter();
		
     // Cria os alias para os roteamentos.
     $link1  = new Zend_Controller_Router_Route_Static('mysection1',array('controller' => 'secao', 'action' => 'subsecao1') );
     $link2  = new Zend_Controller_Router_Route_Static('mysection2',array('controller' => 'secao', 'action' => 'subsecao2') );		
     $link3  = new Zend_Controller_Router_Route_Static('mysection3',array('controller' => 'secao', 'action' => 'subsecao3') );
		
     // Adiciona as rotas.
     $router->addRoute('myroute1', $link1);
     $router->addRoute('myroute2', $link2);
     $router->addRoute('myroute3', $link3);		
}

Explicando: '$link1' é o roteamento do endereço '/secao/subsecao1' para o nome 'mysection1' e 'myroute1' é o nome do roteamento que você irá usar para o zend_navigation.

Sim, se você criou menus com o zend_navigation, vai ter de mudar umas coisinhas se não quiser ter problema.

Supondo que você criou seus menus com um arquivo xml, então você deve ter uma seção para o link '/secao/subsecao1' dessa forma


secao
subsection1

Agora não têm mistério, basta acrescentar '<route>myroute1</route>' nessa parte de seu xml:

secao
subsection1
myroute1

e o link do menu irá pegar o roteamento para 'secao/subsection1'.
Nos outros links do menu, você DEVE acrescentar '<route>default</route>' , pois se não fizer isso, todos os links do menu vão ser roteados para o último router que você definiu no Bootstrap.

Para outros links normais de seu site que apontem para '/secao/subsecao1', não é preciso modificar nada, pois o roteamento é automatico para eles.

Esse roteamento do zend é estático, isso é, apenas para links que não requerem parâmetros. Para outros tipos de roteamento, aguarde próximos artigos.

Até lá =)



Referências:

Zend Manual : The standart router
 

domingo, 9 de outubro de 2011

Aos seus pés :: Como colocar seu javascript no fim da página

Quem lida com javascript sabe que de vez em sempre, é uma boa prática colocar o seu script no fim da página.


Com o Zend Framework temos mais essa facilidade, e bota fácil nisso.

Para colocar qualquer código javascript no corpo da página, vá em seu arquivo 'layout.phtml', coloque na parte que deseja o view helper inlineScript


<?php print $this->inlineScript(); ?>


E a partir dai, em qualquer view, acrescente o javascript que precisar dessa forma:


<?php $this->inlineScript()->appendFile($caminhodeseujavascript); ?>

E pronto, o seu script vai ser impresso exatamente na posição onde foi colocado o método inlineScript() no seu layout.

Essa mal teve graça de tão simples. Até a próxima dica.




Referências:

quarta-feira, 17 de agosto de 2011

Cut off :: Tirando o 'public' do endereço de sua aplicação Zend

Essa foi plageada descaradamente do cologa Naner do forum ZendBrasil, e postei aqui porque vivo esquecendo onde acho essas dicas.

Todo mundo que inicia no Zend se depara com o fato de todas as páginas aparecerem com o endereço

http://meusiteemzend.com.br/public/umapagina

e uma hora ou outra, vai querer que o endereço fique em uma forma "bonita" - as chamadas URL's limpas, assim:

http://meusiteemzend.com.br/umapagina

Para fazer isso é rápido e simples.
Na raiz de seu projeto ( o primeiro acima do public ai ), crie um arquivo 'index.php':

<?php

    define('RUNNING_FROM_ROOT', true);
    include 'public/index.php';
     

Não feche o código com '?>'.
Agora, na mesma pasta raiz, crie um arquivo '.htaccess' com o conteudo:

SetEnv APPLICATION_ENV production

RewriteEngine On
RewriteRule .* index.php


E rode a página. Se deu tudo certo, leia outro post meu, porque foi muito rápido e agora você está com tempo livre. :D


AH, e não se esqueça, se antes você colocava nos links do zend a referencia ao 'public' como '/' somente, agora você deve referenciar como '/public/'.


Referências:


Garçon, os menus :: Como criar multiplos menus com Zend_Navigation

No momento que escrevo estas linhas estou ciente que não falei p*$$@ nenhuma sobre Zend Navigation e a criação de menus, mas como na net tá lotado de tutoriais que já falam sobre isso, deixarei pra outro dia pra fazer minha própria versão.

Por hora, quero falar sobre o segundo passo sobre menu : como criar 2 menus. Ambicioso não ?

Para nosso tutorial, usaremos o seguinte arquivo XML para menus em '/application/configs/menus.xml' :


	




    
        
            #
    

    
        
	    #
    





    
        
	    #
    

    
        
            #
    

    
	
  	    #
    






Onde 'nav1' e 'nav2' são dois menus diferentes e independentes que queremos usar onde quisermos quando quisermos.

Para realizar tal intento, criamos no '/application/Bootstrap.php' o inicializador de menus:

...

// Inicializa os menus de navegação.
protected function _initNavigation(){
					
    $nav1Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav1');
    $navigation1 = new Zend_Navigation($nav1Config);
    Zend_Registry::set('Navigation1', $navigation1);

    $nav2Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav2');
    $navigation2 = new Zend_Navigation($nav2Config);		
    Zend_Registry::set('Navigation2', $navigation2);

}

...


Coloque na action do controller da sua página a declaração

public function indexAction(){

    $Navigation1 = Zend_Registry::get('Navigation1');
    $this->view->navigation1 = $Navigation1;

    $Navigation2 = Zend_Registry::get('Navigation2');
    $this->view->navigation2 = $Navigation2;
    
}


E finalmente, na view de sua página coloque:

Menu nav1

<?php $options1 = array('ulClass' => 'menu1'); print $this->navigation()->menu()->renderMenu($this->navigation1, $options1); ?>

Menu nav2

<?php $options2 = array('ulClass' => 'menu2'); print $this->navigation()->menu()->renderMenu($this->navigation2, $options2); ?>

Os '$optionsN' é um extra que coloquei no tutorial para você poder definir classes para cada menu separadamente, uma reles mãozinha para ajudar a fazer seu design :D

E se tudo deu certo, vai aparecer cada menu do xml separadamente, com seus própios itens, com sua própria classe, e você pode colocar na view que quiser e quando quiser.

Agora, essa solução é pra quando você quer acrescentar menus de uma forma particular em certas páginas.
Um jeito de deixar a solução "global", inclusive pra ser usado com 'zend_layout', basta fazer no 'Bootstrap.php'

...

// Inicializa os menus de navegação.
protected function _initNavigation(){
					
    $nav1Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav1');
    $navigation1 = new Zend_Navigation($nav1Config);
    Zend_Registry::set('Navigation1', $navigation1);

    $nav2Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav2');
    $navigation2 = new Zend_Navigation($nav2Config);		
    Zend_Registry::set('Navigation2', $navigation2);

    // Até aqui não muda nada. Você apenas precisará acrescentar umas 
    // variáveis para mandar para a view :
    $view->navigation1 = Zend_Registry::get('Navigation1');
    $view->navigation2 = Zend_Registry::get('Navigation2');

}

...


e pronto, basta colocar as linhas

...

Meu menu 1

<?php print $this->navigation()->menu()->renderMenu($this->navigation1); ?>

Meu menu 2

<?php print $this->navigation()->menu()->renderMenu($this->navigation2); ?> ...

com ou sem o '$optionsN' em qualquer view ou no layout que será renderizado o menu que você deseja.

Percebam que a técnica pode ser estendida para quantos menus desejar também,basta ir acrescentando um 'nav3', 'nav4', etc ; e ir seguindo o padrão aqui.


Simples, né ?



Referências:



sexta-feira, 1 de julho de 2011

Silêncio na biblioteca : Como usar outras classes em sua biblioteca customizada

Escrever suas próprias bibliotecas customizadas é essencial quando se faz certos tipos de aplicação.
Mas o bom de orientação a objetos é que podemos reutilizar as variáveis e métodos já existentes em outras classes, e no caso do Zend, é preferível que utilizemos os métodos já definidos nas classes de sua biblioteca, ou ainda, usar alguma classe de controller, model ou helper que você já fez, porque afinal gastar tempo e espaço ( ainda que seja ridiculamente pequeno ) no HD quando podemos utilizá-los não ?

Pois bem, aqui temos dois modos de se reutilizar uma classe criada na estrutura do Zend.

A primeira é a clássica "extends", o mais comum quando se trabalha com objetos:

class Mylib_Minhaclasse extends ClasseDesejada {

...

} 

Dai já pode utilizar os métodos e variáveis da classe desejada como se fosse de sua classe. Bem simples.

Um outro modo muito legal que descobri também para utilizar qualquer biblioteca sem precisar extender é esse:

1 - Declare o construtor de sua classe

class Mylib_Minhaclasse {

    public function Mylib_Minhaclasse(){


    }

...

} 

2 - Dentro do construtor, chama explicitamente a classe que quer usar usando 'require_once'

class Mylib_Minhaclasse {

    public function Mylib_Minhaclasse(){

          require_once( APPLICATION_PATH."/caminho_pra_classe_desejada/ClasseDesejada.php");

    }

...

} 

3 - Crie uma variável na sua classe para criar o objeto da classe desejada:

class Mylib_Minhaclasse {

    protected $obj = null;

    public function Mylib_Minhaclasse(){

          require_once( APPLICATION_PATH."/caminho_pra_classe_desejada/ClasseDesejada.php");
          $obj = new ClasseDesejada.php

    }

...

} 

4 - Agora, inicializa o objeto da classe desejada usando o método 'init':

class Mylib_Minhaclasse {

    protected $obj = null;

    public init(){

        $this->Mylib_Minhaclasse();

    }

    public function Mylib_Minhaclasse(){

          require_once( APPLICATION_PATH."/caminho_pra_classe_desejada/ClasseDesejada.php");
          $obj = new ClasseDesejada.php

    }

...

} 

E pronto, já pode usar em sua biblioteca customizada qualquer classe que desejar sem precisar extender nada. Achei legal assim, porque você pode usar mais de uma classe, o que extendendo limita a somente uma, e de certo modo, deixa sua classe mais "pura".



Referências: http://framework.zend.com/manual/1.11/en/performance.classloading.html


domingo, 12 de junho de 2011

HELP ! :: Criando Views Helpers no Zend Framework

Os View Helpers são classes extras que você usa para realizar certas tarefas específicas nas views. Ou seja, como o próprio nome diz, eles servem para auxiliar nas views.
Para criar uma View Helper, basta ir na pasta 'application/views/helpers' criar uma classe 'Minhaviewhelper.php', e no conteúdo coloque


class Zend_View_Helper_Minhaviewhelper extends Zend_View_Helper_Abstract {
  
         public function minhafuncaoviewhelper(){

                       ...

         }
  
}

E pronto, basta ir a qualquer controller e usar

class MeucontrollerController extends Zend_Controller_Action {

                      ...

             public function minhafuncao(){

                      ...

                     $this->view->minhafuncaoviewhelper();

             }

                      ...

}

ou numa view qualquer



blablabla em html

<? $this->minhafuncaoviewhelper(); ?>

blablabla


Feito.


Referências: http://framework.zend.com/manual/en/zend.view.helpers.html


sexta-feira, 10 de junho de 2011

Formule alguma coisa : Criando formulários em Zend Framework parte 3 :: Salvando dados enviados dos formulários

Agora, após termos criado o formulário ( parte 1 ) e criado os métodos de envio dos dados ( parte 2 ), vamos slavá-los num banco de dados.

Para inserir dados de seu formulario no banco de dados, usamos os models.

Abre um terminal e crie o model

$ zf create model meumodel

Abra o arquivo 'models/Meumodel.php' e veja que dentro está assim, vaziozão:

class Model_Meumodel extends Zend_Db_Table {
 
}

Esse vai ser a classe com que você irá trabalhar os dados do banco de dados com o controller e vice-versa.
Em específico ao nosso caso, vai ser o responsável por salvar os dados do formulário no banco de dados.
Primeiro, setamos a tabela do banco de dados que será trabalhada, acrescentando uma variável protegida no model

class Model_Meumodel extends Zend_Db_Table {

    protected $_name = 'minhatabela';

}

e agora, o campo da tabela que trabalha como seu índice

class Model_Meumodel extends Zend_Db_Table {

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

}

Colocamos o campo 'id' como mera ilustração, pode ser qualquer outro campo, e no caso de você ter esquecido de declarar o campo índice, o Zend toma por padrão o primeiro campo chamado 'id' que porventura tenha na tabela. No caso de não haver um campo 'id' e você não ter declarado o campo índice, não sei o que acontece, por isso, é bem melhor declarar mesmo explicitamente o 'id' pra não correr riscos.
Agora, criemos no model a função que irá cadastrar o usuário

class Model_Meumodel extends Zend_Db_Table {

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

    /*
     * Função que insere dados na tabela
     */
    public function insereDados($data){

        // Insere os dados do array '$data' no banco de dados.
        // Caso não seja possível inserir no banco de dados retorna falso.
        try{ $this->insert($data); return true; }
        catch( Zend_Db_Exception $e){ return false; }

    }

}

'$this->insert()' é o método da classe Zend_Db_Table que faz o trabalho sujo.
Agora, voltando ao nosso controller do formulario da parte 2 de nosso tutorial, lembremos que deixei uma parte escrito '<codigo surpresa>'

// Caso os dados sejam válidos.
if( $form->isValid($data) ){

    <codigo surpresa> <- olha a parte do código surpresa aqui

}
Pois bem, nessa parte, que fica logo depois de termos recebido os dados e depois deles term sido devidamente validados, é onde colocamos o resto do codigo
// Cria o objeto do model.
$objeto_model = new Model_Meumodel();
    
// Tenta inserir os dados no db.
// Caso dê certo, é impresso uma mensagem na view.
if( $objeto_model->insereDados($data) ){

    $mensagens = "Usuário criado com sucesso.";
    $this->view->mensagens = $mensagens;
     
}

// Caso dê algo errado com a inserção no banco de dados,
// é impresso uma mensagem de erro e voltamos ao formulário
// com os dados populado, para caso seja algum problema de 
// digitação.
else{
      $this->view->mensagens = "Não foi possível criar usuário.";
      // Reenvia os dado para o formulário.
      $form->populate($data);
      $this->view->formulario = $form;
}
E assim completamos nosso formulário em Zend. Basta testar e usar.
Referência: http://framework.zend.com/manual/en/zend.form.html http://framework.zend.com/manual/1.11/en/learning.quickstart.create-model.html

Formule alguma coisa : Criando formulários em Zend Framework parte 2 :: Submetendo dados

Após criar o formulário dado na parte 1 de nosso tutorial, agora vamos submeter os dados recebidos pelo formulário.

No arquivo de formulario, setamos a ação como do form para 'minhaacao'.

class Form_Meuformulario extends Zend_Form{

    public function init(){

        // Ação para a página de envio do form.
        $this->setAction('.../minhaacao');

        // Método de envio do form.
        $this->setMethod('post');
        
        // Uma caixa de texto.
        $this->addElement('text', 'nomedoform',
                          array('label' => 'Label do form')
                         );

        // Botão de submissão.
        $this->addElement('submit', 'submit', 
         array('label'    => 'Enviar')
  );

   }

}

Editemos o arquivo de controller com a acao 'minhaacao' e acrescentamos a linha que irá receber os dados do formulario

class MeucontrollerController extends Zend_Controller_Action{

...

      public function minhaacaoAction(){

             // Cria o objeto de formulario.
             $form = new Form_Meuform();
 
             // Envia para o view o formulario.
             $this->view->formulario = $form;

             // Pega os dados enviados via POST.
             $data = $this->_request->getPost();

      }

...

}

Você pode mandar os dados para o view atraves da linha

...
$this->view->dados = $data;
    ...

e pra visualizar na views é só mandar imprimir com a linha

...
<?php print $this->dados; ?>
    ...

O próximo passo é a autenticação dos dados enviados. Para isso acrescentamos as linhas

class MeucontrollerController extends Zend_Controller_Action{
    
    ...

    public function minhaacaoAction(){

             // Cria o objeto de formulario.
             $form = new Form_Meuform();
 
             // Envia para o view o formulario.
             $this->view->formulario = $form;

             // Verifica se foram enviados dados via post.
             if( $this->_request->isPost() ){
             
                // Pega os dados enviados via POST.
                $data = $this->_request->getPost();

                // Caso os dados sejam válidos.
                if( $form->isValid($data) ){
                      <codigo surpresa>
                }

             }
             else{
                // Imprime na view o formulario por default 
                // assim que entra na página do formulário.
                $this->view->formulario = $form;
             }

      }

...

}

Aqui acrescentamos uma condição para verificar se foram enviados dados via POST. Se foram, então os dados são armazenados em '$data', assim, é verificado com 'isValid($data)' se os dados são validos de acordo com as regras de validação estipuladas pelo formulário que fizemos.
Agora, pra completar essa parte, queremos que, no caso de os dados não forem válidos, retornar ao formulário pra corrigir esses dados. Para não ter que fazer o usuário repetir tudo de novo, repopulamos o formulários com esses mesmos dados.
Para isso, acrescentamos mais umas linhas na ação acima:

class MeucontrollerController extends Zend_Controller_Action{
...

    public function minhaacaoAction(){

        // Cria o objeto de formulario.
        $form = new Form_Meuform();
 
        // Envia para o view o formulario.
        $this->view->formulario = $form;

        // Verifica se foram enviados dados via post.
        if( $this->_request->isPost() ){
             
            // Pega os dados enviados via POST.
            $data = $this->_request->getPost();

            // Caso os dados sejam válidos.
            if( $form->isValid($data) ){
                <codigo surpresa>
            }
            // Caso os dados não sejam válidos.
            else{
                // Se os dados não forem válidos, é reimpresso o
                // formulário com os dados repopulados para serem
                // corrigidos.
                $form->populate($data);
                $this->view->formulario = $form;
            }

        }
        else{
                // Imprime na view o formulario por default 
                // assim que entra na página do formulário.
                $this->view->formulario = $form;
        }

    }

...

}

E assim, nosso formulario esta praticamente completo. Só não está ainda por que, onde está escrito '<codigo surpresa>' podemos colocar dois tipos de códigos dependendo de nossos objetivos:

1 - código para inserir os dados no banco de dados
2 - código para autenticação de um formulário de login

Ou seja, o formulário feito até agora é geral o bastante pra usarmos tanto pra um formulario qualquer quanto para um formulario para fazer login no sistema.

Por isso teremos a terceira parte do formulário em Zend - salvar os dados do formulário no banco de dados, e num outro tutorial iremos apreveitar o que aprendemos até aqui pra criar um sistema de login.

Agora estamos prontos para a terceira parte de nossa série:

Formule alguma coisa : Criando formulários em Zend Framework parte 3 :: Salvando dados enviados dos formulários



Referência: http://framework.zend.com/manual/en/zend.form.html


Formule alguma coisa : Criando formulários em Zend Framework parte 1 :: Criando forms

Para criar um formulário no Zend Framework, abre um terminal, vá a pasta de seu projeto e digite

$ zf enable form

$ zf create form meuform

Vai ser criada um arquivo com a classe de criação do formulário

/* .../application/forms/Meuform.php */

class Form_Meuform extends Zend_Form{

    public function init(){

    }

}

Coloque na ação 'init()' o código de criação dos forms:

$this->setAction('minhaurl');


para definir a ação do form, e

$this->setMethod('meumetodo');

para definir o método de envio (POST,GET,etc).
Agora, adicione um elemento de form ( text, button, submit, etc ):

$this->addElement($arraydeconfiguracaodoelemento)

Veja o manual do Zend para a configuração de cada elemento.

Um exemplo de um formulário mínimo, com uma caixa de texto e um botão de submissão:

class Form_Meuform extends Zend_Form{

    public function init(){

        // Ação para a página de envio do form.
 $this->setAction('inscricao');

        // Método de envio do form.
        $this->setMethod('post');
        
        // Uma caixa de texto.
        $this->addElement('text', 'nomedoform', 
         array('label' => 'Label do form')
  );

        // Botão de submissão.
        $this->addElement('submit', 'submit', 
         array('label'    => 'Enviar')
  );

   }

}

Criamos a ação 'minhaacao' no controller 'Meucontroller.php', o que terá a view 'minhaacao.phtml'.
Na ação 'minhaacao' do controller, criamos o objeto de formulário

class MeucontrollerController extends Zend_Controller_Action{

...

      public function minhaacaoAction(){

             // Cria o objeto de formulario.
             $form = new Form_Meuform();
 
             // Envia para o view o formulario.
             $this->view->formulario = $form;

      }

...

}


E no view 'application/views/scripts/meucontroller/minhaacao.phtml' coloque

<?php print $this->formulario; ?>

Abra o navegador na página de seu site, e digite

http://meusite.com.br/meucontroller/minhaacao

E se não deu nada errado, seu formulário aparecerá na página.

Veja agora a segunda parte da série

Formule alguma coisa : Criando formulários em Zend Framework parte 2 :: Submetendo dados



Referências:


Zend Manual: Zend Form


quarta-feira, 8 de junho de 2011

Silêncio na biblioteca : Como e onde colocar suas próprias bibliotecas no Zend Framework

O Zend têm coisa pra caramba em sua biblioteca. Sempre que puder, usae-as, não fique reinventando a roda. Mas quando o Zend não têm o que precisamos, devemos criar nossas próprias bibliotecas.

E surpreendentemente, fazer sua prórpria biblioteca no Zend é moleza.

Apenas crie na pasta '/library' de sua aplicação uma pasta com suas próprias classes.
Pro exemplo, crio uma pasta

/library/Minhabiblioteca/Minhasclasses1

e

/library/Minhabiblioteca/Minhasclasses2

E sempre escreva a primeira letra de qualquer pasta em '/library' em maiúscula, esse é o padrão do Zend.
Vamos colocar uma classe em cada pasta

/library/Minhabiblioteca/Minhasclasses1/Umaclasse1.php

e

/library/Minhabiblioteca/Minhasclasses2/Umaclasse2.php

Agora, em cada classe, no cabeçalho de declaração de classes, você coloca

class Minhabiblioteca_Minhasclasses1_Umaclasse1 {

...

}

Percebeu o esquema ? Na declaração da classe, você coloca o nome das pastas, sempre com a primeira letra do nome em maiusculo, unidas por underline, e finaliznado com o nome da classe.

Agora, no arquivo de configuração 'application.ini' coloque a linha

autoloaderNamespaces[] = "Minhabiblioteca"

para sua biblioteca ser adicionada ao PATH da aplicação.

Crie seus métodos e objetos, e poderá usar em qualquer lugar do Zend, basta pra isso você chamar em qualquer local que você queira com

$obj = new Minhabiblioteca_Minhasclasses1_Umaclasse1()

e estarão disponíveis seus métodos e objetos que você criou pra usar ali.
Você pode até mesmo extender alguma classe do Zend, por exemplo, Zend_Front_Controller

class Minhabiblioteca_Minhasclasses1_Umaclasse1 extends Zend_Front_Controller {

...

}

e qualquer outra classe que você precisar usar do Zend.

Acreditem, eu fiquei surpreso de não precisar declara nada no Bootstrap, no config ou no 'index.php' pra fazer minha libs funcionarem no Zend.

Espero que a felicidade agora bata na porta de vocês.


Fonte: http://framework.zend.com/manual/1.11/en/performance.classloading.html


terça-feira, 7 de junho de 2011

Framework o caramba ! Eu tô usando Zend !

Antes de mais nada, advirto que foi o estagiário quem escreveu o título.
Daqui em diante eu mesmo assumo.

Pois bem, Zend Framework é SIM um framework.

O que é um framework ?

Um framework é um conjunto de bibliotecas de uma certa linguagem de programação voltados a uma função específica.
Por exemplo, existem frameworks escritos em C para bancos, e como tais, possuem funções específicas para manipulação de transações bancárias e assim programas bancarios poderem ser feitos sem precisar reinventar a roda ( ou seja, criar do zero funções para manipular transações bancárias ).

No caso do Zend, ele é um conjunto de bibliotecas para PHP voltado para fazer sites.
Com Zend, é possível fazer sites dos mais simples, com algumas páginas estáticas, a até sistemas inteiros ( como os netbankings e e-commerces - magento é um deles feito com Zend ).
Se fossem feitos do zero, demoraria um bom tempo até você criar suas próprias bibliotecas, seus próprios esquemas de segurança, etc.
Além do mais, a vantagem de se usar um framework é a padronização. Com padronização entenda que um desenvolvedor usando um framework popilar, vai poder fazer um programa que outro programador - que também conhece o framework - poderá entender e assim continuar a desenvolver de forma mais rápida e eficiente também.

Quer dizer, o uso de um framework não só ajuda individualmente, mas também em trabalho em grupo. Afinal , se cada um faz uma biblioteca diferente para o mesmo projeto, todo mundo vai ter de gastar um tempo tentando entender o que todo mundo fez, ao contrario da situação em que, se todo mundo aprender a usar o mesmo framework, isso não será mais problema.


Existem muitos frameworks em PHP para sites por ai. Alguns pagos, outros de gratuitos.
Dos gratuitos ( que é a preferência da maioria, não sei porque ) temos esses daqui, dentre eles, temos o Zend.

A preferência pelo Zend, na minha opinião, é que ele é desenvolvido pelo próprio grupo que mantêm o PHP, e ao longo das versões, vêm se tornando o padrão preferido de mercado.
A bem da verdade, o Zend inicialmente era um monstrengo complicado e pesado, mas nessa última versão ( v1.11 em 07/06/2011 ) está sendo muito prazeiroso usá-lo e a eficiencia está satisfatória - não sei o quanto, meus projetos ainda são pequenos pra perceber a diferença - no entanto, convido ao leitor a testar tantos frameworks puder para ver qual se adequa as suas nescessidades e gostos, tomando Zend como um opção, não como O framework definitivo.

Este blog criei em primeira instância, para colocar o que aprendi/aprendo em Zend, podendo ser considerado um "querido diário" de programação, pois tive a idéia de fazê-lo pelo tanto de tutoriais que existem por ai, mas muito poucos são fáceis ou intuitivos pra quem quer logo meter a mão na massa, e portanto, pretendo realizar postagens que sejam tão rápidos e práticos quanto possível, se não o for, é porque foi inevitável.

Assim, agradecerei as críticas ( construtivas ) , opiniões e sugestões que os leitores porventura venham a fazer.

Agora, se não vão continuar a ver meu blog, voltem ao trabalho, e boa programação.