09824164 |
1 | <?php |
2 | /*************************************************************************** |
5ddeb07c |
3 | * Copyright (C) 2003-2007 Polytechnique.org * |
09824164 |
4 | * http://opensource.polytechnique.org/ * |
5 | * * |
6 | * This program is free software; you can redistribute it and/or modify * |
7 | * it under the terms of the GNU General Public License as published by * |
8 | * the Free Software Foundation; either version 2 of the License, or * |
9 | * (at your option) any later version. * |
10 | * * |
11 | * This program is distributed in the hope that it will be useful, * |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
14 | * GNU General Public License for more details. * |
15 | * * |
16 | * You should have received a copy of the GNU General Public License * |
17 | * along with this program; if not, write to the Free Software * |
18 | * Foundation, Inc., * |
19 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * |
20 | ***************************************************************************/ |
21 | |
22 | class SearchModule extends PLModule |
23 | { |
24 | function handlers() |
25 | { |
26 | return array( |
27 | 'search' => $this->make_hook('quick', AUTH_PUBLIC), |
28 | 'search/adv' => $this->make_hook('advanced', AUTH_COOKIE), |
9ed396c0 |
29 | 'search/ajax/region' => $this->make_hook('region', AUTH_COOKIE, 'user', NO_AUTH), |
30 | 'search/ajax/grade' => $this->make_hook('grade', AUTH_COOKIE, 'user', NO_AUTH), |
ba2afb88 |
31 | 'advanced_search.php' => $this->make_hook('redir_advanced', AUTH_PUBLIC), |
2ab7a09f |
32 | 'search/autocomplete' => $this->make_hook('autocomplete', AUTH_COOKIE, 'user', NO_AUTH), |
33 | 'search/list' => $this->make_hook('list', AUTH_COOKIE, 'user', NO_AUTH), |
09824164 |
34 | ); |
35 | } |
36 | |
ba2afb88 |
37 | function handler_redir_advanced(&$page, $mode = null) |
38 | { |
39 | pl_redirect('search/adv'); |
40 | exit; |
41 | } |
42 | |
8d8f7607 |
43 | function on_subscribe($forlife, $uid, $promo, $pass) |
44 | { |
45 | require_once 'user.func.inc.php'; |
46 | user_reindex($uid); |
47 | } |
48 | |
09824164 |
49 | |
50 | function form_prepare() |
51 | { |
d25e0f0b |
52 | global $page; |
53 | |
09824164 |
54 | $page->assign('formulaire',1); |
09824164 |
55 | $page->assign('choix_schools', |
08cce2ff |
56 | XDB::iterator('SELECT id,text FROM applis_def ORDER BY text')); |
3c640222 |
57 | $this->get_diplomas(); |
58 | } |
59 | |
60 | function get_diplomas($school = null) |
61 | { |
62 | if (is_null($school) && Env::has('school')) { |
63 | $school = Env::i('school'); |
64 | } |
09824164 |
65 | |
3c640222 |
66 | if (!is_null($school)) { |
67 | $sql = 'SELECT type FROM applis_def WHERE id=' . $school; |
09824164 |
68 | } else { |
69 | $sql = 'DESCRIBE applis_def type'; |
70 | } |
71 | |
08cce2ff |
72 | $res = XDB::query($sql); |
09824164 |
73 | $row = $res->fetchOneRow(); |
3c640222 |
74 | if (!is_null($school)) { |
09824164 |
75 | $types = $row[0]; |
76 | } else { |
77 | $types = explode('(',$row[1]); |
78 | $types = str_replace("'","",substr($types[1],0,-1)); |
79 | } |
3c640222 |
80 | global $page; |
09824164 |
81 | $page->assign('choix_diplomas', explode(',',$types)); |
82 | } |
83 | |
8c4a0c30 |
84 | function handler_quick(&$page, $action = null, $subaction = null) |
09824164 |
85 | { |
86 | global $globals; |
87 | |
8c4a0c30 |
88 | if (Env::has('quick') || $action == 'geoloc') { |
09824164 |
89 | $page->assign('formulaire', 0); |
90 | |
8c4a0c30 |
91 | require_once 'userset.inc.php'; |
92 | $view = new SearchSet(true, $action == 'geoloc' && substr($subaction, -3) == 'swf'); |
35fa92e8 |
93 | $view->addMod('minifiche', 'Minifiches', true, array('with_score' => true)); |
94 | if (S::logged() && !Env::i('nonins')) { |
95 | $view->addMod('trombi', 'Trombinoscope', false, array('with_promo' => true, 'with_score' => true)); |
96 | $view->addMod('geoloc', 'Planisphère'); |
97 | } |
8c4a0c30 |
98 | $view->apply('search', $page, $action, $subaction); |
09824164 |
99 | |
8c4a0c30 |
100 | $nb_tot = $view->count(); |
101 | if ($subaction) { |
102 | return; |
103 | } |
cab08090 |
104 | if (!S::logged() && $nb_tot > $globals->search->public_max) { |
a7de4ef7 |
105 | new ThrowError('Votre recherche a généré trop de résultats pour un affichage public.'); |
09824164 |
106 | } elseif ($nb_tot > $globals->search->private_max) { |
a7de4ef7 |
107 | new ThrowError('Recherche trop générale'); |
09824164 |
108 | } elseif (empty($nb_tot)) { |
a7de4ef7 |
109 | new ThrowError('il n\'existe personne correspondant à ces critères dans la base !'); |
09824164 |
110 | } |
111 | } else { |
70a55e68 |
112 | $res = XDB::query("SELECT MIN(diminutif), MAX(diminutif) |
113 | FROM groupex.asso |
114 | WHERE cat = 'Promotions'"); |
115 | list($min, $max) = $res->fetchOneRow(); |
116 | $page->assign('promo_min', $min); |
117 | $page->assign('promo_max', $max); |
09824164 |
118 | $page->assign('formulaire',1); |
e654517d |
119 | $page->addJsLink('ajax.js'); |
09824164 |
120 | } |
121 | |
90ccb062 |
122 | require_once dirname(__FILE__) . '/search/search.inc.php'; |
8c4a0c30 |
123 | $page->changeTpl('search/index.tpl'); |
124 | $page->assign('xorg_title','Polytechnique.org - Annuaire'); |
125 | $page->assign('baseurl', $globals->baseurl); |
90ccb062 |
126 | $page->register_modifier('display_lines', 'display_lines'); |
09824164 |
127 | } |
128 | |
90ccb062 |
129 | function handler_advanced(&$page, $action = null, $subaction = null) |
09824164 |
130 | { |
131 | global $globals; |
bc67c37c |
132 | require_once 'geoloc.inc.php'; |
133 | require_once dirname(__FILE__) . '/search/search.inc.php'; |
134 | $page->assign('advanced',1); |
135 | |
90ccb062 |
136 | if (!Env::has('rechercher') && $action != 'geoloc') { |
09824164 |
137 | $this->form_prepare(); |
138 | } else { |
8c4a0c30 |
139 | require_once 'userset.inc.php'; |
140 | $view = new SearchSet(false, $action == 'geoloc' && substr($subaction, -3) == 'swf'); |
141 | $view->addMod('minifiche', 'Minifiches', true); |
35fa92e8 |
142 | $view->addMod('trombi', 'Trombinoscope', false, array('with_promo' => true)); |
8c4a0c30 |
143 | $view->addMod('geoloc', 'Planishpère'); |
144 | $view->apply('search', $page, $action, $subaction); |
145 | |
146 | if ($subaction) { |
147 | return; |
09824164 |
148 | } |
8c4a0c30 |
149 | $nb_tot = $view->count(); |
09824164 |
150 | if ($nb_tot > $globals->search->private_max) { |
151 | $this->form_prepare(); |
a7de4ef7 |
152 | new ThrowError('Recherche trop générale'); |
09824164 |
153 | } |
09824164 |
154 | } |
155 | |
90ccb062 |
156 | $page->changeTpl('search/index.tpl', $action == 'mini' ? SIMPLE : SKINNED); |
3c640222 |
157 | $page->addJsLink('ajax.js'); |
8c4a0c30 |
158 | $page->assign('public_directory',0); |
90ccb062 |
159 | $page->register_modifier('display_lines', 'display_lines'); |
09824164 |
160 | } |
3c640222 |
161 | |
162 | function handler_region(&$page, $country = null) |
163 | { |
493b6abe |
164 | header('Content-Type: text/html; charset="UTF-8"'); |
3c640222 |
165 | require_once("geoloc.inc.php"); |
166 | $page->ChangeTpl('search/adv.region.form.tpl', NO_SKIN); |
167 | $page->assign('region', ""); |
168 | $page->assign('country', $country); |
169 | } |
170 | |
171 | function handler_grade(&$page, $school = null) |
172 | { |
493b6abe |
173 | header('Content-Type: text/html; charset="UTF-8"'); |
3c640222 |
174 | $page->ChangeTpl('search/adv.grade.form.tpl', NO_SKIN); |
175 | $page->assign('grade', ''); |
176 | $this->get_diplomas($school); |
177 | } |
838cc16a |
178 | |
179 | function handler_autocomplete(&$page, $type = null) |
180 | { |
181 | // Autocompletion : according to type required, return |
182 | // a list of results matching with the number of matches. |
183 | // The output format is : |
184 | // result1|nb1 |
185 | // result2|nb2 |
186 | // ... |
187 | header('Content-Type: text/plain; charset="UTF-8"'); |
c15afc4e |
188 | $q = preg_replace('/\*+$/','',$_REQUEST['q']); |
838cc16a |
189 | if (!$q) exit(); |
c15afc4e |
190 | |
191 | // try to look in cached results |
192 | $cache = XDB::query('SELECT result FROM search_autocomplete WHERE name = {?} AND query = {?} AND generated > NOW() - INTERVAL 1 DAY', |
193 | $type, $q); |
194 | if ($res = $cache->fetchOneCell()) { |
195 | echo $res; |
196 | die(); |
197 | } |
198 | |
2ab7a09f |
199 | // default search |
838cc16a |
200 | $unique = 'user_id'; |
201 | $db = 'auth_user_md5'; |
2ab7a09f |
202 | $realid = false; |
203 | $contains = false; |
204 | |
838cc16a |
205 | switch ($type) { |
2ab7a09f |
206 | case 'binetTxt': |
207 | $db = 'binets_def INNER JOIN binets_ins ON(binets_def.id = binets_ins.binet_id)'; |
208 | $field='binets_def.text'; |
209 | if (strlen($q) > 2) |
210 | $contains = true; |
211 | $realid = 'binets_def.id'; |
212 | break; |
213 | case 'city': $db = 'geoloc_city INNER JOIN adresses ON(geoloc_city.id = adresses.cityid)'; $unique='uid'; $field='geoloc_city.name'; break; |
214 | case 'entreprise': $db = 'entreprises'; $field = 'entreprise'; $unique='uid'; break; |
838cc16a |
215 | case 'firstname': $field = 'prenom'; break; |
2ab7a09f |
216 | case 'fonctionTxt': |
217 | $db = 'fonctions_def INNER JOIN entreprises ON(entreprises.fonction = fonctions_def.id)'; |
218 | $field = 'fonction_fr'; |
219 | $unique = 'uid'; |
220 | $realid = 'fonctions_def.id'; |
221 | break; |
222 | case 'groupexTxt': |
223 | $db = 'groupesx_def INNER JOIN groupesx_ins ON(groupesx_def.id = groupesx_ins.gid)'; |
224 | $field='groupesx_def.text'; |
225 | if (strlen($q) > 2) |
226 | $contains = true; |
227 | $realid = 'groupesx_def.id'; |
228 | $unique = 'guid'; |
229 | break; |
838cc16a |
230 | case 'name': $field = 'nom'; break; |
2ab7a09f |
231 | case 'nationaliteTxt': |
232 | $db = 'geoloc_pays INNER JOIN auth_user_md5 ON(geoloc_pays.a2 = auth_user_md5.nationalite)'; |
233 | $field = 'IF(geoloc_pays.nat=\'\', geoloc_pays.pays, geoloc_pays.nat)'; |
234 | $realid = 'geoloc_pays.a2'; |
235 | break; |
baa8a594 |
236 | case 'nickname': $field = 'profile_nick'; $db = 'auth_user_quick'; break; |
df87518a |
237 | case 'poste': $db = 'entreprises'; $field = 'poste'; $unique='uid'; break; |
2ab7a09f |
238 | case 'secteurTxt': |
239 | $db = 'emploi_secteur INNER JOIN entreprises ON(entreprises.secteur = emploi_secteur.id)'; |
240 | $field = 'emploi_secteur.label'; |
241 | $realid = 'emploi_secteur.id'; |
242 | $unique = 'uid'; |
243 | break; |
244 | case 'sectionTxt': |
245 | $db = 'sections INNER JOIN auth_user_md5 ON(auth_user_md5.section = sections.id)'; |
246 | $field = 'sections.text'; |
247 | $realid = 'sections.id'; |
248 | break; |
838cc16a |
249 | default: exit(); |
250 | } |
251 | |
2ab7a09f |
252 | $list = XDB::iterator(' |
253 | SELECT |
254 | '.$field.' AS field, |
255 | COUNT(DISTINCT '.$unique.') AS nb |
256 | '.($realid?(', '.$realid.' AS id'):'').' |
257 | FROM '.$db.' |
258 | WHERE '.$field.' LIKE {?} |
259 | GROUP BY '.$field.' |
260 | ORDER BY nb DESC |
261 | LIMIT 11', |
262 | ($contains?'%':'').str_replace('*','%',$q).'%'); |
838cc16a |
263 | $nbResults = 0; |
c15afc4e |
264 | $res = ""; |
2ab7a09f |
265 | while ($result = $list->next()) { |
838cc16a |
266 | $nbResults++; |
267 | if ($nbResults == 11) { |
c15afc4e |
268 | $res .= '...|1'."\n"; |
838cc16a |
269 | } else { |
c15afc4e |
270 | $res .= $result['field'].'|'.$result['nb'].(isset($result['id'])?('|'.$result['id']):'')."\n"; |
838cc16a |
271 | } |
272 | } |
c15afc4e |
273 | XDB::query('REPLACE INTO search_autocomplete VALUES ({?}, {?}, {?}, NOW())', |
274 | $type, $q, $res); |
275 | echo $res; |
838cc16a |
276 | exit(); |
277 | } |
2ab7a09f |
278 | |
279 | function handler_list(&$page, $type = null, $idVal = null) |
280 | { |
281 | // Give the list of all values possible of type and builds a select input for it |
282 | $field = 'text'; |
283 | $id = 'id'; |
284 | switch ($type) { |
285 | case 'binet': |
286 | $db = 'binets_def'; |
287 | break; |
288 | case 'fonction': |
289 | $db = 'fonctions_def'; |
290 | $field = 'fonction_fr'; |
291 | break; |
292 | case 'groupex': |
293 | $db = 'groupesx_def'; |
294 | break; |
295 | case 'nationalite': |
296 | $db = 'geoloc_pays'; |
297 | $field = 'IF(nat=\'\', pays, nat)'; |
298 | $id = 'a2'; |
299 | break; |
300 | case 'section': |
301 | $db = 'sections'; |
302 | break; |
303 | case 'secteur': |
304 | $db = 'emploi_secteur'; |
305 | $field = 'label'; |
306 | break; |
307 | default: exit(); |
308 | } |
309 | if (isset($idVal)) { |
310 | header('Content-Type: text/plain; charset="UTF-8"'); |
311 | $result = XDB::query('SELECT '.$field.' AS field FROM '.$db.' WHERE '.$id.' = {?} LIMIT 1',$idVal); |
312 | echo $result->fetchOneCell(); |
313 | } else { |
314 | header('Content-Type: text/xml; charset="UTF-8"'); |
315 | $list = XDB::iterator(' |
316 | SELECT |
317 | '.$field.' AS field, |
318 | '.$id.' AS id |
319 | FROM '.$db.' |
320 | ORDER BY '.$field); |
321 | echo '<select name="'.$type.'">'; |
322 | while ($result = $list->next()) { |
323 | echo '<option value="'.$result['id'].'">'.htmlspecialchars($result['field']).'</option>'; |
324 | } |
325 | echo '</select>'; |
326 | } |
327 | |
328 | exit(); |
329 | } |
09824164 |
330 | } |
331 | |
a7de4ef7 |
332 | // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: |
09824164 |
333 | ?> |