Neste artigo vamos criar um projeto utilizando o servidor XAMPP e a IDE Netbeans.

Primeiramente deve-se acessar o site do Zend Framework http://framework.zend.com/downloads/latest#ZF1

e realizar o download do mesmo, mas tenha bastante atenção, pois no momento deste artigo o Zend Framework conta com duas versões do seu framework, mas usaremos a versão 1.12.11. Baixe a versão Minimal, como mostra a Figura 1.

Site para download da versão 1.12.11 do Zend Framework

Figura 1. Site para download da versão 1.12.11 do Zend Framework

Teremos um arquivo .zip contendo uma pasta bin e outra pasta library, que por sua vez contém o framework em si. Ela é essencial para que o projeto possa utilizar o Zend e toda a sua estrutura. Já a pasta Bin contém arquivos para configurar o Zend Tools, que é uma ferramenta utilizada para facilitar a criação de arquivos no nosso projeto e arquivos como controles, modelos e visões.

Antes de iniciar a construção do projeto é interessante que tenhamos o Zend tools configurado na máquina. Primeiro extraia os arquivos zf.bat e zf.php (no caso de utilizar Windows) que estão localizados dentro da pasta bin para onde o PHP está instalado no seu computador, que, como estamos utilizando o Xampp, o caminho de instalação do PHP é C:\xampp\php.

Agora é necessário configurar a variável de ambiente do Windows para a pasta do PHP, bastando acessar as propriedades do Computador.

Nas propriedades, deve-se clicar em “configurações avançadas do sistema” e depois no botão “variáveis de ambientes”, como mostra a Figura 2.

Painel de
propriedades do sistema

Figura 2. Painel de propriedades do sistema

Na janela das variáveis de ambientes, acesse a variável path. Ao fim de toda a linha do seu valor, devemos adicionar um ponto e virgula e o caminho para o PHP da sua máquina (c:/xampp/php), conforme mostram as Figura 3 e 4.

Painel das
variáveis de ambientes

Figura 3. Painel das variáveis de ambientes

Configuração da
variável de ambiente path

Figura 4. Configuração da variável de ambiente path.

Devemos copiar a pasta library do download do Zend Framework para o nosso computador. É recomendável que esta fique dentro do próprio servidor, dentro da pasta apps.

Por fim, vamos adicionar no include_path do arquivo php.ini o caminho para a biblioteca do Zend Framework. Para isto, basta acessar a pasta c:/xampp/php e procurar o arquivo php.ini; vá até a linha com o comando include_path e adicione o caminho da pasta library que foi copiado para a pasta apps (como mostra o código a seguir), como mostra a Figura 5:

include_path = ".;C:\xampp\php\PEAR;C:\xampp\apps\library"

Caminho do
include_path onde deve adicionar a library do zend

Figura 5. Caminho do include_path onde deve adicionar a library do zend

Após todos os passos de configuração, abra o cmd e adicione o código a seguir para verificar se a configuração do Zend foi realizada com sucesso:

Zf show version

Caso não tenha a saída esperada, volte ao primeiro passo e realize novamente todo o processo.

Caso ocorra tudo conforme o esperado, neste momento devemos iniciar o projeto . Para isto, com o cmd ainda aberto, acesse até a pasta htdocs do Xampp e crie um novo projeto através do Zend tools usando o seguinte código:

  c:\>cd c:/xampp/htdocs
  c:\xampp\htdocs>zf create project projdevmedia

Agora abra o Netbeans e crie um projeto apontando para a pasta prodevmedia dentro do Xampp. Neste momento, para testar se está tudo funcionando corretamente, primeiro inicie o servidor PHP abrindo o navegador e digitando http://localhost/projdevmedia/public. Se o resultado for o mesmo da Figura 6, o projeto foi criado corretamente, mas caso ocorra erro 500, verifique se a diretiva do Apache mod_rewrite.mo está ativada.

Página inicial do
projeto com Zend framework 1

Figura 6. Página inicial do projeto com Zend framework 1

Teremos a estrutura conforme a Figura 7, onde é importante ressaltar as pastas principais do projeto, tais como:

  • Application à Pasta onde o projeto será totalmente construído;
  • Docs à Pasta para adicionar qualquer tipo de documentação para o projeto;
  • Library à Pasta para adicionar bibliotecas de terceiros ou ate mesmo as libs do Zend;
  • Public à Pasta pública da aplicação, onde todas as imagens, os arquivos .css, os JavaScripts serão adicionados;
  • Tests à Pasta para a criação de testes unitários com phpUnit.

Estrutura de
pastas de um projeto com Zend Framework 1

