Arquivo da Categoria 'Zend'

18 JanDica – PHP 5.3, Apache 2, Postgres e Zend Framework no Windows Seven

Estou com a versão de testes do Windows Seven (Home Premium), instalada em minha máquina. O sistema está tão rápido e estavel quanto o XP era. A única diferença é que ele é muito mais bonito e usual. Enquanto não me sobra grana para comprar um Mac, ficarei com esse mesmo ^^

Precisei configurar meu ambiente de desenvolvimento nessa versão do windows e estou postando aqui só para dizer que tudo funciona corretamente. Na verdade, eu só tive problemas de compatibilidades com programas simples e que não me faziam falta. Muito estranho, haha. Enfim, só para constar:

Windows Seven – Home Premium

  1. Zend Server CE (php 5.3, Apache 2.2, Zend Framework 1.9)
  2. Postgres 8.x
  3. Netbeans 6.8

A única coisa chata é que o Zend Server, por padrão, instala no arquivos de programas e essa pasta precisa de permissão para poder alterar os arquivos. Mas a única coisa que precisa fazer é clicar com o direito nela, selecionar a aba de segurança e adicionar controle total para o seu usuário. Ou, se você for mais organizado, altere as configurações do Apache para apontar o DocumentRoot para outro local.

Esse pequeno post é só para informar,

22 DecEstatísticas de acesso do blog (1 ano)

Dia 08 de Dezembro de 2009 fez exatamente 1 ano que eu estou usando o Google Analytics. Então, nada mais justo que publicar para vocês algumas estatísticas do blog.  Acho que o Zend Framework ainda não é tão popular assim, quem sabe em 2010 mudamos isso ^^

Período: 08/12/2008 até 08/12/2009

Vísitantes: 9,426

Pageviews: 18,146

Média de tempo no site: 00:03:04

Páginas mais acessadas (Top 5):

1. http://www.nivaldoarruda.com.br/ (Total: 2,406)

2. http://www.nivaldoarruda.com.br/category/zend/ (Total: 1,121)

3. http://www.nivaldoarruda.com.br/2008/10/29/integrando-o-zend-framework-com-o-dojo-parte-ii/ (Total: 976)

4. http://www.nivaldoarruda.com.br/2009/02/19/testes-automatizados-com-zend-framework-parte-1/ (Total: 862)

5. http://www.nivaldoarruda.com.br/2009/02/03/testando-a-integracao-do-jquery-com-o-zend-framework/ (Total: 853)

Navegador x O.S (Top 5)

1. Firefox / Windows (Total: 5,450)
2. Internet Explorer / Windows (Total: 1,563)
3. Firefox / Linux (Total: 1,225)
4. Chrome / Windows (Total: 621)
5. Firefox / Macintosh (Total: 253)

Origem das visitas

  • Sites de Busca 7,110.00 (75.43%)
  • Acesso direto 1,431.00 (15.18%)
  • Sites referenciando 885.00 (9.39%)

Palavras chaves mais procuradas (A pedido do Cocagelada)

Palavra-chave
Visitas
% Visitas
zend_tool
109 1.53%
zend_layout
89 1.25%
zend_server
78 1.10%
zend layout
74 1.04%
zend_jquery
48 0.68%

07 SepZend Framework – Tutorial – Personalizando os decorators

php, zend, hospedagem, ajax, programação, tutorial, curso, apostila, site, criar site, html
Continuando o tutorial sobre decorators, vou abordar agora como personalizar as tags entre os campos. Como todo mundo deve estar cansado de saber, por padrão o ZF cria o formulário HTML dentro das tags DL/DT/DD. As vezes é conveniente para o layout que os campos fiquem entre DIVs e os rótulos entre as tags LABEL.

Nesse tutorial, além de resolver o problema das tags vamos criar uma feature a mais. Todos os campos que forem requeridos (setRequired(true)), irão receber automáticamente um “*” no seu rótulo.



Escrevendo o decorator

<?php
class Decorators_Composite extends Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Marker_File_Interface
{
    public function buildLabel()
    {
        $element = $this->getElement();
        $label = $element->getLabel();
        if ($translator = $element->getTranslator()) {
            $label = $translator->translate($label);
        }

        /* Se o elemento for requerido, será adicionado um "*" após o seu nome */
        if ($element->isRequired()) {
            $label .= '*';
        }
        $label .= ':';
        return $element->getView()
                       ->formLabel($element->getName(), $label);
    }

