Subversion Repositories Sites.tela-botanica.org

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
7 david 1
<?php
2
/*vim: set expandtab tabstop=4 shiftwidth=4: */
3
// +------------------------------------------------------------------------------------------------------+
4
// | PHP version 4.1                                                                                      |
5
// +------------------------------------------------------------------------------------------------------+
6
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org)                                         |
7
// +------------------------------------------------------------------------------------------------------+
8
// | This library is free software; you can redistribute it and/or                                        |
9
// | modify it under the terms of the GNU Lesser General Public                                           |
10
// | License as published by the Free Software Foundation; either                                         |
11
// | version 2.1 of the License, or (at your option) any later version.                                   |
12
// |                                                                                                      |
13
// | This library is distributed in the hope that it will be useful,                                      |
14
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
15
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                                    |
16
// | Lesser General Public License for more details.                                                      |
17
// |                                                                                                      |
18
// | You should have received a copy of the GNU Lesser General Public                                     |
19
// | License along with this library; if not, write to the Free Software                                  |
20
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
21
// +------------------------------------------------------------------------------------------------------+
22
// CVS : $Id: FRAG_Fragmenteur_Session.class.php,v 1.10 2005/03/08 11:25:48 jpm Exp $
23
/**
24
* API : fragmenteur utilisant les sessions.
25
*
26
* Cette librairie contient la classe fragmenteur qui permet de créer
27
* une série de chiffres pour naviguer de page en page lorsque le
28
* résultat d'une recherche est trop long.
29
* Cette extension du fragmenteur utilise les sessions.
30
*
31
*@package API
32
*@subpackage Framenteur
33
//Auteur original :
34
*@author        Alexandre GRANIER <alexandre@tela-botanica.org>
35
//Autres auteurs :
36
*@author        Jean-Pascal MILCENT <jpm@clapas.org>
37
*@copyright     Tela-Botanica 2000-2004
38
*@version       $Revision: 1.10 $ $Date: 2005/03/08 11:25:48 $
39
// +------------------------------------------------------------------------------------------------------+
40
*/
41
 
42
// +------------------------------------------------------------------------------------------------------+
43
// |                                            ENTETE du PROGRAMME                                       |
44
// +------------------------------------------------------------------------------------------------------+
45
/** Inclusion de la classe Fragmenteur principale. */
46
include_once 'FRAG_Fragmenteur.class.php';
47
 
48
// +------------------------------------------------------------------------------------------------------+
49
// |                                                 CLASSES                                              |
50
// +------------------------------------------------------------------------------------------------------+
51
 
52
/**
53
 * Classe pour séparer un résultat en plusieurs page.
54
 *
55
 * Basé sur la classe fragmenteur mais utilise les variables
56
 * de session.
57
 *
58
 * @author Alexandre Granier <alexandre@tela-botanica.org>
59
 */
