source: spip-zone/_plugins_/criteres_suivant_precedent/suivant_precedent_fonctions.php @ 97279

Last change on this file since 97279 was 60334, checked in by kent1@…, 9 years ago

on passe par un fichier _fonctions pour marcher en 3.0 + paquet.xml

On passe en stable également

File size: 7.4 KB
Line 
1<?php
2/**
3 * Plugin critere suivant precedent
4 * Licence GPL - 2010 - Matthieu Marcillaud
5 *
6**/
7
8if (!defined("_ECRIRE_INC_VERSION")) return;
9
10// tester la presence des iterateurs...
11if (version_compare($GLOBALS['spip_version_branche'], '2.3', '>=')
12        or defined('_DIR_PLUGIN_ITERATEURS')) {
13                define('avec_iterateur', true);
14} else {
15                define('avec_iterateur', false);
16}
17
18
19/**
20 * Fournit le critère de boucle {suivant}
21 * permettant de trouver l'élément suivant par rapport à la boucle parente
22 *
23**/
24function critere_suivant_dist($idb, &$boucles, $crit) {
25        if (avec_iterateur) {
26                calculer_critere_iterateur_suivant_precedent_dist($idb, $boucles, $crit, 'suivant');
27        } else {
28                calculer_critere_suivant_precedent_dist($idb, $boucles, $crit, 'suivant');
29        }
30}
31
32/**
33 * Fournit le critère de boucle {precedent}
34 * permettant de trouver l'élément précédent par rapport à la boucle parente
35 *
36**/
37function critere_precedent_dist($idb, &$boucles, $crit) {
38        if (avec_iterateur) {
39                calculer_critere_iterateur_suivant_precedent_dist($idb, $boucles, $crit, 'precedent');
40        } else {
41                calculer_critere_suivant_precedent_dist($idb, $boucles, $crit, 'precedent');
42        }
43}
44
45
46
47/**
48 * Calcul des critères {suivant} et {precedent}.
49 * On reprend en grande partie le fonctionnement de {pagination} avec debut_xx=@yy
50 * en jouant de sql_seek pour se déplacer à la bonne position sur les résultats de
51 * la boucle.
52 *
53 * @param string $type  type de décalage : 'suivant' ou 'precedent'
54**/
55function calculer_critere_iterateur_suivant_precedent_dist($idb, &$boucles, $crit, $type) {
56        $boucle = &$boucles[$idb];
57        $primary = $boucle->primary;
58       
59        $arg = kwote(calculer_argument_precedent($idb, $primary, $boucles));
60
61        $partie =
62                 "0;\n"
63                ."\tif (\$id_actuel = $arg) {\n"
64                ."\t\t".'$debut_boucle = quete_iterateur_position_primary(\''.$primary.'\', $id_actuel, "'.$type.'", $iter);'."\n"
65                // pas de resultat, on cree une selection vide
66                ."\t\t".'if ($debut_boucle === false) {'."\n"
67                        //."\t\t\t".'include_spip("public/iterateur");'
68                        ."\t\t\t".'$iter = IterFactory::create("EmptyIterator", array());' . "\n"
69                ."\t\t} else {\n"
70                        // si on a des resultats, il faut remettre le compteur a zero.
71                        ."\t\t\t".'$iter->seek(0);' . "\n"
72
73                        // donner un bon GRAND_TOTAL pour la fonction calculer_parties()
74                        // NAN ça marche pas non plus... mah que passa ?
75                        //."\t\t\t"."\$Numrows['$idb']['total'] = (\$Numrows['$idb']['total'] >= 1 ? 2 : 0);\n"
76                ."\t\t}\n"
77                ."\t}\n"
78                ."\t".'$debut_boucle = intval($debut_boucle)';
79
80
81        $boucle->total_parties = 1;
82        calculer_parties($boucles, $idb, $partie, '++');
83       
84        // ajouter la cle primaire dans le select
85        // sauf si pas de primaire, ou si primaire composee
86        // dans ce cas, on ne sait pas gerer une pagination indirecte
87        // : il faut id_xx dans le select pour la fonction quete_position_primary()
88        $t = $boucle->id_table . '.' . $primary;
89        if ($boucle->primary
90                AND !preg_match('/[,\s]/',$primary)
91                AND !in_array($t, $boucle->select)) {
92          $boucle->select[]= $t;
93        }
94
95        // forcer le compilo à ne pas prendre en static a cause du $where fluctuant
96        $boucle->where[]= array("'='","'1'","sql_quote(1)");
97         
98}
99
100
101
102// $trouver : suivant / precedent / (toute autre valeur retourne la position courante de l'id demande.
103function quete_iterateur_position_primary($primary, $valeur, $trouver, $iter){
104        // on ne devrait pas arriver ici si la cle primaire est inexistante
105        // ou composee, mais verifions
106        if (!$primary OR preg_match('/[,\s]/', $primary))
107                return false;
108
109        $pos = 0;
110        while ($row = $iter->fetch() AND $row[$primary]!=$valeur){
111                $pos++;
112        }
113
114        // si on a pas trouve
115        if ($row[$primary]!=$valeur)
116                return false;
117
118        // precedent : prendre la position moins 1
119        if ($trouver == 'precedent') {
120                if ($pos) {
121                        return ($pos - 1);
122                }
123                return false;
124        }
125       
126        // suivant : tester l'existence d'un suivant
127        if ($trouver == 'suivant') {
128                if ($row = $iter->fetch()) {
129                        return ($pos + 1);
130                }
131                return false;
132        }
133       
134        // sinon, retourner la position de la ligne contenant l'enregistrement demande
135        return $pos;
136}
137
138
139
140
141
142
143
144/* ==================================================
145 *
146 *              Ancienne ecriture (avant les iterateurs)
147 *
148 */
149
150
151
152/**
153 * Calcul des critères {suivant} et {precedent} (avant l'existence d'Iterateurs).
154 * On reprend en grande partie le fonctionnement de {pagination} avec debut_xx=@yy
155 * en jouant de sql_seek pour se déplacer à la bonne position sur les résultats de
156 * la boucle.
157 *
158 * @param string $type  type de décalage : 'suivant' ou 'precedent'
159**/
160function calculer_critere_suivant_precedent_dist($idb, &$boucles, $crit, $type) {
161        $boucle = &$boucles[$idb];
162        $primary = $boucle->primary;
163       
164        $arg = kwote(calculer_argument_precedent($idb, $primary, $boucles));
165
166        $partie =
167                 "0;\n"
168                ."\tif (\$id_actuel = $arg) {\n"
169                ."\t\t".'$debut_boucle = quete_position_primary(\''.$primary.'\', $id_actuel, "'.$type.'", $result, '._q($boucle->sql_serveur).');'."\n"
170                // pas de resultat, on cree une selection vide
171                ."\t\t".'if ($debut_boucle === false){'."\n"
172                        ."\t\t\t".'@sql_free($result,'._q($boucle->sql_serveur).");\n"
173                        ."\t\t\t"."\$where[] = array('=','0','1');\n" // forcer 0 resultat
174                        ."\t\t\t".'$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'."\n"
175                        //."\t\t\t"."\$Numrows['$idb']['total'] = 0;\n"
176                ."\t\t} else {\n"
177                        // si on a des resultats, il faut remettre le compteur a zero.
178                        ."\t\t".'if (!sql_seek($result,0,'._q($boucle->sql_serveur).")){\n"
179                        ."\t\t\t".'@sql_free($result,'._q($boucle->sql_serveur).");\n"
180                        ."\t\t\t".'$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'."\n"
181                        ."\t\t}\n"
182                        // donner un bon GRAND_TOTAL pour la fonction calculer_parties()
183                        // NAN ça marche pas non plus... mah que passa ?
184                        //."\t\t\t"."\$Numrows['$idb']['total'] = (\$Numrows['$idb']['total'] >= 1 ? 2 : 0);\n"
185                ."\t\t}\n"
186                ."\t}\n"
187                ."\t".'$debut_boucle = intval($debut_boucle)';
188
189
190        $boucle->total_parties = 1;
191        calculer_parties($boucles, $idb, $partie, '++');
192       
193        // ajouter la cle primaire dans le select
194        // sauf si pas de primaire, ou si primaire composee
195        // dans ce cas, on ne sait pas gerer une pagination indirecte
196        // : il faut id_xx dans le select pour la fonction quete_position_primary()
197        $t = $boucle->id_table . '.' . $primary;
198        if ($boucle->primary
199                AND !preg_match('/[,\s]/',$primary)
200                AND !in_array($t, $boucle->select)) {
201          $boucle->select[]= $t;
202        }
203
204        // forcer le compilo à ne pas prendre en static a cause du $where fluctuant
205        $boucle->where[]= array("'='","'1'","sql_quote(1)");
206         
207}
208
209
210// $trouver : suivant / precedent / (toute autre valeur retourne la position courante de l'id demande.
211function quete_position_primary($primary, $valeur, $trouver, $res, $serveur=''){
212        // on ne devrait pas arriver ici si la cle primaire est inexistante
213        // ou composee, mais verifions
214        if (!$primary OR preg_match('/[,\s]/', $primary))
215                return false;
216
217        $pos = 0;
218        while ($row = sql_fetch($res, $serveur) AND $row[$primary]!=$valeur){
219                $pos++;
220        }
221
222        // si on a pas trouve
223        if ($row[$primary]!=$valeur)
224                return false;
225
226        // precedent : prendre la position moins 1
227        if ($trouver == 'precedent') {
228                if ($pos) {
229                        return ($pos - 1);
230                }
231                return false;
232        }
233       
234        // suivant : tester l'existence d'un suivant
235        if ($trouver == 'suivant') {
236                if ($row = sql_fetch($res, $serveur)) {
237                        return ($pos + 1);
238                }
239                return false;
240        }
241       
242        // sinon, retourner la position de la ligne contenant l'enregistrement demande
243        return $pos;
244}
245?>
Note: See TracBrowser for help on using the repository browser.