Figura 7. Estrutura de pastas de um projeto com Zend Framework 1

Para entender bem as relações das pastas é necessário conhecer um pouco do Padrão MVC. Toda URL que é adiciona no browser deve chamar uma estrutura específica de arquivos, controllers e views, por exemplo, quando adicionamos a URL localhost/projdevmedia/public, o ZF1 entende que deve chamar o controller IndexController.php. O método indexAction() deste controle é para exibir a saída da página e o ZF1 chama o arquivo views/scripts/índex/índex.phtml.

Logo, para as URLs a seguir, teremos as seguintes páginas sendo executadas:

  localhost/projdevmedia/public/Aluno
  controller: AlunoController.php
  action: indexAction()
  view: aluno/index.phtml
   
  localhost/projdevmedia/public/Funcionario/cadastrar
  controller: FuncionarioController.php
  action: cadastrarAction()
  view: funcionario/cadastrar.phtml
   
  localhost/projdevmedia/public/Produto/buscar/nome/Ana
  controller: ProdutoController.php
  action: buscarAction()
  view: produto/buscar.phtml

Neste caso, também é enviado um parâmetro nome com o valor Ana para o controller.

Agora vamos iniciar a construção do projeto abrindo o arquivo index/index.phtml. Vamos criar dois links, de acordo com a Listagem 1, para abrir as telas de cadastro e busca do projeto.

Listagem 1. Links da index.phtml para chamar as páginas do projeto

  <h3>Projeto de Cadastro para Produtos</h3>
   
  <a href="<?php echo $this->url(array('controller' => 'Produto')); ?>">
  Cadastrar Novo Produto</a>
   
  <br><br>
   
  <a href="<?php echo $this->url(array('controller' => 'Produto', 
      'action' => 'buscar')); ?>">
  Buscar Produtos</a>

Repare na utilização do comando $this->url(), pois este comando utilizado para o Zend criar uma URL baseado no controller e na action que deverão ser chamadas. Para isto, basta adicionar um array com os valores correspondentes. Após criar esta página execute novamente a URL inicial e veja que a saída HTML já mudou, conforme a Figura 8.

Página inicial do
projeto

Figura 8. Página inicial do projeto

Se clicar em qualquer um dos links, deverá dar um erro 404 de página não encontrada.

Por padrão, quando ocorrem os erros no Zend Framework 1, não são exibidos por completos, sendo muito comum imprimir apenas um título para o erro. Isto ocorre porque ele assume que estamos em ambiente de produção. Para observar um erro completo conforme a Figura 9, basta abrir o arquivo config/application.ini e modificar as diretivas dos erros de 0 para 1, como na Listagem 2.

Mensagem do erro
completa com o trace

Figura 9. Mensagem do erro completa com o trace.

Listagem 2. Arquivo application.ini com as configurações de erros permitindo a exibição na tela.

  [production]
  phpSettings.display_startup_errors = 1
  phpSettings.display_errors = 1
  includePaths.library = APPLICATION_PATH "/../library"
  bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  bootstrap.class = "Bootstrap"
  appnamespace = "Application"
  resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  resources.frontController.params.displayExceptions = 1
   
  [staging : production]
   
  [testing : production]
  phpSettings.display_startup_errors = 1
  phpSettings.display_errors = 1
   
  [development : production]
  phpSettings.display_startup_errors = 1
  phpSettings.display_errors = 1
  resources.frontController.params.displayExceptions = 1

Para solucionar este problema, é necessário criar um controller ProdutoController.php e duas views: produto/index.phtml e produto/buscar.phtml. Porém, se estamos utilizando o Zend tools em nosso projeto, podemos criar através dele e a própria ferramenta se encarrega de criar toda a estrutura básica para estes arquivos. Para isto, abra o cmd novamente e acesse a pasta projdevmedia e dentro dela adicione os códigos da Listagem 3, conforme mostra a Figura 10.

Listagem 3. Código para a criação dos controllers e das actions para o projeto

  c:\>cd c:/xampp/htdocs/projdevmedia
  c:\xampp\htdocs\projdevmedia>zf create controller Produto
  c:\xampp\htdocs\projdevmedia>zf create action buscar Produto

Código para a
criação dos controllers e das actions pelo Zend Tools

Figura 10. Código para a criação dos controllers e das actions pelo Zend Tools.

Depois de adicionar estes códigos, repare que agora o projeto conta com um novo arquivo na pasta controller, uma nova pasta dentro de views/scripts e dois novos arquivos nesta, como na Figura 11.

Novos arquivos
criados pelo Zend Tools

Figura 11. Novos arquivos criados pelo Zend Tools

