Posts Tagged PHP
Cabeçalho sob demanda (JS e CSS)
Posted by Tales in CSS, Javascript, PHP, Zend Framework on August 10th, 2009
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:

- [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.
Bootstrapping Zend Framework 1.8
Posted by Tales in PHP, Zend Framework on May 22nd, 2009
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.
Paginação com Zend Framework
Posted by Tales in PHP, Zend Framework on May 9th, 2009
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.
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.
Zend Framework + jQuery Flexigrid
Posted by Tales in Javascript, PHP, Zend Framework, jQuery on March 29th, 2009
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->getFrontController();
$flexigrid = new Tavs_jQuery_Flexigrid($front->getBaseUrl() . '/index/list');
$flexigrid
->setTitle('Clientes')
->orderBy(
$this->_getParam('sortname', 'cliente_nome'),
$this->_getParam('sortorder', Tavs_jQuery_Flexigrid::SORT_ASC)
);
$flexigrid
->addColumn('text', 'cliente_nome', array(
'label' => 'Nome'
))
->addColumn('text', 'cliente_email', array(
'label' => 'Email'
))
->addColumn('date', 'cliente_nascimento', array(
'label' => 'Data de Nascimento',
'align' => Tavs_JQuery_Flexigrid_Column_Abstract::ALIGN_CENTER
))
->addColumn('checkbox', 'cliente_ativo', array(
'label' => 'Ativo?',
'align' => Tavs_JQuery_Flexigrid_Column_Abstract::ALIGN_CENTER
));
//seletor e atributos da tabela
$flexigrid
->setSelector('#grid-clientes')
->addTableAttrib('id', 'grid-clientes');
//paginacao
$flexigrid->configPaginator($this->_getParam('rp', 20), $this->_getParam('page', 1));
return $flexigrid;
}
/**
* Recupera e a manda para a view a instancia do Flexigrid
*/
public function indexAction()
{
$this->view->flexigrid = $this->_getFlexigrid();
}
/**
* Faz a busca no banco de dados para listar no flexigrid.
*
*/
public function listAction()
{
Zend_Layout::getMvcInstance()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
//cria o objeto para montar da query
$db = Zend_Db_Table::getDefaultAdapter();
$select = $db->select();
//monta o select
$select->from(array('C'=>'cliente'), array('cliente_id', 'cliente_nome', 'cliente_email', 'cliente_nascimento', 'cliente_ativo'));
$field_search = $this->_getParam('qtype');
$field_search_value = $this->_getParam('query');
if ( !empty($field_search) && !empty($field_search_value) )
{
$select->where($field_search . ' LIKE ?', '%' . $field_search_value . '%');
}
$flexigrid = $this->_getFlexigrid();
echo $flexigrid->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.
Automatização de tabindex com Zend_Form
Posted by Tales in PHP, Zend Framework on March 23rd, 2009
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!