source: spip-zone/_plugins_/critere_mots/trunk/critere_mots_fonctions.php @ 70134

Last change on this file since 70134 was 70134, checked in by maieul@…, 7 years ago

utiliser les api standards de correspondance objet<>table

File size: 4.1 KB
Line 
1<?php
2
3// Critere {mots} : "l'article est lie a tous les mots demandes"
4// {mots?} ne s'applique que si au moins un mot est demande
5// on passe dans l'url &mots[]=titre1&mots[]=titre2
6// et/ou &mots[]=11 etc
7// parametre optionnel : {mots score} ou score est un nombre entre 0 et 1
8// qui indique le pourcentage de mots a valider
9// ex: {mots? 0.66} selectionne tous les articles qui ont au moins 2/3
10// ou encore {mots score} qui indique le nombre de mots communs (par exemple 2) si score >= 1
11// ex: {mots 2} indique qu'il doit y avoir 2 mots communs
12// ou encore {mots 66%} indique qu'on doit avoir 66% de mot en commun (identique à {mots 0.66}
13// de mots en commun avec ceux demandes par le contexte (ou l'URL)
14// par defaut score=100% (tous les mots demandes doivent figurer)
15function critere_mots_dist($idb, &$boucles, $crit,$id_ou_titre=false) {
16
17        $boucle = &$boucles[$idb];
18
19        if (isset($crit->param[0][0])) {
20                $score = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucles[$idb]->id_parent);
21        } else{
22                $score = "'100%'";
23    }
24    if (isset($crit->param[0][1])){
25        $quoi = calculer_liste(array($crit->param[0][1]), array(), $boucles, $boucles[$idb]->id_parent);
26        }
27    else{
28        $quoi = '@$Pile[0]["mots"]';
29    }
30
31       
32        $boucle->hash .= '
33        // {MOTS}
34        $prepare_mots = charger_fonction(\'prepare_mots\', \'inc\');
35        $mots_where = $prepare_mots('.$quoi.', "'.$boucle->id_table.'", "'.$crit->cond.'", '.$score.', "' . $boucle->sql_serveur . '","'.$id_ou_titre.'");
36        ';
37
38        $t = $boucle->id_table . '.' . $boucle->primary;
39        if (!in_array($t, $boucles[$idb]->select))
40          $boucle->select[]= $t; # pour postgres, neuneu ici
41
42        $boucle->where[] = "\n\t\t".'$mots_where';
43
44}
45
46function critere_mots_selon_id_dist($idb, &$boucles, $crit){
47    critere_mots_dist($idb, $boucles, $crit,'id');
48}
49function critere_mots_selon_titre_dist($idb, &$boucles, $crit){
50    critere_mots_dist($idb, $boucles, $crit,'titre');
51}
52
53
54function inc_prepare_mots_dist($mots, $table='articles', $cond=false, $score, $serveur='',$id_ou_titre=false) {
55
56    $score = trim($score);
57        if (!is_array($mots)
58        OR !$mots = array_filter($mots)) {
59                // traiter le cas {mots?}
60                if ($cond)
61                        return '';
62                else
63                // {mots} mais pas de mot dans l'url
64                        return '0=1';
65        }
66
67
68    $_table = table_objet($table);
69    $objet_delatable=objet_type($_table);
70    //
71
72        $_id_table = id_table_objet($table);
73        $where = array();
74   
75    //selon le cas, on sélèctionne sur les titres ou sur les id
76    if (!$id_ou_titre){
77        foreach($mots as $mot) {
78            if (preg_match(',^[1-9][0-9]*$,', $mot))
79                $id_mot = $mot;
80            else
81                $id_mot = sql_getfetsel('id_mot', 'spip_mots', 'titre='.sql_quote($mot));
82            $where[] = 'id_mot='.sql_quote($id_mot).' and objet='.sql_quote($objet_delatable);
83        }
84    }
85        elseif($id_ou_titre == 'id'){
86           foreach($mots as $mot) {
87               $where[] = 'id_mot='.sql_quote($mot).' and objet='.sql_quote($objet_delatable);
88           }
89        }
90        elseif($id_ou_titre == 'titre'){
91           foreach($mots as $mot) {
92                $id_mot = sql_getfetsel('id_mot', 'spip_mots', 'titre='.sql_quote($mot));
93            $where[] = 'id_mot='.sql_quote($id_mot) .' and objet='.sql_quote($objet_delatable);
94           }
95        }
96       
97        // on analyse la jointure spip_mots_$_table
98        // sans regarder spip_mots ni les groupes
99        // (=> faire attention si on utilise les mots techniques)
100   
101        // si on a un % dans le score, c'est que c'est un %age
102        if (substr($score,-1)=='%'){
103       
104           $score = str_replace('%','',$score);
105           $having = ' HAVING SUM(1) >= '.ceil($score/100 * count($where)) ;
106        }
107        elseif ((0 < $score) and ($score < 1)){
108           $having = ' HAVING SUM(1) >= '.ceil($score * count($where)) ;
109        }
110        else{
111           $having = ' HAVING SUM(1) >= '. $score;
112           }
113       
114        $wh = "$_table.$_id_table IN (
115                SELECT id_objet FROM spip_mots_liens WHERE "
116                . join(' OR ', $where)
117                . ' GROUP BY id_objet,objet '
118                . $having
119                . "\n\t)";
120
121        return $wh;
122}
123
124
125function critere_mots_enleve_mot_de_liste($listemots, $id_mot) {
126        $listemots = array_unique($listemots);
127        while (array_search($id_mot,$listemots)!==false)
128                unset($listemots[array_search($id_mot,$listemots)]);
129        return $listemots;
130}
131
132?>
Note: See TracBrowser for help on using the repository browser.