source: spip-zone/_plugins_/mnogosearch/mnogo_mes_options.php @ 28930

Last change on this file since 28930 was 17421, checked in by cedric@…, 14 years ago

prendre en compte le parametre g pour restreindre la recherche a la langue voulue

File size: 7.4 KB
Line 
1<?php
2define('_MNOGO_LOCAL_CACHE_DELAI',86400);
3
4//
5// <BOUCLE(DOCUMENTS)>
6//
7function boucle_MNOGOSEARCH_dist($id_boucle, &$boucles) {
8        $boucle = &$boucles[$id_boucle];
9        $id_table = $boucle->id_table;
10        $boucle->from[$id_table] =  "spip_mnogosearch";
11        $boucle->select[] = "$id_table.numero";
12        $boucle->select[] = "$id_table.points";
13        // Ne pas executer la requete en cas de hash vide
14        $boucle->hash = "
15        // RECHERCHE
16        \$liste_args = \$Pile[0];
17        \$liste_args['recherche'] = ".$boucle->modificateur['recherche'].";"
18        . ((isset($boucle->modificateur['groupbysite']) && $boucle->modificateur['groupbysite'])?"
19        \$liste_args['GroupBySite']='yes';
20        ":"")
21        . ((isset($boucle->modificateur['ul']))?"
22        \$liste_args['site']= ".$boucle->modificateur['site'].";
23        ":"")
24        . ((isset($boucle->modificateur['tri']))?"
25        \$liste_args['s']= ".$boucle->modificateur['tri'].";
26        ":"")
27        . ((isset($boucle->modificateur['section']))?"
28        \$liste_args['su']= ".$boucle->modificateur['section'].";
29        ":"")
30        . ((isset($boucle->modificateur['recherche_sections']))?"
31        \$liste_args['wf']= ".$boucle->modificateur['recherche_sections'].";
32        ":"")
33        . "mnogo_checkresults(\$liste_args['recherche'],\$debut_boucle,\$fin_boucle-\$debut_boucle+1, \$liste_args);
34        \$rech_where = hash_where(\$liste_args['recherche'],\$liste_args);
35                ";
36        $out = calculer_boucle($id_boucle, $boucles);
37        $out = str_replace("\$Numrows['$id_boucle']['compteur_boucle']++;","\$Numrows['$id_boucle']['compteur_boucle']=\$Pile[\$SP]['numero'];",$out);
38
39        $partition = calculer_parties($boucles,$id_boucle);
40
41        $partition1 = preg_replace('/(\$nombre_boucle =).*?;/','\\1 10000;',$partition);
42        $partition_cor = preg_replace('/(\$nombre_boucle =).*?;/',"\\1 \$GLOBALS['mnogo_resultats_synthese']['MNOGO_TOTAL'];",$partition);
43        $partition_cor .= "
44        \$Numrows['$id_boucle']['grand_total']=\$GLOBALS['mnogo_resultats_synthese']['MNOGO_TOTAL'];";
45       
46        $out = $partition1 . str_replace($partition,$partition_cor,$out);
47        return $out;
48}
49
50// {recherche}
51// http://www.spip.net/@recherche
52// gestion du cas ou le critere recherche est applique a la boucle MNOGOSEARCH
53// sinon renvoi vers la boucle _dist
54function critere_recherche($idb, &$boucles, $crit) {
55        global $table_des_tables;
56        $boucle = &$boucles[$idb];
57        if ($boucle->id_table=='mnogosearch'){
58                if (isset($crit->param[0]))
59                        $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
60                else
61                        $quoi = '@$Pile[0]["recherche"]';
62                $boucle->modificateur['recherche'] = $quoi;
63                // le hash sera mis dans la fonction boucle en tenant compte d'eventuels autres modificateurs
64                // et la recherche trouve
65                $boucle->where[] = '$rech_where';
66                $boucle->order[] = 'numero';
67        }
68        else
69                critere_recherche_dist($idb, $boucles, $crit);
70}
71
72function critere_groupbysite_dist($idb, &$boucles, $crit) {
73        global $table_des_tables;
74        $boucle = &$boucles[$idb];
75        if ($boucle->id_table=='mnogosearch'){
76                $boucle->modificateur['groupbysite'] = true;
77        }
78}
79function critere_sur_le_site_dist($idb, &$boucles, $crit) {
80        global $table_des_tables;
81        $boucle = &$boucles[$idb];
82        if ($boucle->id_table=='mnogosearch'){
83                if (isset($crit->param[0])){
84                        $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
85                        $boucle->modificateur['ul'] = $quoi;
86                }
87        }
88}
89function critere_tri_dist($idb, &$boucles, $crit) {
90        global $table_des_tables;
91        $boucle = &$boucles[$idb];
92        if ($boucle->id_table=='mnogosearch'){
93                if (isset($crit->param[0])){
94                        $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
95                        $boucle->modificateur['tri'] = $quoi;
96                }
97        }
98}
99function critere_section_dist($idb, &$boucles, $crit) {
100        global $table_des_tables;
101        $boucle = &$boucles[$idb];
102        if ($boucle->id_table=='mnogosearch'){
103                if (isset($crit->param[0])){
104                        $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
105                        $boucle->modificateur['section'] = $quoi;
106                }
107        }
108}
109function critere_recherche_sections_dist($idb, &$boucles, $crit) {
110        global $table_des_tables;
111        $boucle = &$boucles[$idb];
112        if ($boucle->id_table=='mnogosearch'){
113                if (isset($crit->param[0])){
114                        $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
115                        $boucle->modificateur['recherche_sections'] = $quoi;
116                }
117        }
118}
119
120
121function mnogo_querystring($recherche,$debut,$nombre, $c=false){
122        $default_qs=array('q'=>'','m'=>'bool','wm'=>'wrd','sp'=>1,'sy'=>1,'wf'=>'2221','type'=>'','ul'=>'','fmt'=>'xml','np'=>0,'ps'=>10,'GroupBySite'=>'no','g'=>'fr');
123        $key_translate = array('recherche'=>'q','site'=>'ul');
124        if (isset($GLOBALS['mnogosearch_default_qs']))
125                $default_qs = $GLOBALS['mnogosearch_default_qs'];
126
127        $key_translate = array_flip($key_translate);
128        foreach($default_qs as $key=>$value){
129                $k = $key;
130                if (isset($key_translate[$key]))
131                        $k = $key_translate[$key];
132                if (($value = _request($k,$c))!==NULL)
133                        $default_qs[$key] = $value;
134        }
135        $default_qs['fmt'] = 'xml'; // obligatoire
136        // remplacer les operateurs ET,AND,OR,OU par leur forme & |
137        $default_qs['q'] = urlencode(mnogo_formate_recherche(urldecode($recherche)));
138       
139        // gerer les pages
140        $default_qs['ps'] = max(100,$nombre);
141        $default_qs['np'] = (int)floor($debut/$default_qs['ps']);
142
143        $req = "";
144        foreach($default_qs as $key=>$value)
145                $default_qs[$key]=$key."=".$value;
146        return implode("&",$default_qs);
147}
148
149function mnogo_formate_recherche($recherche){
150        $recherche = trim($recherche);
151        $recherche = preg_replace(',\s(ET|AND)\s,',' & ',$recherche);
152        $recherche = preg_replace(',\s(OU|OR)\s,',' | ',$recherche);
153        $recherche = preg_replace(',\s(PAS|NOT)\s,',' ~ ',$recherche);
154        $recherche = preg_replace(',\s(?=\s),','',$recherche);
155        return $recherche;
156}
157
158function mnogo_hash($recherche=NULL, $c=false){
159        if ($recherche==NULL) $recherche = _request('recherche',$c);
160        $query = mnogo_querystring($recherche, 0,10, $c);
161        $h = substr(md5($query), 0, 16);
162        return $h;
163}
164function hash_where($recherche=NULL, $c=false){
165        $h = mnogo_hash($recherche, $c);
166       
167        // Attention en MySQL 3.x il faut passer par HEX(hash)
168        // alors qu'en MySQL 4.1 c'est interdit !
169        $vers = spip_query("SELECT VERSION() AS v");
170        $vers = spip_fetch_array($vers);
171        if (version_compare($vers['v'],'4.1.12','>='))
172                return "hash=0x$h";
173        else
174                return  "(HEX(hash)='$h' OR hash=0x$h)";
175}
176
177function mnogo_checkresults($recherche, $debut, $nombre, $c=false){
178        if ($recherche!==NULL){
179                $hashwhere = hash_where($recherche, $c);
180                $res = spip_query("SELECT * FROM spip_mnogosearch_summary WHERE $hashwhere");
181                // verifier que cette recherche a deja ete faite
182                $refresh = true;
183                if ($row = spip_fetch_array($res)){
184                        if (time()-strtotime($row['maj'])<_MNOGO_LOCAL_CACHE_DELAI)
185                                $refresh = false;
186                }
187                // si oui, verifier que les resultats en memoire correspondent
188                if (!$refresh){
189                        $res = spip_query("SELECT numero FROM spip_mnogosearch WHERE numero>=".spip_abstract_quote($debut)
190                        ." AND numero<=".spip_abstract_quote(min($debut+$nombre,$row['total']))." AND valide='oui' AND $hashwhere");
191                        if (spip_num_rows($res)<$nombre)
192                                $refresh = true;
193                }
194                if ($refresh){
195                        include_spip('inc/mnogo_distant');
196                        mnogo_getresults($recherche,$debut,$nombre, $c);
197                        $res = spip_query("SELECT * FROM spip_mnogosearch_summary WHERE $hashwhere");
198                        $row = spip_fetch_array($res);
199                }
200                $GLOBALS['mnogo_resultats_synthese']['MNOGO_RESUME_RESULTATS'] = $row['resume_resultats'];
201                $GLOBALS['mnogo_resultats_synthese']['MNOGO_TOTAL'] = $row['total'];
202        }
203        else{
204                $GLOBALS['mnogo_resultats_synthese']['MNOGO_RESUME_RESULTATS'] = '';
205                $GLOBALS['mnogo_resultats_synthese']['MNOGO_TOTAL'] = '';
206        }
207        return true;
208}
209?>
Note: See TracBrowser for help on using the repository browser.