Fontes dos tutoriais

Olá pessoal,

estou recebendo muitos emails pedindo os fontes dos exemplos que posto aqui no blog. Para atender a todo mundo, achei legal publicar os fontes no repositório que uso para versionar minha biblioteca Tavs. Por falta de tempo, não consegui ainda publicar todos os fontes lá, mas quem se interessar pelo tutorial do flexigrid (mais procurado! :) ), pode fazer o checkout do projeto ou fazer o download dos arquivos.

Com o tempo vou publicando os outros arquivos para download, ok?

Abraços!

No Comments

Cabeçalho sob demanda (JS e CSS)

Para tentar otimizar o carregamento das páginas, procuro carregar somente o necessário para a correta exibição e funcionamento da mesma. Para isso, os arquivos para estilização (CSS) e os arquivos para interação com o usuário (JS) devem ser carregados somente quando necessários, ou seja, por demanda. Muitas pessoas colocam todas as funções JS em um único arquivo, fazendo com que o carregamento fique um pouco mais demorado se fosse carregado somente o necessário para aquela página. O mesmo problema acontece com os arquivos CSS quem possuem toda a estilização do site em um único arquivo.

Com base nisso criei um plugin para o ZF que faz o carregamento dos arquivos sob demanda. Este plugin nada mais faz do que carregar os arquivos do módulo, controller, action (nesta ordem) no cabeçalho da página.

Para o correto funcionamento do plugin, é preciso que uma estrutura de pastas seja respeitada:

head-sob-demanda

  • [moduleName] – Nome do modulo corrente;
  • [scriptPathName] – Nome da pasta de scripts JS. Por padrão, é adotado o nome ’scripts’;
  • [controllerName] – Nome do controller corrente;
  • [actionName] – Nome do action corrente;
  • [scriptControllerName] – nome do script JS que será chamado a nível de controller. Por padrão, é adotado ‘controller’;
  • [stylePathName] – Nome da pasta de estilos CSS. Por padrão, é adotado o nome ’styles’;
  • [styleControllerName] – nome do estilo CSS que será chamado a nível de controller. Por padrão, é adotado ‘controller’;

O plugin irá tentar incluir todos estes arquivos no head somente se o arquivo existir.

O plugin deve ser registrado pelo objeto Zend_Controller_Front e o objeto de visualização (Zend_View_Interface) já deve estar previamente configurado para o correto funcionamento. O namespace Tavs_View_Helper deve ser adicionado através do método Zend_View::addHelperPath() para que o plugin acesse o helper Tavs_View_Helper_BaseUrl, responsável por incluir o baseUrl ao início do nome do arquivo.

Outra funcionalidade deste plugin é adicionar ao cabeçalho, códigos JS úteis para o javascript. Como o próprio baseUrl, ID da sessão e outros paths do sistema que só podem ser definidos pelo PHP.

O plugin Tavs_Controller_Plugin_View pode ser baixado juntamente com a minha biblioteca de códigos Tavs em http://tavslibary.googlecode.com/svn/trunk.

, , , , ,

3 Comments

Bootstrapping Zend Framework 1.8

A nova versão do Zend Framework (1.8) permite fazer as configurações principais da aplicação de uma maneira diferente das outras versões. Até a versão 1.7 não existia um padrão de bootstrapping e cada um fazia do jeito que achar melhor. Acredito que para incentivar os desenvolvedores a seguir um padrão de bootstrapping, a Zend criou classes de inicialização – bem práticas, por sinal – que auxiliam nas configurações necessárias do projeto.

Neste post mostrarei como é feito as principais configurações (View, Modulos, IncludePath e etc…) utilizando a nova versão do poderoso Zend Framework 1.8. Para isso, criarei um novo projeto no eclipse chamado Tests no localhost.

Read the rest of this entry »

, ,

12 Comments

Paginação com Zend Framework

Mostrarei neste post como é simples fazer uma paginação usando o poderoso Zend Framework. O componente Zend_Paginator possibilita ao programador configurar uma série de opções afim de tornar a paginação mais intuitiva.

Atualmente o Zend_Paginator no permite paginar quatro tipos de model:

  • Array
  • DbSelect
  • DbTableSelect
  • Iterator

Para este exemplo farei a paginação usando o DbSelect, que acredito ser o mais utilizado por retornar registros do banco de dados.

Read the rest of this entry »

, ,

3 Comments

Zend Framework + Upload+ ProgressBar