    public function buildInput()
    {
        $element = $this->getElement();
        $helper  = $element->helper;
        return $element->getView()->$helper(
            $element->getName(),
            $element->getValue(),
            $element->getAttribs(),
            $element->options
        );
    }

    public function buildErrors()
    {
        $element  = $this->getElement();
        $messages = $element->getMessages();
        if (empty($messages)) {
            return '';
        }
        return '
<div class="errors">' .
               $element->getView()->formErrors($messages) . '</div>
';
    }

    public function buildDescription()
    {
        $element = $this->getElement();
        $desc    = $element->getDescription();
        if (empty($desc)) {
            return '';
        }
        return '
<div class="description">' . $desc . '</div>
';
    }

    public function render($content)
    {
        $element = $this->getElement();
        if (!$element instanceof Zend_Form_Element) {
            return $content;
        }
        if (null === $element->getView()) {
            return $content;
        }

        /* Gera todos os códigos */
        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $label     = $this->buildLabel();
        $input     = $this->buildInput();
        $errors    = $this->buildErrors();
        $desc      = $this->buildDescription();

        /* Cria o elemento usando div */
        $output = '
<div class="form element">'
                . $label
                . $input
                . $errors
                . $desc
                . '</div>
';

        switch ($placement) {
            case (self::PREPEND):
                return $output . $separator . $content;
            case (self::APPEND):
            default:
                return $content . $separator . $output;
        }
    }
}
?>

Salve esse arquivo dentro de library/Decorators/Composite.php



Utilizando o decorator personalizado

No form que você desejar, adicione esses 2 blocos de códigos em php:
php, zend, hospedagem, ajax, programação, tutorial, curso, apostila, site, criar site, html




No começo da classe(inclui o decorator):

$this->addElementPrefixPath('Decorators', 'Decorators/', 'decorator');

Esse vai bem no final da classe(Ativa o decorator):

$this->setElementDecorators(array('Composite'));

É isso, aos poucos vamos desvendando por completo os decorators, que tem material até para fazer uma apostila. hehe.

^^

26 AugZend Framework – Criando Action Helpers

Conforme eu havia prometido aqui, hoje eu estarei dando continuidade aos meus tutoriais sobre helpers. O action helper, assim como view helper, serve para melhorar o reaproveitamento de códigos e manter seus controllers o mais limpo possível.

Na empresa aonde trabalho, o primeiro problema que apareceu no uso do ZF foi a criação constante de formulários. Esse processo nos forçava a criar vários “getForms“, muitos deles com o mesmo código. Vamos generalizar esse tipo de código, criar um helper e ser mais feliz!


Configurando

Mais uma vez, estarei levando em consideração que você está utilizando o padrão MVC com plugins do ZF (padrão que o zend studio cria). Já recebi vários emails do tipo “Como configurar o ZendFramework” ou então “Como criar a primeira aplicação com o ZF”. Prometo postar algo sobre isso em breve. Vamos lá:

Adicione a seguinte linha no seu plugin “Initializer.php” (ou em seu bootstrap, caso esteja configurado de outra forma)

Zend_Controller_Action_HelperBroker::addPath($CAMINHO_FISICO . '/library/helpers/', 'Zend_Controller_Action_Helper');

Tenha em mente que a váriavel $CAMINHO_FISICO deve conter o caminho da sua aplicação no servidor.

Com essa linha configurada corretamente o ZF já vai conseguir “enxergar” o seu helper.


Criando o Action Helper

<?php
/**
* Cria o objeto do form indicado.
* @author Nivaldo Arruda - nivaldo@gmail.com
* @version 1.0
*/

