Changeset 43281 in spip-zone
- Timestamp:
- Dec 31, 2010, 6:43:46 PM (10 years ago)
- Location:
- _plugins_/criteres_suivant_precedent
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/criteres_suivant_precedent/plugin.xml
r41485 r43281 7 7 </nom> 8 8 9 <version>1. 1.1</version>9 <version>1.2</version> 10 10 11 11 <etat>test</etat> -
_plugins_/criteres_suivant_precedent/public/csp_criteres.php
r39268 r43281 8 8 if (!defined("_ECRIRE_INC_VERSION")) return; 9 9 10 10 // tester la presence des iterateurs... 11 if (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 **/ 11 24 function critere_suivant_dist($idb, &$boucles, $crit) { 12 calculer_critere_suivant_precedent_dist($idb, $boucles, $crit, 'suivant'); 13 } 14 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 **/ 15 37 function critere_precedent_dist($idb, &$boucles, $crit) { 16 calculer_critere_suivant_precedent_dist($idb, $boucles, $crit, 'precedent'); 17 } 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 18 46 19 47 /** 20 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 **/ 55 function 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. 103 function 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). 21 154 * On reprend en grande partie le fonctionnement de {pagination} avec debut_xx=@yy 22 155 * en jouant de sql_seek pour se déplacer à la bonne position sur les résultats de
Note: See TracChangeset
for help on using the changeset viewer.