Neste post irei mostrar como fazer uma barra de progresso nos formulário que possuem upload. A teoria da operação é a seguinte: Utilizaremos dois actions “processAction” e “progressAction”. O 1° irá fazer o processamento do formulário (nada fora do normal até aqui :) . Mas a mágica acontece no action “progressAction” que envia para o browser como está o progresso do upload. Quando envia o formulário, um javascript faz requisições para “progressAction” via ajax e este retorna as informações necessárias para fazer a barra de progresso funcionar.
Para este tutorial, é necessário a extensão uploadprogress. Esta extensão que permite ao php recuperar o status do envio. Segue o link para o download da extensão:

Read the rest of this entry »

, , , , , ,

2 Comments

1° Encontro do PHP MG

Acontecerá neste fim de semana próximo o 1° encontro do grupo de desenvolvedores mineiros.  O 1º Encontro do PHP MG será realizado no dia 25/04/2009 na Uni-BH, campus Estoril, auditório B5, em Belo Horizonte. É um evento focado no mercado de desenvolvimento web, proporcionando aos participantes o contato interpessoal e o conhecimento das melhores práticas e últimas novidades e tendências, no que se diz respeito à tecnologia.

Mais informações à respeito do evento pode ser encontradas no site oficial do grupo.

,

1 Comment

Zend Framework + jQuery Flexigrid

Como muitos plugins escritos em javascript para o jQuery, o Flexigrid é mais uma opção para os desenvolvedores que procuraram agilidade e qualidade em seus sistemas. Este plugin é capaz de transformar uma simples tabela (isso, aquela mesma…<table></table>) em uma fantástica grade de exibição de dados. Nela é possível acrescentar botões que executam rotinas em javascript, ordenar as colunas, esconder colunas, paginar os registros e outras coisas legais. Após alguns testes com este plugin, surgiu a idéia de integrá-lo com o ZF. Criei as classes para controlar as configurações do Flexigrid e um helper que renderiza as configurações no cabeçalho da página. Procurei tornar as configurações mais genéricas possíveis. Havendo algum problema, entre em contato para tentar-mos solucioná-lo.

Para tentar exemplificar, irei fazer um passo-a-passo da integração. Estou assumindo que seu projeto já esteja funcionando corretamente, ou seja, MVC configurado corretamente e etc.

A primeira coisa a se fazer é adicionar o componente no mesmo nível onde está o ZF:

/library

/library/Tavs

/library/Zend

Feito isso, seu projeto já terá acesso ao componente Flexigrid. Obs: Tomei o cuidado de escrever as classes mantendo o padrão adotado pelo ZF, onde cada “/” é representada por “_” no nome da classe.

Com o componente incluído, já podemos escrever no controller os métodos que farão configuração do Flexigrid.

IndexController.php


<?php

class IndexController extends Zend_Controller_Action
{
/**
* Retorna a instancia do flexigrid
*
* @return Tavs_jQuery_Flexigrid
*/
private function _getFlexigrid()
{
$front = $this-&gt;getFrontController();
$flexigrid = new Tavs_jQuery_Flexigrid($front-&gt;getBaseUrl() . '/index/list');

$flexigrid
-&gt;setTitle('Clientes')
-&gt;orderBy(
$this-&gt;_getParam('sortname', 'cliente_nome'),
$this-&gt;_getParam('sortorder', Tavs_jQuery_Flexigrid::SORT_ASC)
);

$flexigrid
-&gt;addColumn('text', 'cliente_nome', array(
'label' =&gt; 'Nome'
))
-&gt;addColumn('text', 'cliente_email', array(
'label' =&gt; 'Email'
))
-&gt;addColumn('date', 'cliente_nascimento', array(
'label' =&gt; 'Data de Nascimento',
'align' =&gt; Tavs_JQuery_Flexigrid_Column_Abstract::ALIGN_CENTER
))
-&gt;addColumn('checkbox', 'cliente_ativo', array(
'label' =&gt; 'Ativo?',
'align' =&gt; Tavs_JQuery_Flexigrid_Column_Abstract::ALIGN_CENTER
));

//seletor e atributos da tabela
$flexigrid
-&gt;setSelector('#grid-clientes')
-&gt;addTableAttrib('id', 'grid-clientes');

//paginacao
$flexigrid-&gt;configPaginator($this-&gt;_getParam('rp', 20), $this-&gt;_getParam('page', 1));

return $flexigrid;

}

/**
* Recupera e a manda para a view a instancia do Flexigrid
*/
public function indexAction()
{
$this-&gt;view-&gt;flexigrid = $this-&gt;_getFlexigrid();
}

/**
* Faz a busca no banco de dados para listar no flexigrid.
*
*/
public function listAction()
{

Zend_Layout::getMvcInstance()-&gt;disableLayout();
$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender(true);

//cria o objeto para montar da query
$db = Zend_Db_Table::getDefaultAdapter();
$select = $db-&gt;select();

//monta o select
$select-&gt;from(array('C'=&gt;'cliente'), array('cliente_id', 'cliente_nome', 'cliente_email', 'cliente_nascimento', 'cliente_ativo'));

$field_search = $this-&gt;_getParam('qtype');
$field_search_value = $this-&gt;_getParam('query');

if ( !empty($field_search) &amp;&amp; !empty($field_search_value) )
{
$select-&gt;where($field_search . ' LIKE ?', '%' . $field_search_value . '%');
}

$flexigrid = $this-&gt;_getFlexigrid();

echo $flexigrid-&gt;generateRows($select, 'cliente_id');

}

}