class Zend_Controller_Action_Helper_Formulario extends Zend_Controller_Action_Helper_Abstract
{

/**
* instancia o formulario.
* Exemplo para o parametro: $opcoes
* $opcoes['id'] = Para salvar uma edição de dados
* $opcoes['url'] = url da action
*
* @param string $formulario
* @param Array $opcoes
* @return Object
*/
public function criar($formulario, array $opcoes=null)
{
//Caso o seu autoload esteja habilitado, essa linha pode ser comentada
require_once $formulario.'.php';

$id = $opcoes['id'];

/**
* Gera o parametro "id" caso o mesmo seja informado (para URL de editar);
*/
if($id)
$id = "/id/".$id;

/**
* Instancia o formulario informado
*/
$form = new $formulario(array(
'action' => $opcoes['url'].$id,
'method' => 'post',
'id' => $formulario,
), $opcoes);

return $form;
}

}

Perceberam que é uma classe bastante simples não? Mas para um sistema comum, com muitos cadastros, ela é essencial e vai te economizar bastante linhas de códigos =)


Utilizando
Para chamar essa classe é simples. Adicione a seguinte linha no seu controller:

$opcoes['url'] = '/usuarios/salvar';
$form = $this->_helper->Formulario->criar('usuarioForm', $opcoes);

Esse código irá instanciar um objeto do tipo “usuarioForm” dentro da váriavel $form. Só lembre-se que o nome da classe do seu form deve ser “usuarioForm” e o arquivo dela: usuarioForm.php.


Código bem simples, para exemplificar os actions helpers, que serão um grande aliado seu do dia a dia.


^^

11 AugZend Framework – Criando um View helper

O blog está um pouco parado, então irei reanima-lo um pouco. Vou continuar seguindo a linha MVC do ZF e hoje vou abordar um dos principais problemas que essa implementação pode trazer: Views sujas com códigos.

O conceito de MVC nasceu justamente para manter as views (interface com o usuário) completamente separadas dos códigos e das regras de negócio. Com o ZF ela já fica um pouco poluída (para quem estava acostumado com smarty, o primeiro contato é um desespero só). Então programadores, vamos tentar manter essa distinção e vamos fazer mais uso dos “Views helpers”.

O que são os Views Helpers?

Views Helpers são classes que fazem o papel de abstrair os códigos que possivelmente ficarão na view. Seja um foreach para preencher dados de tabela ou de combobox, seja para formatação de nomes/datas ou qualquer outro fim. Fora tirar todo esse código sujo da sua view, você ainda pode reaproveita-las para outras telas.

Criando o Helper

No padrão MVC do zend, existe uma pasta chamado views, dentro de views existe mais 2 pastas (scripts e helpers). Crie seu arquivo dentro da pasta helpers, com o nome do seu helper. Em nosso exemplo: Data.php

Zend Framework - MVC - Diretorios

Zend Framework - MVC - Diretorios

Codificando

<?php
/*
 * Helper que retorna o uma data em vários formatos diferentes.
 * ex: echo $this->Data('2009-18-11')->extenso;
 * ex: echo $this->Data('2009-18-11')->pt_br;
 * ex: echo $this->Data('2009-18-11 09:11:00')->hora;
 * @author Nivaldo Arruda - nivaldo@gmail.com
 * @see www.nivaldoarruda.com.br
 * @version 1.0
*/
class Zend_View_Helper_Data extends Zend_View_Helper_Abstract
{
    public $extenso;
    public $pt_br;
    public $hora;

    public function data($data)
    {
        list($ano, $mes, $dia) = explode("-", substr($data, 0, 10));

        $this->extenso = $this->diasemana("$ano-$mes-$dia");
        $this->pt_br = "$dia/$mes/$ano";

        if(strlen($data)>10){
            list($hora, $minuto, $segundo) = explode(":", substr($data, 11, 8));
            $this->hora = "$hora:$minuto:$segundo";
        }

        return $this;
    }

    /**
     * Retorna o dia da semana, por extenso e em português, correspondente
     * a data informada por parametro (no padrão aaaa-mm-dd).
     *
     * @param Date $data
     * @return String
     */
    public function diasemana($data){
        list($ano, $mes, $dia) = explode("-", $data);

        $diasemana = date("w", mktime(0, 0, 0, $mes, $dia, $ano));

        switch($diasemana) {
            case 0: $diasemana = "Domingo";
                    break;
            case 1: $diasemana = "Segunda-Feira";
                    break;
            case 2: $diasemana = "Terça-Feira";
                    break;
            case 3: $diasemana = "Quarta-Feira";
                    break;
            case 4: $diasemana = "Quinta-Feira";
                    break;
            case 5: $diasemana = "Sexta-Feira";
                    break;
            case 6: $diasemana = "Sábado";
                    break;
        }

        return $diasemana;

    }
}
?>

