Sujet : Hoathis_Pagination

Yep,

Alors voilà je soumet ma petite classe à la critique... (aie aie aie yikes )
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 wink
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 smile

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 tongue

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)

2

Re : Hoathis_Pagination

Je regarde ça plus tard, désolé, j'ai beaucoup de travail ce soir sad.
Mais je suis content que tu aies réussi à faire ça ! Ça a l'air sympa comme tout. Promis je regarde ça plus tard et très en détail wink.

« 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. »

3

Re : Hoathis_Pagination

hey !

J'ai commencé à regarder tout ça, pour le moment j'ai juste regardé et pas testé.
Je vais essayer de te donner qqls remarques (plus ou moins importantes voir inutiles), à toi de faire le tri.

Allez, je commence par l'apparence:

Pour un premier coup d'oeil, je trouve ça propre ^^
et surtout bien commenté avec du détail et des exemples.

Cependant, tu as moyen d'allerger un peu ton code pour la lecture, notament sur les conditions simples (virer les {})

if ()
    ...
else
    ...

et ajouter un saut de ligne sur les conditions plus grosse, comme tu as fais sur le try catch dans query()

if () {

    ...
}
else {

    ...
}

voir: http://hoa-project.net/Manuel/Reference … l#Accolade

et aérer un peu certaines lignes, exemple:

$i=$this->currentPage-$this->nbPageGrp-1;

$i = $this->currentPage - $this->nbPageGrp - 1;

Pour le coté code:

Effectivement, il y a peu être une optimisation a faire ^^
tu peux implémenter l'interface Hoa_Framework_Parameterizable, afin de rendre ta classe compatible avec le système de parametres de Hoa.
Il te permet:
- d'avoir un fichier de config avec les autres config, et donc pouvoir définir un conf par défault
- de lire et d'ecrire les parametres de la classe
- de réécrire à la volée les parametres
Pour faire ça, c simple, tu implementes et tu ajoutes les méthodes obligatoire de l'interface

