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.
#1 by Humberto at May 4th, 2009
Aew Lim, vou arrumar um seguidor do seu site. Tá de parabéns ae.
#2 by Bruno Cassol at May 13th, 2009
Muito bom!
jqFlexgrid é uma ferramenta excelente para sistemas web, assim como Zend Framework.
#3 by Tales at May 14th, 2009
Thanks for your visit, Elcoj!
#4 by Christine Fürst at June 23rd, 2009
Hi Tals,
Thanks for sharing this code.
I have a question about the Tavs Library baseado em ZF (Classes PHP). Where can I find it?
Google does not give me any clou.
Looking forward to hearing from you about this.
Kind reagerds,
Christine Fürst (aka Stinie)
#5 by thiago at June 29th, 2009
onde acho o helper Tavs_jQuery_Flexigrid? vc pode postá-lo por favor. parabéns pela iniciativa
#6 by Tales at July 4th, 2009
Olá Thiago,
não sei porque o wordpress removeu o link para download dos arquivos utilizados no tutorial. Atualizei o post e todos os arquivos podem baixados.
Abraços!
#7 by Tales at July 4th, 2009
Hi Christine,
unfortunately the wordpress removed the links to download. I updated the post and the files to tutorial already was enabled again.
Cheers.
#8 by Bruno at July 21st, 2009
Parabens Tales!
Otimo o plugin, assim como a elegancia
do codigo que voce escreve.
Voce teria mais alguns exemplos de utilizacao com botoes e
outras funcionalidades?
Abraco
#9 by Tales at July 24th, 2009
Olá Bruno,
Obrigado pelos elogios. Não tenho nenhum outro exemplo real agora para utilização de botões. Muito se confundi sobre as ações que os botões terão. Vale lembrar que as ações dos botões deverão ser implementadas via Javascript pelo programador. O PHP irá gerar somente a chamada da função que irá ser executada quando clicar no botão. Este componente somente facilita a integração do flexigrid com PHP. Então as funcionalidades serão as mesmas caso seja feita utilizando somente javascript. Acredito que uma das grandes vantagens dessa integração é que se pode configurar o Flexigrid a partir de condições do PHP. Ex. Somente usuários com permissão poderão excluir ou editar registros. Neste caso, só irá adicionar botões ao flexigrid se o PHP permitir. Esta poderia ser uma tarefa mais um pouco mais complexa utilizando somente javascript. Entendeu? eheheh
Abraços
Abraços.
#10 by Diego at September 3rd, 2009
Olá!
Parabéns pela iniciativa de compartilhar essa implementação tão útil. O Flexigrid é ótimo e integrado ao ZF se torna uma ferramenta indispensável.
Fiz uma classe parecida com a sua assim que encontrei o Flexigrid (a uns meses atrás), mas (pra variar) foi na pressa e não ficou tão otimizada, porém, quebra o galho hehehe.
#11 by Tales at September 8th, 2009
Olá Diego,
Valeu pelos comentários!!! Espero que tenha conseguido utilizar o componente sem problemas. Realmente o Flexigrid + ZF quando bem implementado agilizam o desenvolvimento consideravelmente, pois nao cabe ao programador se preocupar com a implementação, e sim, em utilizar o componente e ver o resultado final.
Se você tiver outras idéias parecidas já implementadas, manda para a agente que será muito bem vindo!
Abraços.
#12 by Niko at September 30th, 2009
Hi,
I’m trying to start flexigrid with ZF using your tutorial, but have a problem. The data is selecting from a database table, but instead of the table echo command pritned :
{“page”:1,”total”:12,”rows”:[{"cell":["cxv","-"]},{“cell”:["ety","jhe"]},{“cell”:["fdf","s"]},{“cell”:["sdsvsv","-"]},{“cell”:["test","-"]},{“cell”:["\u0434\u0430\u0441\u0434\u0440\u0445\u0433\u0442\u0440\u0435\u0432\u04452\u044c\u04461\u0437341\u0444","-"]},….
Where I wrong?
I think that the Tavs_ class is not loaded from application, but I’m not sure.
Thanks!
#13 by Tales at October 1st, 2009
Hi Niko,
the string printed is a result of your select in json format. Flexigrid needs to read it to make a correct grid. Can you post your code? Is more easy to help you.
Send a message to my private email: contato@talesaugusto.com.br
Cheers.
#14 by Darkness at October 19th, 2009
Boa tarde Srº Augusto
A algumas semana encontrei o seu blog o qual tem uma série de artigos muito interessantes, sendo que, o da integração com o FlexiGrid no jQuery me chamou a atenção. Estou tentando colocá-lo em funcionamento mas estou tendo problemas ao popular a tabela com os dados do banco. Estou passando um objeto do tipo Zend_Db_Table_Select, como está no seu tutorial após fazer um join, porém ele está me retornando esse erro:
Argument 1 passed to Tavs_JQuery_Flexigrid_Column_Abstract::setRowData() must be an array, object given
Mas eu n entendi esse erro. Abri seu código e vi que dentro dele vc usa o Zend Paginator, passando como parametro do método “factory” um objeto Zend_Db_Table_Select. Vc usa o objeto paginator dentro de um foreach. O resultado dele deveria ser um array, mas está retornando um objeto, vc sabe o pq??
Por favor, assim q que ler este post me retorne!!! Desde já agradeço muito a sua atenção
#15 by Wellington Machado at October 21st, 2009
Tales, me desculpe o incômodo, mas sou iniciante em Zend e estou com dificuldades em colocar o flexigrid em minha aplicação. Poderia disponibilizar um código fonte de alguma aplicação sua com ele funcionando? Pode ser este do site mesmo, mas eu queria com todos os códigos fontes e diretórios.
#16 by Tales at December 25th, 2009
Olá Wellington,
já disponibilizei o código de exemplo da integração. Você pode fazer o checkout do projeto aqui ou baixá-lo aqui
#17 by Felipe Duardo at April 30th, 2010
olá conheci a flexgrid faz pouco tempo e pouco tempo ainda que conheci o zend por isso fazer uma integração ou simplesmente executar seu exemplo foi impossivel…
heheh
(=
#18 by Tales at May 5th, 2010
Olá Felipe,
qual está sendo o seu problema?
Abraços.