Entendendo

Perceba a linha da assinatura da classe:

class Zend_View_Helper_Data extends Zend_View_Helper_Abstract

O nome do arquivo “Data” Deve ser igual ao sulfixo do nome da classe (tome sempre cuidado com o case-sensitive).

O nome do método principal, também deve ser igual ao do arquivo, mas esse em caixa-baixa (minusculo):  “data”

public function data($data)

Para rodar esse helper, em uma de suas views, execute o código que está comentado no cabeçalho da classe:

Exemplo de uso

echo $this->Data('2009-18-11')->extenso;
echo $this->Data('2009-18-11')->pt_br;
echo $this->Data('2009-18-11 09:11:00')->hora;

Agora use a imaginação e mantenha suas Views limpas!

Próximo passo: Action Helpers!

^^

01 AugZend Framework 1.9.0

Baixe o seu em: http://framework.zend.com/download/latest

Fora os mais de 700 bugs corrigidos desde a versão 1.8.0, novas funções foram adicionada:

  • Zend_Queue and Zend_Service_Amazon_Sqs, which provide the ability to use local and remote messaging and queue services for offloading asynchronous processes. (Contributed by Justin Plock and Daniel Lo)
  • Zend_Queue_Adapter_PlatformJobQueue, a Zend_Queue adapter for Zend Platform’s Job Queue. (Contributed by Zend Technologies)
  • Zend_Rest_Route, Zend_Rest_Controller, and Zend_Controller_Plugin_PutHandler, which aid in providing RESTful resources via the MVC layer. (Contributed by Luke Crouch, SourceForge)
  • Zend_Feed_Reader, which provides a common API to RSS and Atom feeds, as well as extensions to each format, caching, and a slew of other functionality. (Contributed by Pádraic Brady and Jurrien Stutterheim)
  • Zend_Db_Adapter_Sqlsrv, a Zend_Db adapter for Microsoft’s SQL Server driver for PHP. (Contributed by Juozas Kaziukenas and Rob Allen)
  • Zend_Db_Table updates to allow using Zend_Db_Table as a concrete class by passing it one or more table definitions via the constructor. (Contributed by Ralph Schindler)
  • Zend_Test_PHPUnit_Db, which provides Zend_Db support for PHPUnit’s DBUnit support, allowing developers to do functional and integration testing against databases using data fixtures. (Contributed by Benjamin Eberlei)
  • Annotation processing support for Zend_Pdf, as well as performance improvements. (Contributed by Alexander Veremyev)
  • Zend_Dojo custom build layer support. (Contributed by Matthew Weier O’Phinney)
  • Dojo upgraded to 1.3.2.
  • Numerous Zend_Ldap improvements, including full support for CRUD operations, search, and manipulating tree structures. (Contributed by Stefan Gehrig)
  • Zend_Log_Writer_Syslog, a Zend_Log writer for writing to your system log. (Contributed by Thomas Gelf)
  • Zend_View_Helper_BaseUrl, a view helper for returning the current base URL to your application, as well as for constructing URLs to public resources. (Contributed by Robin Skoglund and Geoffrey Tran)
  • Zend_Date now has support for the DateTime extension. (Contributed by Thomas Weidner)
  • Zend_Locale has been upgraded to CLDR 1.7. (Contributed by Thomas Weidner)
  • Zend_Translate now has plurals support for the Gettext, Csv, and Array adapters. (Contributed by Thomas Weidner)
  • PHP 5.3 compatibility, including support for new features in the mysqli extension. All components are fully tested on both PHP 5.2.4 and above, as well as PHP 5.3.0.

Ainda não tive tempo de testar essa funcionalidades, mas pretendo movimentar mais esse blog em breve.

^^

15 JunDica Rápida: Rotas

Você ja deve ter percebido que o padrão de url que o ZF utiliza para passar parametros não é muito amigavel para o usuário. Mas, como todo bom framework, existe como corrigir isso utilizando rotas.

Adicione as seguintes linhas de códigos para testar as rotas:

