Sujet : Hoathis_Pagination
Yep,
Alors voilà je soumet ma petite classe à la critique... (aie aie aie
)
L'utilisation est simple:
<?php
// Import du module
importModule('Pagination.~');
$pagi = new Hoathis_Pagination(
array(
'sql'=>'SELECT * FROM matable',
'sqlcount'=>'SELECT count(*) FROM videos',
'nbelmts'=>2,
'actions'=>PUBLIC_URL.'Medias/Videos-%d.html',
'default'=>PUBLIC_URL.'Medias/Videos.html',
'page'=>!empty($params['data.array']['page']) ? $params['data.array']['page']:1
)
);
// récupération du code html généré de la navigation
$this->view->navi = $pagi->navi();
try {
// éxécution de la requête modifiée afin de ne prendre en compte
// que les données de la page courante
$statement = $pagi->query();
$videoListSql = $statement->fetchAll();
}
catch ( Hoa_Database_Dal_Exception $e ) {
$statement->closeCursor();
}Bon voilà les points qui me semblent à revoir:
La gestion des erreurs (j'utilise les exceptions, mais pas partout, et pas uniformément)
Faut-il faire une classe d'exceptions personnalisée?Une meilleure gestion des paramètres passés au constructeur?
Une uniformisation des paramètres (dans leurs noms notamment)
Ensuite viendront tout ceux que vous trouverez ![]()
Pour l'instant la classe ne gère que les requêtes de types "LIMIT x,y", mais je l'améliorerais au besoin pour gérer des requêtes de type BETWEEN ou d'autres si vous en avez besoin ![]()
Bien sûr c'est encore en test donc ça reste là, mais une fois finalisée et approuvée, elle pourra rejoindre les autres sur hoap our sur le futur gestionnaire de plugins de hoa ![]()
Voilou merci d'avances pour vos critiques!
EDIT: J'ai pas dit à quoi servait la classe, mais est-ce bien utile? :-°
j'ai faillit oublier:
<?php
/**
* Hoa Framework
*
*
* @license
*
* GNU General Public License
*
* This file is part of HOA Open Accessibility.
* Copyright (c) 2007, 2008 Ivan ENDERLIN. All rights reserved.
*
* HOA Open Accessibility is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* HOA Open Accessibility is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HOA Open Accessibility; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*
* @category Framework
* @package Hoa_Framework
*
*/
/**
* Hoa_Framework
*/
require_once 'Framework.php';
/**
* Hoa_Database
*/
import('Database.Dal.~');
/**
* Hoathis_Pagination_Exception
*/
importModule('Pagination.Exception');
/**
* Class Hoathis_Pagination
*
* @author joris MULLIEZ <joris.mulliez@gmail.com>
* @license http://gnu.org/licenses/gpl.txt GNU GPL
* @since PHP 5
* @version 0.1
* @package Hoathis_Pagination
*/
class Hoathis_Pagination {
/**
* Instance d'Hoa_Database
*/
private $db=null;
/**
* variable contenant la requète d'origine (sans condition LIMIT)
*/
private $requete=null;
/**
* variable contenant la requète de comptage
*/
private $reqCount=null;
/**
* variable contenant le nombre d'éléments à afficher sur une page
*/
private $nbElmts=1;
/**
* variable contenant le nombre de résultats de la requête
*/
private $nbResults=0;
/**
* variable contenant le numéro de la page courante
*/
private $currentPage=1;
/**
* variable contenant le début de la barre de navigation
*/
private $prefix='';
/**
* variable contenant le séprateur de la barre de navigation
*/
private $nbPageGrp=0;
/**
* variable contenant les caractères d'elipse
*/
private $elipse='';
/**
* variable contenant le title du <a>
*/
private $titlelink='';
/**
* variable contenant la page à appeler php
*/
private $url='';
/**
* variable contenant l'instruction js à éxécuter
*/
private $js='';
/**
* variable contenant le code html qui entoure la page courante
*/
private $arroundCurrentPage='';
/**
* A true si on veut afficher la pagination alors qu'il n'y a qu'une page
*/
private $needPagi1=false;
/**
* Page à donner par défaut (page 1)
*/
private $urlDefault=null;
/**
* pagination::__construct
*
* Initialise les variables
*
* @access public
* @param array $arguments tableau contenant les différents arguments :
* 'sql' requête de selection (Sans clause LIMIT)
* 'sqlcount' requête de comptage
* 'nbresults' Si nombre de résultats connus, remplace sqlcount
* 'nbelmts' Nombre d'éléments par pages
* 'actions' Actions à effectuer (php ou js) forme:
* array(
* 'js' =>'alert(%d)',
* 'php' =>'urlscript.php?page=%d'
* )
* ou si uniquement php:
* 'urlscript.php?page=%d'
* (%d correspond au numéro de la page concernée)
* 'page' Page courante (paramètre get ou encore
* valeur par défaut pour le JS)
* 'nbpagesgrpes' Nombre de page par groupement de page
* ex si = 2:
* 1 2 3 ... 5 6 [7] 8 9 ... 15 16 17
* 'prefix' Texte de début de la pagination
* 'elipse' Caractères affichés pour les élipses
* 'needPagi1' Indique si on affiche la pagination lorsqu'il
* n'y a qu'un seule page
* 'titlelink' title du <a>
* 'arroundCurrent'Code html pour habiller la page courante
* ex: <b>%d</b>
* 'default' Page par défaut (page n°1), si l'on ne souhaite
* pas avoir par exemple de lien du type
* videolist-page-1.html, mais seulement
* videolist.html (duplicate content,SEO,etc...)
*
* @return none
*/
public function __construct( $arguments ){
// Récupération de l'instance de connexion
if($this->db===null){
$this->db = Hoa_Database_Dal::getLastInstance();
// A garder ou non celon la configuration serveur
$this->db->query("SET NAMES 'utf8'");
}
// Requête d'affichage (obligatoire)
if(!empty($arguments['sql'])){
$this->requete = $arguments['sql'];
}
else {
throw new Exception('You have to give an sql request');
}
// Requête de comptage (obligatoire)
if(!empty($arguments['sqlcount'])){
$this->reqCount = $arguments['sqlcount'];
$this->queryCount();
}
// Ou nombre de résultats
elseif (isset($arguments['nbresults']) && (int)$arguments['nbresults']>=0) {
$this->nbResults=(int)$arguments['nbresults'];
}
else {
throw new Exception('You have to give a counting sql request
or directly the number of results');
}
// Nombre d'éléments affichés par page
if(!empty($arguments['nbelmts'])){
$this->nbElmts = (int)$arguments['nbelmts'];
}
// Valeur par défaut
else {
$this->nbElmts = 10;
}
// Page actuelle
if(isset($arguments['page'])){
$this->currentPage = (int)$arguments['page'];
}
// Valeur par défaut
else {
$this->currentPage = isset($_GET['page']) ? (int)$_GET['page'] :1;
}
// Prefixe de la barre de navigation
if(isset($arguments['prefix'])){
$this->prefix = $arguments['prefix'];
}
// Valeur par défaut
else {
$this->prefix = 'Page(s) : ';
}
// besoin de pagination si une seule page
if(!empty($arguments['needPagi1'])){
$this->needPagi1 = (bool)$arguments['needPagi1'];
}
// Groupements de pages
if(!empty($arguments['nbpagesgrpes'])){
$this->nbPageGrp = (int)$arguments['nbpagesgrpes'];
}
// Valeur par défaut
else {
$this->nbPageGrp = 2;
}
// Texte de l'elipse
if(!empty($arguments['elipse'])){
$this->elipse = ' '.$arguments['elipse'];
}
// Valeur par défaut
else {
$this->elipse = ' ...';
}
// Title des liens
if(!empty($arguments['titlelink'])){
$this->titlelink = $arguments['titlelink'];
}
// Valeur par défaut
else {
$this->titlelink = 'Aller à la page ';
}
// Arround current page
if(!empty($arguments['arroundCurrentPage'])){
$this->arroundCurrentPage = ' '.$arguments['arroundCurrentPage'];
}
// Valeur par défaut
else {
$this->arroundCurrentPage = ' <b>%d</b>';
}
if(!empty($arguments['default'])){
$this->urlDefault=$arguments['default'];
}
// Action(s) à effectuer sur les liens
if(!empty($arguments['actions'])){
if(is_array($arguments['actions'])){
// Url => action php
if(!empty($arguments['actions']['url'])){
$this->url = $arguments['actions']['url'];
}
else {
// Valeur par défaut
$this->url = $this->buildUrl();
}
// Js
if(!empty($arguments['actions']['js'])){
$this->js=$arguments['actions']['js'];
}
}
// Seulement url
else {
$this->url=$arguments['actions'];
}
}
// Valeur par défaut
else {
$this->url = $this->buildUrl();
}
}
/**
* pagination::buildUrl
*
* Retourne l'url de la page avec tout les arguments formaté pour
* le sprintf à venir (ie ajout du page=%d)
*
* @access private
* @param none
* @return string L'url utilisé dans la fonction navi
*/
private function buildUrl(){
$args='';
foreach($_GET as $key=>$val){
if($key!=='page'){
$args.=(!empty($args) ? '&':'').$key.'='.urlencode($val);
}
}
if(empty($this->urlDefault)){
$this->urlDefault=PUBLIC_URL.'/index.php?'.$args;
}
return PUBLIC_URL.'/index.php?'.$args.'&page=%d';
}
/**
* pagination::queryCount
*
* Initialise le nombre de résultats avec la requête de comptage
*
* @access private
* @param none
* @return none
*/
private function queryCount(){
try {
$statement = $this->db->query( $this->reqCount );
list($results) = $statement->fetchAll();
}
catch ( Hoa_Database_Dal_Exception $e ) {
$statement->closeCursor();
}
$this->nbResults= (int)reset($results);
}
/**
* pagination::navi
*
* Produit le code html de navigation
*
* @access public
* @param none
* @return string Le code html de la barre de navigation
*/
public function navi(){
// Comptage des résultats
$nbResults = $this->nbResults;
// Nombre de pages nécessaires
$nbPages=ceil($nbResults/$this->nbElmts);
// Construction de l'évènement js
$js=empty($this->js) ? '':' onclick="'.$this->js.'"';
// Si il y a au moins une page à afficher
if($nbPages >= 1){
//si la page demandée n'existe pas, alors on blance une exeption
if($this->currentPage > $nbPages){
throw new Exception('This page ('.$this->currentPage.') does\'nt exist...');
}
elseif($this->currentPage < 0){
throw new Exception('This page ('.$this->currentPage.') does\'nt exist...');
}
// On préfixe la $navi
if ($this->needPagi1 == true || $nbPages > 1) {
$navi=$this->prefix;
}
// Si il y a plus d'une page
// C'est partit pour les calculs
if($nbPages > 1){
// Pages précédentes
for($i=1;$i<$this->currentPage;$i++){
$navi.=' <a href="'.($i == 1 ? $this->urlDefault : sprintf($this->url,$i)).'" '.sprintf($js,$i).'title="'.$this->titlelink.$i.'">'.$i.'</a>';
// Si on arrive à l'elipse
if($this->nbPageGrp==$i && ($this->currentPage-$i) > ($this->nbPageGrp+1)){
$navi.= $this->elipse;
// On sort de la boucle
$i=$this->currentPage-$this->nbPageGrp-1;
}
}
//page en cours
if($this->currentPage>0){
$navi.= sprintf($this->arroundCurrentPage,$this->currentPage);
}
// Pages suivantes
for($j=($this->currentPage+1);$j<=$nbPages;$j++){
$navi.=' <a href="'.($j == 1 ? $this->urlDefault : sprintf($this->url,$j)).'" '.sprintf($js,$j).'title="'.$this->titlelink.$j.'">'.$j.'</a>';
// Si on arrive à l'elipse
if(($this->nbPageGrp+$this->currentPage)==$j && ($nbPages-$j)>$this->nbPageGrp){
$navi.=$this->elipse;
// On sort de la boucle
$j=$nbPages-$this->nbPageGrp;
}
}
}
// Une seule page, on ne fait pas de traitement
else {
if ($this->needPagi1 == true) {
$navi.=' <b>1</b>';
}
}
}
// Pas de résultats
else {
$navi='';
}
return $navi;
}
/**
* pagination::query
*
* Execute la requète avec le limit, et renvoi une resource
*
* @access public
* @param none
* @return mixed Hoa_Database_Dal_DalStatement or false when
* errors occurs
*/
public function query(){
$limit=" LIMIT ".(($this->currentPage-1)*$this->nbElmts).",".$this->nbElmts;
try {
$statement = $this->db->query( $this->requete.$limit );
return $statement;
}
catch ( Hoa_Database_Dal_Exception $e ) {
echo $e;
$statement->closeCursor();
return false;
}
}
}Dernière fois dit par jojolapine (02 Feb. 2010 18:52)