Re : Hoathis_Pagination
Et je ne parle pas de références arrière dans mon post de tout à l'heure, mais du fait de pouvoir dire:
parenthèse non précédée d'un backslash
et
[^\](ne semble pas vouloir marcher!
« La structure de toute “chose”, qu'il s'agisse d'un langage, d'une maison, d'une machine etc., se résume à des relations. » — Alfred Korzybski
Vous n'êtes pas logué. Veuillez vous loguer ou vous enregistrer.
Hoa Forum » Vos contributions » Hoathis_Pagination
Et je ne parle pas de références arrière dans mon post de tout à l'heure, mais du fait de pouvoir dire:
parenthèse non précédée d'un backslash
et
[^\](ne semble pas vouloir marcher!
Je vais corriger ça soit cette nuit, ça demain matin (je vais essayer de dormir au moins 2h).
Te bile pas pour ce soir ![]()
de toute façon, moi je vais au lit, donc j'en profiterais pas ![]()
Et demain, ça sera pas avant 18h que je m'y remettrais (pis bon dans l'absolu, je peux avancer sur d'autres plans, c'est juste que ça m'énerve de bloquer sur un bug sur lequel je n'ai aucun pouvoir!!!!
)
C'est le principe du bug en général ^^.
C'est tout bon, c'est corrigé. Depuis 9h ce matin que j'y suis …
J'ai repensé complètement l'analyse (avec un callback). Bref, ça marche, et il n'y a plus de bidouille (j'en avais ajouté une pour Tetardo, mais maintenant c'est uniformisé).
On applaudira donc la révision 656
.
Édition : plus besoin de blackslashes n'y rien du tout, tout fonctionne bien
.
Tu reçois les notifications par mail maintenant ?
Huhu, comme quoi c'est pratique aussi pour ça
.
Hop me revoilà avec la dernière version du bazard!
Les améliorations:
Gestion des paramètres via Hoa_Framework_Parameterizable
(Et du coup ajout de la branche attr.* pour ajouter autant d'attributs html que l'on souhaite)
Aération du code + réindentation propre
Correction de quelques fautes :-°
Reste à peaufiner:
La gestion des erreurs...
Pour l'instant les exeptions lancées sont de type Exception et non pas Hoa_Exception, pourquoi pas aller jusqu'a Hoathis_Pagination_Exception, quel est l'interet?
Uniformiser les commentaires, peut-être repasser à l'anglais?
What else?
Voilà la classe revue:
<?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 implements Hoa_Framework_Parameterizable {
/**
* Instance d'Hoa_Database
*/
private $db = null;
/**
* Hoathis_Pagination::__construct
*
* Initialise les variables
*
* @access public
* @param array $arguments tableau contenant les différents arguments :
* 'sql' requête de sélection (Sans clause LIMIT)
* 'sqlcount' requête de comptage
* 'nbresults' Si nombre de résultats connus, remplace sqlcount
* 'nbelmts' Nombre d'éléments par pages
* 'attr.*' Attributs des liens <a>
* '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 ellipses
* 'needpagi1' Indique si on affiche la pagination lorsqu'il
* n'y a qu'une seule page
* 'arroundcurrentpage'
* Code html pour habiller la page courante
* ex: <b>%d</b>
* 'separator' séparateurs de pages
*
* @return none
*/
public function __construct( $parameters = array() ){
// Récupération de l'instance de connexion
if($this->db === null) {
$this->db = Hoa_Database_Dal::getLastInstance();
// A garder ou non selon la configuration serveur
$this->db->query("SET NAMES 'utf8'");
}
$this->_parameters = new Hoa_Framework_Parameter(
$this,
array(),
array(
'sql' => null,
'sqlcount' => null,
'nbresults' => null,
'nbelmts' => 10,
'page' => isset($_GET['page']) ? (int)$_GET['page'] : 1,
'prefix' => 'Page(s) :',
'needpagi1' => false,
'nbpagesgrpes' => 2,
'elipse' => '...',
'attr.href' => null,
'attr.title' => 'Aller à la page %d',
'arroundcurrentpage' => '<b>%d</b>',
'separator' => ' | '
)
);
// Initialisation des paramètres
$this->setParameters($parameters);
// récupération des paramètres
$params = $this->getParameters();
// Requête d'affichage (obligatoire)
if( $params['sql'] === null ){
throw new Exception('You have to give an sql request');
}
// Requête de comptage ou résultat directement (obligatoire)
if( $params['sqlcount'] === null ) {
if( $params['nbresults'] === null){
throw new Exception('You have to give a counting sql
request or directly the number of results');
}
}
else {
$this->setParameter(
'nbresults',
$this->queryCount()
);
}
$attr=$this->unlinearizeBranche('attr');
if($attr['href'] === null){
$this->setParameter(
'attr.href',
$this->buildUrl()
);
}
}
/**
* Hoathis_Pagination::buildUrl
*
* Retourne l'url de la page avec tous les arguments formatés pour
* le sprintf à venir (ie ajout du page=%d)
*
* @access private
* @param none
* @return string L'url utilisée dans la méthode Hoathis_Pagination::navi
*/
private function buildUrl() {
$args = '';
foreach($_GET as $key=>$val) {
if($key!=='page') {
$args .= (!empty($args) ? '&':'') . $key . '=' . urlencode($val);
}
}
return PUBLIC_URL.'/index.php?'.$args.'&page=%d';
}
/**
* Hoathis_Pagination::queryCount
*
* Retourne le nombre de résultats avec la requête de comptage
*
* @access private
* @param none
* @return int Result of 'sqlcount'
*/
private function queryCount() {
$sqlcount = $this->getParameter('sqlcount');
try {
$statement = $this->db->query( $sqlcount );
list($results) = $statement->fetchAll();
}
catch ( Hoa_Database_Dal_Exception $e ) {
$statement->closeCursor();
}
return (int)reset($results);
}
/**
* Hoathis_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() {
$params = $this->getParameters();
// Nombre de pages nécessaires
$nbPages = ceil($params['nbresults']/$params['nbelmts']);
// Construction des attributs
$attrHtml = array();
$attr = $this->unlinearizeBranche('attr');
foreach($attr as $key=>$value){
$attrHtml[] = htmlspecialchars($key).'="'.htmlspecialchars($value).'"';
}
// Un seul paramètre sera passé à sprintf, on nomme donc les arguments
$attrHtml = str_replace('%d','%1$d',implode(' ',$attrHtml));
// S'il y a au moins une page à afficher
if($nbPages >= 1) {
// Contiendra chaque élément de la navigation
$navi = array();
//si la page demandée n'existe pas, alors on blance une exeption
if($params['page'] > $nbPages) {
throw new Exception('This page ('.$params['page'].') does\'nt exist...');
}
elseif($params['page'] < 0) {
throw new Exception('This page ('.$params['page'].') does\'nt exist...');
}
// S'il y a plus d'une page
if($nbPages > 1) {
// Pages précédentes
for($i=1; $i<$params['page']; $i++) {
$navi[] = '<a '.sprintf($attrHtml,$i).' >'.$i.'</a>';
// Si on arrive à l'ellipse
if(
$params['nbpagesgrpes'] == $i &&
($params['page']-$i) > ($params['nbpagesgrpes']+1)
) {
$navi[] = $params['elipse'];
// On sort de la boucle
$i = $params['page'] - $params['nbpagesgrpes'] - 1;
}
}
//page en cours
if($params['page'] > 0) {
$navi[] = sprintf($params['arroundcurrentpage'],$params['page']);
}
// Pages suivantes
for( $j=($params['page']+1); $j<=$nbPages; $j++ ) {
$navi[] = '<a '.sprintf($attrHtml,$j).' >'.$j.'</a>';
// Si on arrive à l'ellipse
if(
($params['nbpagesgrpes'] + $params['page']) == $j
&& ($nbPages-$j) > $params['nbpagesgrpes']
) {
$navi[] = $params['elipse'];
// On sort de la boucle
$j = $nbPages-$params['nbpagesgrpes'];
}
}
}
// Une seule page, on ne fait pas de traitement
else {
if ($params['needpagi1'] == true) {
$navi[] = sprintf($params['arroundcurrentpage'],1);
}
}
// Formatage final
$navi = $params['prefix'].' '.implode($params['separator'],$navi);
}
// Pas de résultats
else {
$navi='';
}
return $navi;
}
/**
* Hoathis_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(){
$params = $this->getParameters();
$limit= " LIMIT ".( ($params['page']-1) * $params['nbelmts'] ).
",".$params['nbelmts'];
try {
$statement = $this->db->query( $params['sql'].$limit );
return $statement;
}
catch ( Hoa_Database_Dal_Exception $e ) {
echo $e;
$statement->closeCursor();
return false;
}
}
/*
*
* Fonctions à implémenter pour Hoa_Framework_Parameterizable
*
*/
/**
* Set many parameters to a class.
*
* @access public
* @param array $in Parameters to set.
* @return void
* @throw Hoa_Exception
*/
public function setParameters ( Array $in ) {
return $this->_parameters->setParameters($this, $in);
}
/**
* Get many parameters from a class.
*
* @access public
* @return array
* @throw Hoa_Exception
*/
public function getParameters ( ) {
return $this->_parameters->getParameters($this);
}
/**
* Set a parameter to a class.
*
* @access public
* @param string $key Key.
* @param mixed $value Value.
* @return mixed
* @throw Hoa_Exception
*/
public function setParameter ( $key, $value ) {
return $this->_parameters->setParameter($this, $key, $value);
}
/**
* Get a parameter from a class.
*
* @access public
* @param string $key Key.
* @return mixed
* @throw Hoa_Exception
*/
public function getParameter ( $key ) {
return $this->_parameters->getParameter($this, $key);
}
/**
* Get a formatted parameter from a class (i.e. zFormat with keywords and
* other parameters).
*
* @access public
* @param string $key Key.
* @return mixed
* @throw Hoa_Exception
*/
public function getFormattedParameter ( $key ) {
return $this->_parameters->getFormattedParameter($this, $key);
}
/**
* Unlinearize a branche to an array.
*
* @access public
* @param string $branche Branche.
* @return array
*/
public function unlinearizeBranche($branche){
return $this->_parameters->unlinearizeBranche($this,$branche);
}
}Oups il semblerait que le forum me bouffe quelque alignements... ![]()
Posts [ 21 to 30 of 31 ]
Hoa Forum » Vos contributions » Hoathis_Pagination
Powered by PunBB
Currently used extensions: pun_repository, pun_bbcode, pun_pm, pun_quote, pun_antispam. Copyright © 2008 PunBB
[ Généré en 0.061 secondes, 16 requêtes exécutées ]