lunes, 17 de diciembre de 2007

Plantillas en PHP (III)

En los dos anteriores artículos hemos definido un modo de crear plantillas utilizando el motor PHP y hemos visto un pequeño ejemplo de uso. En este post mostraré como realizar una plantilla más elaborada a partir de la que ya hemos visto añadiéndole una plantilla paginador.


Siguiendo con el ejemplo de los anteriores post, si tenemos muchos registros en la base de datos deberíamos dividir su visualización en páginas. Para navegar entre ellas podemos poner unos botones de "alante" y "atrás" o poner un paginador. Un paginador muestra los enlaces a las primeras páginas, a las vecinas de la actual y a las últimas páginas, además de los botones "anterior" y "siguiente".

Para probar esta plantilla sólo tendremos que cargarla con un objeto Template y establecer la variable NUM_PAGINAS:

<?php
include "/classes/Template.class.php";

$tmplt=new Template("platillas/paginador.phpt");
$tmplt->set("NUM_PAGINAS",20);
@$tmplt->dump();
?>


La plantilla en cuestión es la siguiente, aunque el código es muy complejo no es necesario entenderlo para usarla, como ya hemos visto:

<?
$CENTRO=2; //numero de paginas a cada lado de la página seleccionada ...k-2,k-1,k,k+1,k+2...
$LADO=3; //número de primeras paginas 1,2,3... y de ultimas...n-2, n-1, n

//Preparamos la URL siguiente
$PAGINA=(empty($_GET["pagina"])?1:$_GET["pagina"]);
unset($_GET["pagina"]);
$URL_PAGINA=$_SERVER["PHP_SELF"]."?".http_build_query($_GET);
?>
<div id="paginas">
<? if($NUM_PAGINAS>1): ?>

<!-- BOTON PAGINA ANTERIOR -->
<? if($PAGINA>1): ?>
<a href="<?=$URL_PAGINA?>&amp;pagina=<?=($PAGINA-1)?>" class="pagina">
<img src="imagenes/flecha_izq" alt="Página anterior" />
</a>
<? endif ?>

<!-- ENLACES A LAS PRIMERAS PAGINAS -->
<? for($i=1;$i<$LADO+1 && $i<$NUM_PAGINAS+1 && $i<$PAGINA-$CENTRO;$i++): ?>
<a href="<?=$URL_PAGINA?>&amp;pagina=<?=$i?>" class="pagina">
<?=$i?>
</a>
<? endfor ?>

<!-- SEPARADOR -->
<? if( $PAGINA>$LADO+$CENTRO+1 ): ?>
...
<? endif ?>

<!-- PAGINAS VECINAS A LA ACTUAL -->
<? for( $i=((($PAGINA-$CENTRO)>0)?($PAGINA-$CENTRO):1); $i<$NUM_PAGINAS+1 && $i<$PAGINA+$CENTRO+1; $i++ ): ?>
<? if($i==$PAGINA): ?>
<?=$i?>
<? else: ?>
<a href="<?=$URL_PAGINA?>&amp;pagina=<?=$i?>" class="pagina">
<?=$i?>
</a>
<? endif ?>
<? endfor ?>

<!-- SEPARADOR -->
<? if($NUM_PAGINAS>$PAGINA+$CENTRO+$LADO): ?>
...
<? endif ?>

<!-- ENLACES A LAS ULTIMAS PAGINAS -->
<? if( $NUM_PAGINAS>$PAGINA+$CENTRO ): ?>
<? for( $i=((($NUM_PAGINAS-$LADO+1)<=($PAGINA+$CENTRO))?($PAGINA+$CENTRO+1):($NUM_PAGINAS-$LADO+1)); $i<$NUM_PAGINAS+1; $i++ ): ?>
<a href="<?=$URL_PAGINA?>&amp;pagina=<?=$i?>" class="pagina">
<?=$i?>
</a>
<? endfor ?>
<? endif ?>

<!-- BOTON PAGINA SIGUIENTE -->
<? if($PAGINA<$NUM_PAGINAS): ?>
<a href="<?=$URL_PAGINA?>&amp;pagina=<?=($PAGINA+1)?>" class="pagina">
<img src="imagenes/flecha_der.gif" alt="Página siguiente" />
</a>
<? endif ?>
<? endif ?>
</div>

Como es de espera estaremos accediendo al script que muestra la lista a través de una llamada GET. La plantilla se encarga de regenerar la URL de esta llamada (con todas sus variables) añadiendo la variable "pagina" para indicar(obviamente) la página a la que se desea acceder. Esto estrictamente no debería estar en la plantilla y la variable URL_PAGINA deberíamos establecerla nosotros desde fuera de la plantilla, pero vamos a utilizar este atajo ya que tenemos las funciones PHP a nuestra disposición y esto nos simplifica mucho las cosas.

¿Pero como incluirla en la plantilla de la lista? Pues con un include, pero esto y otros detalles sobre los CSS de la plantilla lo dejamos para el próximo post.

No hay comentarios: