21

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!

22

Re : Hoathis_Pagination

Je vais corriger ça soit cette nuit, ça demain matin (je vais essayer de dormir au moins 2h).

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

23

Re : Hoathis_Pagination

Te bile pas pour ce soir wink
de toute façon, moi je vais au lit, donc j'en profiterais pas smile
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!!!! sad )

24

Re : Hoathis_Pagination

C'est le principe du bug en général ^^.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

25

Re : Hoathis_Pagination

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 wink.

Édition : plus besoin de blackslashes n'y rien du tout, tout fonctionne bien smile.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

26

Re : Hoathis_Pagination

Yeah!!!!! smile
Je test ça ce soir wink
Merci merci smile

27

Re : Hoathis_Pagination

Tu reçois les notifications par mail maintenant ?

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

28

Re : Hoathis_Pagination

Et non smile j'ai eu l'info via ton twitter smile

29

Re : Hoathis_Pagination

Huhu, comme quoi c'est pratique aussi pour ça tongue.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

30

Re : Hoathis_Pagination

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... hmm