Iniciando

$this->_front = Zend_Controller_Front::getInstance();
$router = $this->_front->getRouter();

Esse código deve ser adicionado no plugin de inicialização do seu sistema (ou no bootstrap, para casos que não o utilizem).
Com o objeto $router em mãos, vamos aos exemplos práticos:

1. Rota simples, sem parâmetros

$route = new Zend_Controller_Router_Route('rota/nova', array(
                                                             'module'=>'default',
                                                             'controller' => 'noticias',
                                                             'action'=> 'index')
                                         );
$router->addRoute('default.noticias.index', $route);

para entender melhor esse código, o primeiro parametro é a rota que você vai criar, nesse caso ficaria: http://www.seudominio.com.br/rota/nova os outros parametros são o módulo/controller/action que serão executados. A ultima linha de código é aonde a rota é efetivamente incluida no sistema.

2. Rota simples, com parâmetros

$route = new Zend_Controller_Router_Route('usuario/:user', array(
                                                                 'module'=> 'default',
                                                                 'controller' => 'usuario',
                                                                 'action'=> 'visualizar')
                                         );
$router->addRoute('default.usuario.visualizar', $route);

O funcionamento é exatamente igual a anterior, com exceção que agora o que vier depois de “usuario” será passado como parametro.

3. Rota com expressão regular

$route = new Zend_Controller_Router_Route_Regex('produto/([0-9]+)',array(
                                                                          'module'=> 'default',
                                                                          'controller' => 'produtos',
                                                                          'action' => 'detalhes'),
                                                                   array("id" => 1)
                                                );
$router->addRoute('default.produtos.detalhes', $route);

Já deve ter percebido que aonde voce define a rota, existe uma expressão regular entre parenteses. Ela será o nosso parametro agora (que está contido em “id”) conforme foi atribuido no array seguinte.

Pegando os parâmetros
No controller, utilize:

$this->_getParam("nome_parametro")

Simples e funcional ^^

06 MayDesvendando os Decorators (Zend_form_decorator) – Parte 1

Como sempre tive (e ainda tenho) problemas com os decorators, grande parte dos acessos para esse blog são provenientes de buscas por “decorators” e principalmente por ter recebido uma sugestão direta do XAngel, eu resolvi criar uma série de post em duas partes sobre o assunto.

Nessa primeira parte, irei apenas traduzir a página sobre Decorators do ZF Reference Guide. Ela contém uma boa explicação sobre o seu funcionamento e algumas dicas bem úteis que podem resolver alguns problemas rapidamente.

A segunda parte será um pouco mais interessante, pois irei exemplificar a criação de decorators customizados, que alteram o layout dos forms “automagicamente”.

Sem mais enrolação, vamos para o post.
Ler Mais…

04 MayZend Framework 1.8.0

Só para não passar em branco. No ultimo dia 30 foi lançado  a versão 1.8.0 do Zend Framework. Tem MUITAS alterações e segundo o release mais de 200 bugs corrigidos.

Um detalhe interessante fica para o Zend Tool que recebeu um belo de um update. Agora você pode criar desde a estrutura inicial do seu projeto até os models, views (com ou sem actions) e para os mais empolgados (preciso me aventurar nessa!) existe a possibilidade que seja criado suas próprias tools, para gerar seus próprios códigos. Com certeza vale a pena experimentar!

Opções do Zend Tool

Opções do Zend Tool

Zend Framework 1.8.0 – Release notesdownload

22 MarDica Rápida: Decorators

Aceitando a sugestão do XAngel irei providenciar um artigo bem completo sobre decorators do zend framework. Mas enquanto ele não vem, segue algumas dicas simples e úteis:

Remover todos os decorators do campo:
Na definição do campo no form, adicionar:

->clearDecorators()->addDecorators(array(array('ViewHelper')))

Remover apenas os erros do form:
Na definição do campo no form, adicionar:

->removeDecorator('errors');

Remover apenas os labels:
Na definição do campo no form, adicionar:

->removeDecorator('labels');

Substituir o “dd” por “div”
Na definição do campo no form, adicionar:

->addDecorator('HtmlTag', array('tag' => 'div'));

^^

SEO Powered by Platinum SEO from Techblissonline