Neste momento, abra o arquivo index.phtml que foi adiciona na pasta views/scripts/produto e vamos criar um novo formulário de cadastro dos produtos, conforme ilustrado na Listagem 4.

Listagem 4. Código de criação do formulário de cadastro de produtos.

  <h3>Formulário de Cadastro dos Produtos</h3>
  <a href="<?php echo $this->url(array('controller' => 'Index', 
      'action' => 'index')); ?>">Voltar</a>
  <hr>
   
  <form method="post">
      Informe o nome do produto..: 
      <br>
      <input type="text" name="nome" value="">
      <br><br>
      Informe o estoque do produto..: 
      <br>
      <input type="number" name="estoque" value="0">
      <br><br>
      Informe o preço do produto..: 
      <br>
      <input type="text" name="preco" value="">
      <br><br>
      <input type="submit" value="Novo Produto">
  </form>

A tag form não possui action, com isto, ao clicar no botão submit, a mesma URL será chamada, porém ela receberá um envio de dados via POST. Para todas as URLs, o ZF1 deve chamar uma action, logo, é dentro desta action que iremos receber os dados do formulário e realizar todo o processo de gravação.

Então vamos até o arquivo ProdutoController.php e dentro do método indexAction() devemos resgatar os dados provenientes do formulário e neste mesmo método vamos retornar as mensagens para as views. Veja na Listagem 5 como realizar a operação.

Listagem 5. Receber os dados do formulário pelo action.

  <?php
   
  class ProdutoController extends Zend_Controller_Action
  {
      public function init()
      {
      }
      public function indexAction()
      {
          if($this->getRequest()->isPost())
          {
              $nome = $this->getRequest()->getParam("nome", "");
              $estoque = $this->getRequest()->getParam("estoque", "");
              $preco = $this->getRequest()->getParam("preco", "");
              
              $this->view->resp = "Produto,  " . $nome. ", enviado com sucesso!";
          }
      }
      public function buscarAction()
      {
      }
  }

No método indexAction() foi feita a verificação se existe uma requisição POST: caso a mesma exista, resgatamos os dados do formulário pelo name dos campos e o comando $this->view é utilizado para criar uma variável nas visões com mensagens das actions. Logo, temos uma variável $this->resp que pode ser utilizada no arquivo produto/index.phtml, conforme o código a seguir:

<?php echo $this->resp; ?>

Crie um arquivo script.sql e dentro da pasta docs vamos criar o banco de dados, como na Listagem 6, onde os dados dos produtos deverão ser gravados. Utilize o banco de dados MySQL que desejar.

Listagem 6. Criação do script para gerar o banco de dados.

  drop database if exists devmedia;
   
  create database devmedia;
   
  use devmedia;
   
  create table produto(
      id int auto_increment primary key,
      nome varchar(40) not null,
      estoque int not null,
      preco decimal not null);
   
  desc produto;

Com o banco criado, vamos configurar o acesso a ele pelo ZF1 e realizar as operações de gravação e listagem dos dados conforme necessários no projeto. Existem diversas maneiras para fazer esta operação, mas vamos utilizar a classe Zend_Db_Table_Abstract para isto, considero bem simples de ser utilizada. Para configurar os parâmetros de acesso ao banco de dados, abra o arquivo application.ini que está dentro da pasta config e nele adicione o código da conforme a Listagem 7.

Listagem 7. Configuração do banco de dados pelo application.ini

  [production]
  phpSettings.display_startup_errors = 1
  phpSettings.display_errors = 1
  includePaths.library = APPLICATION_PATH "/../library"
  bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  bootstrap.class = "Bootstrap"
  appnamespace = "Application"
  resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  resources.frontController.params.displayExceptions = 1
   
  resources.db.adapter = PDO_MYSQL
  resources.db.params.host = localhost
  resources.db.params.username = root
  resources.db.params.password = 
  resources.db.params.dbname = devmedia
   
  [staging : production]
   
  [testing : production]
  phpSettings.display_startup_errors = 1
  phpSettings.display_errors = 1
   
  [development : production]
  phpSettings.display_startup_errors = 1
  phpSettings.display_errors = 1
  resources.frontController.params.displayExceptions = 1

Os comandos de resources.db o Zend são utilizados para a configuração do banco de dados da nossa aplicação. Além disso, deve-se criar um arquivo dentro da pasta models e nele montar as operações de insert e select para a tabela Produto. Novamente, abra o cmd e crie o arquivo em Models através do Zend Tools usando o código a seguir e não se esqueça de verificar se o CMD está dentro da pasta do seu projeto.

c:\xampp\htdocs\projdevmedia>zf create model Produtos

