nov 03

Adcionando Paginadores à Paginas com Zend Framework

Paginação, PHP, Programação, Zend Framework, Zend_Paginator Deixe um Comentário Zend Framework

Quando não é possível determinar o número exato de resultados que podem aparecer em uma página ou quando esse número de resultados é muito grande, uma prática excelente é usar um paginador para limitar o número de resultados que serão exibidos em cada um das páginas, dessa forma evita-se que uma página se torne muito extensa e que seu tamanho interfira no tempo de carregamento da mesma, além de deixá-la muito mais agradável visualmente.

Paginadores no Zend Framework

O Zend Framework possui uma classe de paginação própria, que facilita muito esse trabalho e ainda possibilita um excelente controle do modo como esse paginador será exibido em página, a classe Zend_Paginator permite ainda que vários tipos de dados sejam paginados, os tipos mais comuns são dados contidos em um array e dados provenientes de um banco de dados, nesse artigo iremos abordar apenas o último desses tipos, mas a implementação em cada um deles é bastante semelhante.

Paginando Resultados do Banco de Dados

Para realizar a paginação de dados provenientes de um banco de dados obviamente é preciso ter um banco de dados, e pelo menos alguns dados inseridos nele, não vou entrar no mérito de criação desse banco de dados, pois muitos artigos anteriores já usaram diferentes bancos de dados com diferentes informações e o processo de criação de cada um desses bancos já foi detalhado anteriormente, nesse exemplo vou apenas assumir que existe um banco de dados, cuja conexão já está devidamente configurada no Zend Framework, com pelo menos uma tabela de usuários cujo Model também já foi criado.

Controller

O Paginador de banco de dados do Zend_Framework recebe como parâmetro um conjunto de dados provenientes do banco (rowset) e a partir desse conjunto de dados exibe apenas os resultados definidos pela configuração desse paginador, o código a seguir ilustra a parte dessa ação que é realizada no Controller:

public function indexAction(){
	$pagina = $this->_getParam('pagina', 1);

	$userModel = new User();
	$rowsetUser = $userModel->fetchAll();

	$paginador = Zend_Paginator::factory($rowsetUser);
	$paginador->setItemCountPerPage(20);
	$paginador->setPageRange(9);
	$paginador->setCurrentPageNumber($pagina);

	$this->view->paginador = $paginador;
}

Nesse exemplo todos os registros da tabela de usuário estão sendo buscados pelo método fetchAll() do Model de Usuários ($userModel) e então esses dados estão sendo passados para o método estático factory() da classe Zend_Paginator, esse método irá interpretar qual o tipo de dados está sendo passado para o paginador e realizar as ações necessárias para o tipo em questão.

Em seguida são feitas algumas configurações no paginador, a primeira delas e configurar o número máximo de itens por página para 20, seguido do número de páginas que será exibido nos controles de página e por último informando ao paginador qual página deverá ser exibida, a variável $pagina usada nesse caso armazena o número de página que está sendo passado pela URL e caso isso não tenha ocorrido assume que o número da página é 1 (Linha 1 do Código). Por último o paginador e passado para a view na variável $this->view->paginador.

Partial View

Depois de criar as ações no seu controller é preciso criar uma a estrutura dos controles de paginação, o código abaixo é um exemplo desse tipo de estrutura, é uma alteração do exemplo contido na documentação oficial do framework traduzido para o português:

<?php if ($this->pageCount): ?>
	<div>
		<!-- Controle de Página Anterior -->
		<?php if (isset($this->previous)): ?>
			<a href="<?php echo $this->url(array('pagina' => $this->previous)); ?>">&lt; Anterior</a> |
		<?php else: ?>
			<span>&lt; Anterior</span> |
		<?php endif; ?>

		<!-- Controle Numérico de Página -->
		<?php foreach ($this->pagesInRange as $page): ?>
			<?php if ($page != $this->current): ?>
				<a href="<?php echo $this->url(array('pagina' => $page)); ?>"><?php echo $page; ?></a> |
			<?php else: ?>
				<?php echo $page; ?> |
			<?php endif; ?>
		<?php endforeach; ?>

		<!-- Controle de Próxima Página -->
		<?php if (isset($this->next)): ?>
			<a href="<?php echo $this->url(array('pagina' => $this->next)); ?>">Próxima &gt;</a>
		<?php else: ?>
			<span>Próxima &gt;</span>
		<?php endif; ?>
	</div>
<?php endif; ?>

Esse código deve ser inserido dentro de um arquivo .phtml nesse exemplo vou assumir que esse arquivo está dentro do diretório views/scripts/layout/paginador.phtml mas você pode armazená-lo no lugar que achar melhor, o código acima também é apenas um exemplo de estrutura possível que pode ser alterado para atender as necessidades específicas de cada aplicação.

Action View

No arquivo de view da Action em questão tudo que precisa ser feito é o seguinte:

<?php if (count($this->paginador)): ?>
	<ul>
		<?php foreach ($this->paginador as $user): ?>
			<li><?php echo $user->name; ?></li>
		<?php endforeach; ?>
	</ul>
<?php endif; ?>
<?php echo $this->paginationControl($this->paginador, 'Sliding', 'layout/paginador.phtml'); ?>

Como é possível ver o dados estão sendo exibidos normalmente como se viessem diretamente do banco de dados, a única diferença é que ao final está sendo incluída a instrução para exibir o paginador, o método paginationControl() recebe três parâmetros, o primeiro deles é a instância do paginador que está sendo utilizado, o segundo é o estilo do paginador, para uma lista completa dos estilos disponível você pode acessar a Documentação da Classe Zend_Paginator, e o último parâmetro e o caminho para o arquivo com a estrutura dos controles que foi criado anteriormente.

Para simplificar ainda mais esse processo você pode configurar os padrões desse paginador incluindo no seu arquivo de Bootstrap a seguinte instrução:

public function _initPaginator(){
	Zend_Paginator::setDefaultScrollingStyle('Sliding');
	Zend_View_Helper_PaginationControl::setDefaultViewPartial('layout/paginador.phtml');
}

Feito isso você pode alterar a chamada para os controles de paginação (última linha do código da view Action no início do tópico) para apenas a seguinte instrução:

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

Conclusão

Com Zend_Paginator e alguns passos simples é possível melhorar significativamente a experiência do usuário na página e ainda reduzir o tempo de carregamento da mesma e o consumo de trafego do servidor de hospedagem.

Deixe uma resposta