60
class fragmenteur_session
61
{
62
    /**
63
    * Contient le séparateur des chiffres
64
    *
65
    * @var         string
66
    * @access    private
67
    */
68
    var $separator;
69
    var $nb_pages;
70
    var $curr_page;
71
    /**
72
    * nombre maximum de numéros de pages qui doivent être affichées
73
    *
74
    * @var         integer
75
    * @access    private
76
    */
77
    var $max_fg_pages;
78
    /**
79
    * groupe courant de nombre de pages
80
    * par défaut 10
81
    *
82
    * @var         integer
83
    * @access    private
84
    */
85
    var $curr_grp;
86
 
87
    /**
88
    * nbre de groupes total
89
    *
90
    * @var         integer
91
    * @access    private
92
    */
93
    var $nb_grp;
94
 
95
    /**
96
    *L'url de départ
97
    *
98
    * @var            string
99
    * @access     private
100
    */
101
    var $url ;
102
 
103
    /**
104
    *Le tableau des variables de l'url et des formulaire
105
    *
106
    * @var        array
107
    * @access     private
108
    */
109
    var $_variables ;
110
 
111
    /**
112
    *Le nombre de résultat par page
113
    *
114
    * @var        integer
115
    * @access     private
116
    */
117
    var $_pas ;
118
 
119
    /**
120
    *Le début de l'ensemble de résultat
121
    *
122
    * @var        integer
123
    * @access     private
124
    */
125
    var $_debut ;
126
 
127
    /**
128
    *Le nombre total de résultat
129
    *
130
    * @var        integer
131
    * @access     private
132
    */
133
    var $_nb_total ;
134
 
135
    function fragmenteur_session ($caractere = ' - ', $nombre_p = 10)
136
    {
137
        // On va utiliser toutes les variables de l'url et des formulaires disponibles
138
        global $HTTP_POST_VARS, $_GET, $HTTP_GET_VARS, $GS_GLOBAL ;
139
        $this->_variables = array_merge($HTTP_GET_VARS, $HTTP_POST_VARS, $_GET) ;
140
        // On récupère toutes les variables de sessions
141
        if (!isset($_SESSION['fragment'])) {
142
            // Il n'y a pas de variable de session, on en crée une et on y met $this->_variables
143
            $_SESSION['fragment'] = $this->_variables;
144
        } else {
145
            // On récupère la variable et on l'affecte à $this->_variables
146
            // en laissant cependant les valeurs existant déjà dans $this->_variables
147
            // mise à jour de la variable de session
148
            $tableau_temp = $_SESSION['fragment'];
149
            foreach ($tableau_temp as $key=>$value) {
150
                if (!isset ($this->_variables[$key]) || ($this->_variables[$key] == '')) {
151
                    if (!isset($HTTP_POST_VARS[$key])) {
152
                        $this->_variables[$key] = $tableau_temp[$key] ;
153
                    } else {
154
                        $this->_variables[$key] = '';
155
                    }
156
                }
157
            }
158
            $_SESSION['fragment'] = $this->_variables;
159
        }
160
        $this->separator = $caractere;
161
        $this->max_fg_pages = $nombre_p;
162
        // on initialise $this->_debut avec soit 0, soit la valeur de $this->_variables['debut']
163
        if (isset($this->_variables['debut']) && $this->_variables['debut'] != '') {
164
            $this->_debut = $this->_variables['debut'] ;
165
        } else {
166
            $this->_debut = 0;
167
        }
168
        // on initialise $this->_pas avec soit 20, soit la valeur de $this->_variables['T_REPONSE']
169
        if (isset ($this->_variables['T_REPONSE']) && $this->_variables['T_REPONSE'] != '') {
170
            $this->_pas = $this->_variables['T_REPONSE'];
171
        } else {
172
            $this->_pas = 20;
173
        }
174
    }
175
 
176
    /**
177
    * fragmente() - Méthode qui fragmente des résultats.
178
    *
179
    * Permet de fragmenter des résultats.
180
    * Le tableau des données à passer en paramêtre doit contenir a minima :
181
    * - $tableau['pstart'] : valeur du début de la page
182
    * - $tableau['step'] : valeur du pas (nombre d'items par pages)
183
    * - $tableau['pend']
184
    * Pour faire figurer des images sur les liens suivant, précédent, début et fin utiliser
185
    * des css.
186
    *
187
    * @access public
188
    * @param array Tableau qui contient les variables du fragmenteur.
189
    * @param int Le nombre de résultat total.
190
    * @return string Le xhtml permettant de naviguer dans les résultats.
191
    */
192
    function fragmente($nbr_total)
193
    {
194
        $startPrev = $startNext = $this->_debut;
195
        // Initialisation des variables
196
        $var_fragmenteur = '';
197
        $this->_nb_total = $nbr_total ;
198
        $how_bloc = $this->_pas ;
199
 
200
        $how_pages = ceil($nbr_total / $how_bloc);
201
        $this->curr_page = ceil(($this->_debut / $how_bloc))+1;
202
        $this->nb_pages = $how_pages;
203
        $this->nb_grp = ceil(($this->nb_pages)/($this->max_fg_pages));
204
        $this->curr_grp = floor(($this->_debut + ($this->max_fg_pages * $this->_pas))/(($this->max_fg_pages)*$this->_pas))-1;
205
        // 1- Altération des données de tmpTab pour passer les paramètres de saut de page
206
        // 1-a- tmpTab de la page précédente
207
        if ($startPrev > 0) $startPrev = $startPrev - $this->_pas ;
208
        // 1-b- tmpTab de la page suivante
209
        $startNext = $startNext + $this->_pas;
210
 
211
        // Bouton pour groupes de pages précédent
212
        if ((($this->nb_pages) > ($this->max_fg_pages))&&(($this->curr_page) > ($this->max_fg_pages))) {
213
            $pstart = ((($this->curr_grp)-1)*($this->max_fg_pages)*$this->_pas);
214
            $txt_depart = (($this->max_fg_pages)*$this->_pas).' données précédentes';
215
            $var_fragmenteur .= '<a class="frag_depart" href="'.$this->url.'&amp;debut='.$pstart.'" title="'.$txt_depart.'" >'.
216
                                '<span>'.$txt_depart.'</span>'.
217
                                '</a>'."\n";
218
        }
219
        // Bouton pour resultats précédent
220
        if ($this->_debut > 0) {
221
                $pstart = $startPrev;
222
                $txt_precedent = $this->_pas.' données précédentes';
223
                $var_fragmenteur .= '<a class="frag_precedent" href="'.$this->url.'&amp;debut='.$pstart.'" title="'.$txt_precedent.'" >'.
224
                                    '<span>'.$txt_precedent.'</span>'.
225
                                    '</a>'."\n";
226
        }
227
        // Fragmentation en page
228
        $tmp_i = 1 + $this->curr_grp * $this->max_fg_pages ;
229
        $j = 1;
230
        while (($tmp_i <= $how_pages) && ($tmp_i <= (($this->max_fg_pages) * (($this->curr_grp) + 1))) && $how_pages != 1) {
231
            if ($this->curr_page == $tmp_i) {
232
                $var_fragmenteur .= '<span class="frag_page_courante">'.$tmp_i.'</span>'."\n";
233
            } else {
234
                $tmp_go = ($tmp_i - 1) * $how_bloc;
235
                $pstart = $tmp_go ;
236
                $var_fragmenteur .= '<a class="frag_page_autre" href="'.$this->url.'&amp;debut='.$pstart.'">'.
237
                                    '<span>'.$tmp_i.'</span>'.
238
                                    '</a>'."\n";
239
            }
240
            if (($tmp_i < $how_pages) && ($j<($this->max_fg_pages))) {
241
                $var_fragmenteur .= '<span class="frag_separateur">'.$this->separator.'</span>'."\n";
242
            }
243
            $tmp_i++;
244
            $j++;
245
        }
246
 
247
        // Bouton pour resultats suivant
248
        if ($this->_debut + $this->_pas < $nbr_total) {
249
            $pstart = $startNext ;
250
            $var_fragmenteur .= '&nbsp;';
251
            $txt_suivant = $this->_pas.' données suivantes';
252
            $var_fragmenteur .= '<a class="frag_suivant" href="'.$this->url.'&amp;debut='.$pstart.'" title="'.$txt_suivant.'" >'.
253
                                '<span>'.$txt_suivant.'</span>'.
254
                                '</a>'."\n";
255
 
256
        }
257
        // Bouton pour groupes de pages suivants
258
        if ((($this->nb_grp)>1)&&(($this->curr_grp)<(($this->nb_grp)-1))) {
259
            $pstart = ((($this->curr_grp)+1)*($this->max_fg_pages)*$this->_pas) ;
260
            $txt_fin = (($this->max_fg_pages)*$this->_pas).' données suivantes';
261
            $var_fragmenteur .= '<a class="frag_fin" href="'.$this->url.'&amp;debut='.$pstart.'" title="'.$txt_fin.'" >'.
262
                                '<span>'.$txt_fin.'</span>'.
263
                                '</a>'."\n";
264
        }
265
 
266
        if ($var_fragmenteur == '') {
267
            $var_fragmenteur = '&nbsp;';
268
        }
269
        return $var_fragmenteur;
270
    }
271
 
272
    /**
273
    * Méthode setURL() -
274
    *
275
    * @access public
276
    * @param    url         Chaine qui contient l'url de départ
277
    */
278
    function setURL($url)
279
    {
280
        $this->url = $url;
281
    }
282
 
283
    /** getVariable()   Renvoie la valeur d'une variable de l'url ou d'un formulaire
284
    *
285
    * @access   public
286
    * @param     string  Nom de la variable
287
    * @return    mixed  La valeur de la variable ou la chaine vide
288
    */
289
    function getVariable ($cle)
290
    {
291
        if (isset($this->_variables[$cle])) {
292
            return $this->_variables[$cle];
293
        } else {
294
            return '';
295
        }
296
    }
297
 
298
    /** setVariable()    Affecte une valeur à une variable
299
    *
300
    * @param    string  clé
301
    * @param    string  valeur
302
    * @return   void
303
    */
304
    function setVariable ($cle, $valeur)
305
    {
306
        $tableau = $_SESSION['fragment'];
307
        $tableau[$cle] = $valeur ;
308
        $_SESSION['fragment'] = $tableau;
309
    }
310
 
311
    /** fixerLePas()    Permet d'indiquer le nombre de résultat souhaité par page
312
    *
313
    * @param    int     le pas
314
    * @return   void
315
    */
316
    function fixerLePas ($pas)
317
    {
318
        $this->_pas = $pas;
319
    }
320
 
321
    /** lireLePas()    Permet d'obtenir le nombre de résultat souhaité par page
322
    *
323
    * @return   integer le pas
324
    */
325
    function lireLePas ()
326
    {
327
        return $this->_pas;
328
    }
329
 
330
    /** lireLeDebut()    Permet d'obtenir le nombre du début du résultat
331
    *
332
    * @return   integer le début
333
    */
334
    function lireLeDebut ()
335
    {
336
        return $this->_debut;
337
    }
338
 
339
    /** fixerLeDebut()    Permet d'indiquer le nombre du début du résultat
340
    *
341
    * @return   integer le début
342
    */
343
    function fixerLeDebut ($debut)
344
    {
345
        $this->_debut = $debut;
346
    }
347
 
348
    /** affNbRes() Affiche le nombre de résultat
349
    *
350
    * Permet de créer un petit texte uniforme du type "il y a x resultats sur y"...
351
    * Possibilité de paramétrer un "modèle" pour afficher selon différentes mises
352
    * en forme.
353
    *
354
    * @access   public
355
    * @param    int  nombre d'items trouvés par la requête
356
    * @return   string une phrase en HTML
357
    */
358
    function affNbRes($nombre_total)
359
    {
360
        $this->_nb_total = $nombre_total ;
361
        // init de $var_affiche
362
        $var_affiche = '';
363
        if ($this->_nb_total > 1) {
364
            $pluriel_loc = 's';
365
        } else {
366
            $pluriel_loc = '';
367
        }
368
        if ($this->_nb_total > 1) {
369
            $pluriel_tot = 's';
370
        } else {
371
            $pluriel_tot = '';
372
        }
373
        if ($this->_nb_total > 0) {
374
            $add_from = $this->_debut + 1;
375
            $tmp_num = $this->_debut + $this->_pas ;
376
            if ($tmp_num < $this->_nb_total) {
377
                $add_to = "$tmp_num";
378
            } else {
379
                $add_to = $this->_nb_total ;
380
            }
381
        }
382
        $var_affiche .= '<b>'.$this->_nb_total.'</b>'.' résultat'.$pluriel_loc."\n";
383
        if ($this->_nb_total > 0) {
384
            $var_affiche .= ' Affichage des données <b>'.$add_from.'</b> à <b>'.$add_to.'</b>.'."\n";
385
        }
386
 
387
        return $var_affiche;
388
    }
389
}//Fin classe.
390
 