Com este comando, o Zend Tools cria um arquivo Produtos.php dentro da pasta model. A classe dentro dele chama-se Application_Model_Produtos e este nome é para que o autoloader do Zend Framework possa encontrar o caminho referente as pastas até o arquivo físico. Seguindo com o projeto, dentro do arquivo Produtos.php deve-se adicionar todas as operações referentes ao banco de dados.

Para que os comandos de banco de dados funcionem, vamos herdar a classe Zend_Db_Table_Abstract e sobrescrever um atributo desta classe que define qual o nome da tabela que será referenciada pelo arquivo. Neste caso, o atributo é $_name, conforme vemos na Listagem 8.

Listagem 8. Arquivo Produtos.php com os métodos para gravar e listar os produtos do banco de dados.

  <?php
  class Application_Model_Produtos extends Zend_Db_Table_Abstract
  {
      protected $_name = "produto";
      public function gravar($data)
      {
          return $this->insert($data);
      }
       public function listar()
      {
          $select = $this->select()
                      ->order("nome asc");
          return $this->fetchAll($select)->toArray();
      }
  }

Após adicionar o atributo $_name com o nome da tabela, basta chamar os métodos insert e select que o Zend Framework já referencia a tabela definida no início do arquivo. Com os métodos criados, voltamos para o método indexAction() onde deve-se chamar o método gravar criado na classe Produto, como na Listagem 9. Após a inclusão, veja na Figura 12 o resultado da página finalizada.

Listagem 9. Método indexAction() finalizado gravando os dados no banco.

  public function indexAction()
      {
          if($this->getRequest()->isPost())
          {
              $nome = $this->getRequest()->getParam("nome", "");
              $estoque = $this->getRequest()->getParam("estoque", "");
              $preco = $this->getRequest()->getParam("preco", "");
              
              $data = array(
                  'nome' => $nome,
                  'estoque' => $estoque,
                  'preco' => $preco
              );
              
              $produtos = new Application_Model_Produtos();
              if($produtos->gravar($data))
                  $this->view->resp = "Produto,  " . $nome. ", enviado com sucesso!";
              else
                  $this->view->resp = "Produto,  " . $nome. ", nao gravado!";
          }
      }

Página após
inserir o produto no banco de dados

Figura 12. Página após inserir o produto no banco de dados

Conforme a Listagem 9, pode observar que o array $data que foi criado possui uma referencia entre o nome do campos da tabela produto e o valor que será gravado neste campo, logo no comando “nome” => $nome, define que o campo nome da tabela vai receber o valor da variável $nome.

Por fim, abra o arquivo ProdutoController.php e vá até o método buscarAction() onde será adicionado o código para buscar os dados do banco e fazer a listagem dos produtos. Veja na Listagem 10 como este método deve ser criado.

Listagem 10. Método para listar os produtos do banco de dados.

  public function buscarAction()
      {
          $produtos = new Application_Model_Produtos();
          $lista = $produtos->listar();
          $this->view->listaProdutos = $lista;
      }

Vimos que basta chamar o método listar() da classe Produtos e retornar o seu resultado para uma variável enviada para a view. Depois deste processo, devemos ir no arquivo produto/buscar.phtml e listar os dados da variável $this->listaProduto dentro de uma tabela, conforme a Listagem 11, ou da maneira desejada pelo cliente.

Listagem 11. Código para listar todos os produtos do banco de dados.

  <meta charset="utf-8">
  <h3>Lista dos Produtos</h3>
  <a href="<?php echo $this->url(array('controller' => 'Index', 
      'action' => 'index')); ?>">Voltar</a>
  <hr>
   
  <?php if(count($this->listaProdutos)){ ?>
  <table style="width: 100%">
      <tr>
          <th>NOME</th>
          <th>ESTOQUE</th>
          <th>PREÇO</th>
      </tr>
      <?php foreach($this->listaProdutos as $prod){ ?>
      <tr>
          <td><?php echo $prod["nome"]; ?></td>
          <td><?php echo $prod["estoque"]; ?></td>
          <td><?php echo $prod["preco"]; ?></td>
      </tr>
      <?php } ?>
  </table>
  <?php } ?>

Veja que basta iterar o conteúdo da variável $this->listaProdutos dentro da tabela e vemos a listagem com todos os produtos cadastrados no banco de dados conforme a Figura 13.

Tela de buscar os
produtos, com a lista do banco de dados

Figura 13. Tela de buscar os produtos, com a lista do banco de dados.

Com isto finalizamos nosso artigo sobre criação de um projeto utilizando Zend Framework 1 e a configuração do Zend Tools. Espero que possa ter ajudado a todos, obrigado e bons estudos.