É importante lembrar que a inclusão de colunas no flexigrid é obrigatória. O parâmetro do construtor é a URL que o flexigrid irá chamar para popular o grid com o dados. Lembrando que essa requisição é feita com AJAX. :)

A principal característica deste componente é a personalização das colunas. No exemplo acima temos 4 colunas: duas com texto normal, uma para exibição de data e outra para checkbox. Atualmente, o componente suporta colunas para:

1. Checkbox
2. Date
3. Link
4. Select
5. Text

Para criar uma coluna personalizada por você, é necessário extender a classe Tavs_JQuery_Flexigrid_Column_Abstract e implementar o método render(). Ainda não tive tempo para documentar a utilização do componente, mas é só fazer uma boa leitura no código que fica trivial.

O método listAction monta a consulta para executar no banco de dados. Depois de criado o objeto $select, este é passado como parametro para o método $flexigrid->generateRows onde será configurada a paginação e trazer somente os registros necessários para a página em questão.

Depois de configurado o flexigrid, ecoamos a instância que foi enviada para a view:

index.phtml


<?php echo $this->flexigrid ?>

Está quase pronto! Agora falta incluirmos os arquivos jquery.js, flexigrid.js e flexigrid.css. Normalmente se faz essas inclusões no layout “master” da aplicação, no meu caso:

main.phtml


<?php

$base = Zend_Controller_Front::getInstance()->getBaseUrl();

$this
->headScript()
->appendFile( $base . '/scripts/jquery-1.2.6.min.js' )
->appendFile( $base . '/scripts/flexigrid.js' );

$this
->headLink()
->appendStylesheet( $base . '/styles/flexigrid.css' );

echo $this->doctype()
?>
<html>

<head>
<meta http-equiv="Content-Type"; content="text/html; charset=UTF-8" />
<?php
echo $this->headScript();
echo $this->headLink();
echo $this->JQuery();
?>
</head>

<body>
<?php echo $this->layout()->content ?>
</body>

</html>

Arquivos utilizados para o tutorial:

* Biblioteca jQuery
* Flexigrid
* Tavs Library baseado em ZF (Classes PHP).

Script de banco de dados usado no tutorial:

CREATE TABLE `cliente` (
`cliente_id` int(11) NOT NULL,
`cliente_nome` varchar(50) NOT NULL,
`cliente_email` varchar(50) NOT NULL,
`cliente_nascimento` datetime NOT NULL,
`cliente_ativo` int(11) NOT NULL default ‘1′,
PRIMARY KEY (`cliente_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


– Extraindo dados da tabela `cliente`

INSERT INTO `cliente` VALUES(1, ‘Tales’, ‘tales@gmail.com’, ‘2009-03-29 22:15:00′, 0);
INSERT INTO `cliente` VALUES(2, ‘Tales’, ‘tales@hotmail.com’, ‘2009-03-27 22:15:11′, 1);

Qualquer contribuição é sempre bem vinda. Correção de bugs ou coisas do gênero pode ser informado através do email contato@talesaugusto.com.br

É isso aí pessoal, espero que ter conseguido passar alguma informação útil a vocês.

Abraços.

:)

, , , ,

16 Comments

Automatização de tabindex com Zend_Form

Olá pessoal.

Para este primeiro post no blog, mostrarei um simples exemplo de como adicionar uma funcionalidade trivial no componente Zend_Form do ZF.

Basicamente, o que fiz é extender a classe Zend_Form e sobrepor o método addElement. Este método adiciona um novo elemento ao Zend_Form e seta o atributo tabindex se este não estiver setado anteriormente.


class MyForm extends Zend_Form {

private $_elementTabindex = 1;

public function addElement($element, $name = null, $options = null) {

parent::addElement($element, $name, $options);

if (null !== $name) {
$element = $this->getElement($name);
}

if (!isset($element->tabindex)) {
$element->tabindex = $this->_elementTabindex++;
}

return $element;

}

}

Este foi post, na verdade, foi para me familiarizar com a ferramenta Worpress. Estou preparando materiais para outros posts mais “robustos”. Pretendo escrever algo sobre ZF e jQuery.

Aguardem!

:)

,

3 Comments