Changeset 81455 in spip-zone


Ignore:
Timestamp:
Mar 18, 2014, 5:40:28 PM (5 years ago)
Author:
severo@…
Message:

tickets - ignorer {mots_pargroupe} si le tableau est vide

Le '?' est ignoré si présent dans le critère.
Par ailleurs, on peut écrire {mots_pargroupe} ou
{mots_pargroupe #GET{mots_pargroupe}}, et dans chacun des
cas, si #ENV{mots_pargroupe} ou #GET{mots_pargroupe} est
vide, on ignore simplement le critère.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/tickets/trunk/tickets_fonctions.php

    r81384 r81455  
    314314}
    315315
    316 // Critere {mots_pargroupe} : "l'article est lie a au moins un mot de tous les groupes demandes"
    317 // {mots?} ne s'applique que si au moins un mot est demande
     316// Critere {mots_pargroupe} : "l'article est lie a au moins un mot de chacun des groupes demandes"
     317// Ne s'applique que si au moins un mot est demande (si le tableau est vide, on ignore le critère)
     318// On ignore la présence de '?' dans le critère
    318319/*
    319320 * ATTENTION, c'est un peu en cours de dev, il faudrait :
     
    327328        $boucle = &$boucles[$idb];
    328329
    329         if (isset($crit->param[0][0])) {
    330                 $mots = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucles[$idb]->id_parent);
     330        // On ne prend pas en compte '?' mais on s'assure de récupérer le paramètre suivant s'il existe
     331        // le cas problématique : {mots_pargroupe ? #GET{tableau}}
     332        $num_param=0;
     333        if ($crit->cond && isset($crit->param[0][0]) && $crit->param[0][0]->type==='texte' && trim($crit->param[0][0]->texte)==='') {
     334                $num_param=1;
     335        }
     336        if (isset($crit->param[0][$num_param])) {
     337                $mots = calculer_liste(array($crit->param[0][$num_param]), array(), $boucles, $boucles[$idb]->id_parent);
    331338        } else{
    332339                $mots = '@$Pile[0]["mots"]';
    333340        }
     341
     342        $boucle->hash .= '
     343        // {MOTS}
     344        $prepare_mots_pargroupe = charger_fonction(\'prepare_mots_pargroupe\', \'inc\');
     345        $mots_where = $prepare_mots_pargroupe('.$mots.');
     346        ';
    334347
    335348        $t = $boucle->id_table . '.' . $boucle->primary;
    336349        if (!in_array($t, $boucles[$idb]->select))
    337350          $boucle->select[]= $t; # pour postgres, neuneu ici
     351
     352        $boucle->where[] = "\n\t\t".'$mots_where';
     353}
     354function inc_prepare_mots_pargroupe_dist($mots) {
     355
     356        // Si le tableau $mots est vide, on ignore le critère
     357        if (!is_array($mots)
     358        OR !$mots = array_filter($mots)) {
     359                return '';
     360        }
    338361
    339362        /* On calcule la liste des groupes
     
    344367         * GROUP BY id_groupe
    345368         */
    346         $groupes = "'('.sql_get_select('id_groupe','spip_mots',sql_in('id_mot',".$mots."),'id_groupe').') AS g'";
     369        $groupes = '('.sql_get_select('id_groupe','spip_mots',sql_in('id_mot',$mots),'id_groupe').') AS g';
    347370
    348371        /* Maintenant le nombre de groupes
     
    351374         * FROM ($groupes) AS nb
    352375         */
    353         $nb_groupes = "('.sql_get_select('COUNT(id_groupe)',".$groupes.").')";
     376        $nb_groupes = '('.sql_get_select('COUNT(id_groupe)',$groupes).')';
    354377
    355378        /* Maintenant les doublets (id_objet,id_groupe)
     
    365388         * GROUP BY ml.id_objet,ml.objet,m.id_groupe
    366389         */
    367         $doublets = "'('.sql_get_select('id_objet,id_groupe','spip_mots_liens JOIN spip_mots USING (id_mot)','objet=\'ticket\' AND '.sql_in('id_mot',".$mots."),'id_objet,objet,id_groupe').') AS d'";
     390        $doublets = '('.sql_get_select('id_objet,id_groupe','spip_mots_liens JOIN spip_mots USING (id_mot)','objet=\'ticket\' AND '.sql_in('id_mot',$mots),'id_objet,objet,id_groupe').') AS d';
    368391
    369392        /* Enfin, la boucle complete
     
    388411         * )
    389412         */
    390         $where = "sql_get_select('id_objet',".$doublets.",'','id_objet','','','SUM(1) >= ".$nb_groupes."')";
     413        $where = sql_get_select('id_objet',$doublets,'','id_objet','','','SUM(1) >= '.$nb_groupes);
    391414
    392415        /* On ajoute ce critère à la boucle (TICKETS)
    393416         *
    394417         */
    395         $boucle->where[] = "sql_in('id_ticket', ".$where.")";
    396 
    397 }
    398 
     418        return sql_in('id_ticket', $where);
     419
     420}
    399421?>
Note: See TracChangeset for help on using the changeset viewer.