391
/* +--Fin du code ---------------------------------------------------------------------------------------+
392
*
393
* $Log: FRAG_Fragmenteur_Session.class.php,v $
394
* Revision 1.10  2005/03/08 11:25:48  jpm
395
* Remplacement d'id en class car le fragmenteur peut être afficher plusieurs fois dans la même page XHTML.
396
*
397
* Revision 1.9  2005/03/03 08:40:48  jpm
398
* Correction de gestion des guillemets.
399
*
400
* Revision 1.8  2005/02/28 15:42:15  jpm
401
* Initialisation d'une variable de session.
402
*
403
* Revision 1.7  2005/02/24 18:32:08  jpm
404
* Correction : changement d'un id en class.
405
*
406
* Revision 1.6  2005/02/24 17:16:10  jpm
407
* Modif des noms des id.
408
*
409
* Revision 1.5  2005/02/23 17:28:35  jpm
410
* Suppression d'image dans le fragmenteur et remplacement par des styles css.
411
* Amélioration du code html.
412
*
413
* Revision 1.4  2005/02/22 19:32:45  jpm
414
* Initialisation de variables.
415
*
416
* Revision 1.3  2005/02/22 16:21:28  jpm
417
* Mise à jour : utilisation des session, mise en forme et suppression d'appel de fichiers inutiles.
418
*
419
* Revision 1.2  2004/09/11 19:12:38  jpm
420
* Début mise en forme.
421
*
422
*
423
* +--Fin du code ----------------------------------------------------------------------------------------+
424
*/
425
?>