Changeset 43281 in spip-zone


Ignore:
Timestamp:
Dec 31, 2010, 6:43:46 PM (10 years ago)
Author:
marcimat@…
Message:

Faire fonctionner {suivant} et {precedent} avec les Itérateurs également !

Location:
_plugins_/criteres_suivant_precedent
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/criteres_suivant_precedent/plugin.xml

    r41485 r43281  
    77        </nom>
    88       
    9         <version>1.1.1</version>
     9        <version>1.2</version>
    1010       
    1111        <etat>test</etat>
  • _plugins_/criteres_suivant_precedent/public/csp_criteres.php

    r39268 r43281  
    88if (!defined("_ECRIRE_INC_VERSION")) return;
    99
    10 
     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**/
    1124function 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**/
    1537function 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
    1846
    1947/**
    2048 * 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).
    21154 * On reprend en grande partie le fonctionnement de {pagination} avec debut_xx=@yy
    22155 * 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.