class Hoathis_Pagination
    implements Hoa_Framework_Parameterizable {
    
    public function __construct ( $parameters = array() ) {

        $this->_parameters = new Hoa_Framework_Parameter(
            $this,
            array(
                'word1'  => 'index'
            ),
            array(
                'param1' => 'bla bla bla',
                'param2' => 'tu tu tu',
            )
        );
    }
    
    ... tes autres méthodes
    
    /**
     * 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);
    }
}
Voir Framework/Core/Parameter.php

Ensuite, tu as prévu l'ajout d'un onclick si besoin, l'idée est bonne ^^
Par contre, c'est pas tres personnalisable.
Par exemple: avec mootools je préfère parser une page et ainsi récuperer une classe pour trouver mes éléments.
Il serait donc intérréssant de laisser le choix des attributs

$attr = array(
    'onClick' => 'alert();',
    'id' => 'res-item-%d',
    'class' => 'ma_class',
    'onMouseover' => '',
    ...
);
juste ajouter un méthode privé du genre getAttribute ( $attribut = array() ), il te suffit de boucler sur le tableau des attributs et de renvoyer une chaine.

On continu ^^

tu as mis certaines variables importantes en private, comme par exemple le numéro de la page courante ($currentPage).
Peut être ajouter des petites méthodes publiques pour récup ces informations ?

public function getCurrentPage () {}

Voila, c un bon début de commentaires...

Encore une fois, Bravo ^^

j'attend de voir les évolutions...

Dernière fois dit par tetardo (02 Feb. 2010 21:06)

Le code c'est comme le paic citron, quand il y en a plus... il y en a encore !

Re : Hoathis_Pagination

Yep!
Merci pour les encouragements! ça fait plaisir smile
Alors c'est vrai que le coup d'implémenter Hoa_Framework_Parameterizable serais une bonne chose!
Reste que pour l'instant, c'est du charabia smile
ça pourrais ressembler à ça au niveau utilisation?:

$pagi = new Hoathis_Pagination();
$pagi->setParameter('foo'=>'bar');

Sachant, qu'en fait il faut distinguer une partie des paramètres qui sont facultatif (donc pourquoi pas les renseigner via setParameter()), et les paramètres obligatoires.
Dans ce cas, je pense qu'il vaut mieux les passer à la méthode __construct() non?
Du coup si vous aviez un exemple tout bête? Genre, on a quatres paramètres:
a:obligatoire,
b:obligatorie,
c:facultatif,
d:facultatif.
Comment on gère les différents cas, ainsi que les valeurs par défaut pour les paramètres facultatifs?

Après l'idée des attributs au choix pour le <a>, très bien wink je prend!!
Je vais voir comment implémenter ça, quelques valeurs par défaut (genre title, href) et le reste au choix!

Et pour finir, aérer et alléger l'écriture, ça peut se faire, c'est vrai qu'il reste du boulot smile

Merci beaucoup pour ce retour! j'attend, celui d'Hywan avant de sortir une autre version!
Bonne soirée!

5

Re : Hoathis_Pagination

Hey smile,

Me voici me voilà, le tueur de contributeurs, la la la (notez les rimes !) big_smile.

Un peu de sérieux. On parle de la première contributeur de Jojolapine quand même. Hum hum. Voici mes premières impressions à chaud.

Niveau code, ça se rapproche des conventions de Hoa. Effectivement, tu pourrais plus aérer ton code avec des espaces. Notamment avant les accolades et autour des affectations :

if(true) {

    $foo   = 'bar';
    $dummy = 7 + 42;
}

Tu noteras que j'aligne aussi mes signes égals, mais je ne vais pas imposer ça … Je préfère car ça permet de mieux visualiser les blocs d'affections, les blocs d'instructions etc.

Au niveau des commentaires, attention à bien les présenter. Tu as :

/**
*
*/

Il te manque un espace devant chaque n lignes (avec n > 2). Il faudrait plutôt avoir :

/**
 *
 */

De cette façon, les étoiles sont alignées. Mon éditeur texte me le fait tout seul. Pas le tien ? Tu utilises lequel ?

À propos du système de paramètres, la documentation est en cours. Mais Tetardo t'a déjà fourni un bel exemple. Il a juste oublié d'ajouter

$this->_parameters->setParameters($parameters);

après avoir affecté $this->_parameters.
Pourquoi faire ça ? Ça permettra de passer les paramètres directement dans le constructeur (comme tu le fais actuellement) sans passer par des méthodes intermédiaires.
Hoa_Framework_Parameters repère déjà les paramètres existant et n'applique les nouvelles valeurs que si nécessaire. Autrement dit, si l'utilisation ne donne qu'un paramètre sur dix, on aura neuf valeurs par défaut.
Pour ce qui est des paramètres obligatoires et/ou facultatifs, j'ai préféré forcer des valeurs par défaut. Ça me semble plus correct. On prend l'utilisateur par la main, il n'a pas trop « à réfléchir ». Ça permet entre autre une utilisation plus rapide de la classe. Mais rien ne t'empêche de tester les valeurs par défaut en les considérant comme des cas d'erreurs : après avoir affecté tous les paramètres, je regarde si certains paramètres ont toujours leur valeur par défaut, si oui alors … (à toi de compléter).

Les commentaires sont en français. C'est un choix. Mais on sera alors moins tolérent sur les fautes d'orthographe. Fait un peu attention smile.
Tu ne documentes pas l'interface de ton code (i.e. abscence des balises @param, @throws, @return etc.). C'est encore un choix. Mais pourtant, l'annotation de code est très importante. Elle permet beaucoup de choses. Tu verras tout ça avec Hoa_Test quand je pourrai le sortir en grande pompe. Pour information, je sors de réunion au laboratoire Informatique de mon université (URF-ST de Franche-Comté) où on discutte encore sur des améliorations de Hoa_Test. Le rapport de recherche est entamé et je pourrai vous en parler en large et en travers quand ledit rapport sera terminé. Pour l'instant, c'est un peu compliqué …
Bref : il faut prendre le plis d'annoter son code. C'est un moyen très pratique et rapide pour avoir de gros services par la suite. Ce n'est pas par hasard qu'on annote.
J'arrête les trolls probables sur ça. Les gens qui trollent sur ce domaine n'ont jamais considéré l'ensemble des avantages, inconvénients, implications et services que peuvent engendrer les annotations. Mais ne nous égarons pas wink. On parle de Jojolapine et sa première contribution tout de même, et on en est fier smile.

Des optimisations sont sûrement possibles. Il existe des dizaines de ressources sur Internet avec différentes approches de cette problématiques (la pagination).

Mais du coup, sans parler de performances ou d'optimisations, on se compte qu'il existe un très très (très) grand nombre de façons d'afficher un résultat de pagination.
Le problème est que ça mélange tous les tiers (i.e. toutes les couches) de notre application : modèle (avec les requêtes), contrôleur (avec le traitement), vue (avec l'HTML, le CSS et le Javascript … voire plus !). Tiens, bah on dirait un composant ?

Oui, la pagination trouverait typiquement sa place dans des composants de vue. Alors certes, Hoa_View n'est pas terminé et XYL est un peu au ralenti ces derniers jours (du à une grosse charge de travail innatendue … …), mais l'idée est là.
Je ne vais pas tout expliquer ici (sauf si tu insistes, crois moi que je ne me dérangerai pas de t'expliquer mais je ne veux pas te noyer), mais tu as rencontré plusieurs problèmes caractéristiques.
Des problèmes comme : afficher du code HTML avec des attributs variables, problèmes de langues (ton système n'est pas internationalisé), injection de données (tu exécutes directement les requêtes), tu mélanges pleins de langages et ils ne cohabitent pas forcément ensemble.

En conclusion je dirai que c'est un très bon début ! Mais vraiment hein. T'as bien saisi les concepts de Hoa, comment fonctionnait et s'articulait le bouzouk, tu comprends vite comment l'améliorer, et tu t'es également frotté à des problèmes complexes car de divers horizon.

Bref, je ne saurai que t'encourager pour améliorer ce début que je félicite grandement wink.

« 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. »

Re : Hoathis_Pagination

Yep,
Alors euh ben... Merci pour les encouragements smile (attention j'ai les chevilles qui se dilatent...)
J'ai à peu près pigé le coup des paramètres, je m'en vais implémenter ça de suite!
J'ai juste pas trop compris la différences entre $keywords et $parameters

function __construct ( Hoa_Framework_Parameterizable $owner,
                                  Array $keywords   = array(),
                                  Array $parameters = array() )

(Si tu pouvais me donner une piste très rapidement juste pour ça?)

Bon pour les fautes, d'orthographe, j'avoue ne pas m'être relu beaucoup :-° ça mérite un peu de ménage smile

Bon par contre, voilà que tu soulèves des questions au niveau de la séparation des données... hmm
C'est vrai qu'on pourrais peut-être simplement traiter les requêtes et les différents "comptages", et retourner, une série de paramètres?
Ainsi dans la vue, on aurais:

<p>
<?php
foreach($this->pagination['pages'] as $page){
?>
<a href="<?php echo $page['url'];?>"><?php $page['texte'];?></p>
<?
}
?>
</p>

(à modifier éventuellement avec la nouvelle couche vue à venir)

Donc bon, je vais améliorer ça avec vos remarques, ensuite, ben la question de la séparation des données reste en suspend...

Re : Hoathis_Pagination

Dernière question sur les paramètres, une fois les paramètres initialisés, quel est la méthode pour y accéder dans les autres méthodes de la classe?

if(empty($this->urlDefault)) {
    $this->urlDefault=PUBLIC_URL.'/index.php?'.$args;
}

//devient

if( empty( $this->getParameter('urlDefault') ) ){
   $this->setParameter('urlDefault', PUBLIC_URL.'/index.php?'.$args);
}

?

Dernière fois dit par jojolapine (03 Feb. 2010 18:02)

8

Re : Hoathis_Pagination

La différence entre les mots-clés et les paramètres c'est que les mots-clés sont modifiés par la classe uniquement. Ce qui aura pour conséquence que tes paramètres (s'ils en sont dépendants) auront des valeurs différentes.
Tape dans le terminal :

$ hoa configuration:view Hoa_Controller

et amuse toi avec cette ligne de commande, tu vas comprendre je pense.

Ne t'embête pas à séparer les données pour l'instant, c'est trop compliqué et tu devras tout changer d'ici peu de temps …

empty() ne fonctionnera pas sur un appel de méthode car c'est une structure du langage (voir isset, empty et is_null sont sur un bateau, sur PHPFrance). J'avais remarqué une autre coquille du même genre dans un de tes précédents messages : $pagi->setParameter('foo'=>'bar');, il ne manquerait pas un tableau par hasard wink, mais oui l'idée est là. Sauf que si tu définis une valeur par défaut, alors ça ne sert à rien. Tu comprends pourquoi ?

« 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. »

Re : Hoathis_Pagination

Ok pour les mots-clés et les paramètres, pour l'instant je ne vois pas d'utilité pour mon cas de faire varier les mots-clés?

Donc c'est bien à coup de get/setParameter que je vais gérer dans le reste de la classe (en faisant attention aux méthodes wink )

Je planche là dessus, des nouvelles d'ici ce soir wink

Y aura à redire de toute façon tongue

10

Re : Hoathis_Pagination

Les mots-clés ne te sont pas forcément nécessaires en effet. À toi de juger 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. »