Merge remote branch 'origin/platal-0.10.2'
[platal.git] / include / userset.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2010 Polytechnique.org *
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 require_once('user.func.inc.php');
23
24 global $globals;
25
26 @$globals->search->result_where_statement = '
27 LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
28 LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
29 LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
30 LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
31 LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id)
32 LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
33 LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
34 LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2)
35 LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
36 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
37 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
38 LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = \'active\')';
39
40 class UserSet extends PlSet
41 {
42 public function __construct($joins = '', $where = '')
43 {
44 global $globals;
45 parent::__construct('auth_user_md5 AS u',
46 (!empty($GLOBALS['IS_XNET_SITE']) ?
47 'INNER JOIN #groupex#.membres AS gxm ON (u.user_id = gxm.uid
48 AND gxm.asso_id = ' . $globals->asso('id') . ') ' : '')
49 . 'LEFT JOIN auth_user_quick AS q USING (user_id)' . $joins,
50 $where,
51 'u.user_id');
52 }
53 }
54
55 class SearchSet extends UserSet
56 {
57 public $advanced = false;
58 private $score = null;
59 private $order = null;
60 private $quick = false;
61
62 public function __construct($quick = false, $no_search = false, $join = '', $where = '')
63 {
64 Platal::load('search', 'search.inc.php');
65 if ($no_search) {
66 return;
67 }
68
69 $this->quick = $quick;
70 if ($quick) {
71 $this->getQuick($join, $where);
72 } else {
73 $this->getAdvanced($join, $where);
74 }
75 }
76
77 private function getQuick($join, $where)
78 {
79 Platal::load('search', 'search.inc.php');
80 global $globals;
81 if (!S::logged()) {
82 Env::kill('with_soundex');
83 }
84 $qSearch = new QuickSearch('quick');
85 $fields = new SFieldGroup(true, array($qSearch));
86 if ($qSearch->isEmpty()) {
87 new ThrowError('Aucun critère de recherche n\'est spécifié.');
88 }
89 $this->score = $qSearch->get_score_statement();
90 $pwhere = $fields->get_where_statement();
91 if (trim($pwhere)) {
92 if (trim($where)) {
93 $where .= ' AND ';
94 }
95 $where .= $pwhere;
96 }
97 if (S::logged() && Env::has('nonins')) {
98 if (trim($where)) {
99 $where .= ' AND ';
100 }
101 $where .= 'u.perms="pending" AND u.deces=0';
102 }
103 parent::__construct($join . ' ' . $fields->get_select_statement(), $where);
104
105 $this->order = implode(',',array_filter(array($fields->get_order_statement(),
106 'u.promo DESC, NomSortKey, prenom')));
107 }
108
109 private function getAdvanced($join, $where)
110 {
111 global $globals;
112 $this->advanced = true;
113 $fields = new SFieldGroup(true, advancedSearchFromInput());
114 if ($fields->too_large()) {
115 new ThrowError('Recherche trop générale.');
116 }
117 parent::__construct(@$join . ' ' . $fields->get_select_statement(),
118 @$where . ' ' . $fields->get_where_statement());
119 $this->order = implode(',',array_filter(array($fields->get_order_statement(),
120 'promo DESC, NomSortKey, prenom')));
121 }
122
123 public function &get($fields, $joins, $where, $groupby, $order, $limitcount = null, $limitfrom = null)
124 {
125 if ($this->score) {
126 $fields .= ', ' . $this->score;
127 }
128 return parent::get($fields, $joins, $where, $groupby, $order, $limitcount, $limitfrom);
129 }
130 }
131
132 class ArraySet extends UserSet
133 {
134 public function __construct(array $users)
135 {
136 $where = $this->getUids($users);
137 if ($where) {
138 $where = "u.hruid IN ($where)";
139 } else {
140 $where = " 0 ";
141 }
142 parent::__construct('', $where);
143 }
144
145 private function getUids(array $users)
146 {
147 $users = User::getBulkHruid($users, array('User', '_silent_user_callback'));
148 if (is_null($users)) {
149 return '';
150 }
151 return '\'' . implode('\', \'', $users) . '\'';
152 }
153 }
154
155 class MinificheView extends MultipageView
156 {
157 public function __construct(PlSet &$set, $data, array $params)
158 {
159 require_once 'applis.func.inc.php';
160 global $globals;
161 $this->entriesPerPage = $globals->search->per_page;
162 if (@$params['with_score']) {
163 $this->addSortKey('score', array('-score', '-date', '-promo', 'nom', 'prenom'), 'pertinence');
164 }
165 $this->addSortKey('name', array('nom', 'prenom'), 'nom');
166 $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
167 $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
168 parent::__construct($set, $data, $params);
169 }
170
171 public function fields()
172 {
173 global $globals;
174 return "u.user_id AS id, u.*,
175 CONCAT(a.alias, '@{$globals->mail->domain}') AS bestemail,
176 u.perms != 'pending' AS inscrit,
177 u.perms != 'pending' AS wasinscrit,
178 u.deces != 0 AS dcd, u.deces, u.matricule_ax,
179 FIND_IN_SET('femme', u.flags) AS sexe,
180 e.entreprise, e.web AS job_web, es.label AS secteur, ef.fonction_fr AS fonction,
181 IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166,
182 ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
183 ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
184 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
185 IF(u.nom_usage<>'',u.nom_usage,u.nom) AS sortkey,
186 (COUNT(em.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif" .
187 (S::logged() ? ", c.contact AS contact" : '');
188 }
189
190 public function joins()
191 {
192 return "LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id".(S::logged() ? "" : " AND e.pub = 'public'").")
193 LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
194 LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
195 LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2)
196 LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
197 LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
198 LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
199 LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
200 LEFT JOIN adresses AS adr ON (u.user_id = adr.uid
201 AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
202 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
203 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
204 LEFT JOIN aliases AS a ON (a.id = u.user_id AND FIND_IN_SET('bestalias', a.flags))
205 LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = 'active')" .
206 (S::logged() ?
207 "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
208 : "");
209 }
210
211 public function bounds()
212 {
213 $order = Env::v('order', $this->defaultkey);
214 $show_bounds = 0;
215 if (($order == "name") || ($order == "-name")) {
216 $this->bound_field = "nom";
217 $show_bounds = 1;
218 } elseif (($order == "promo") || ($order == "-promo")) {
219 $this->bound_field = "promo";
220 $show_bounds = -1;
221 }
222 if ($order{0} == '-') {
223 $show_bounds = -$show_bounds;
224 }
225 return $show_bounds;
226 }
227
228 public function templateName()
229 {
230 return 'include/plview.minifiche.tpl';
231 }
232 }
233
234 class MentorView extends MultipageView
235 {
236 public function __construct(PlSet &$set, $data, array $params)
237 {
238 $this->entriesPerPage = 10;
239 $this->addSortKey('rand', array('RAND(' . S::i('uid') . ')'), 'aléatoirement');
240 $this->addSortKey('name', array('nom', 'prenom'), 'nom');
241 $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
242 $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
243 parent::__construct($set, $data, $params);
244 }
245
246 public function fields()
247 {
248 return "m.uid, u.prenom, u.nom, u.promo, u.hruid,
249 m.expertise, mp.pid, ms.secteur, ms.ss_secteur";
250 }
251
252 public function bounds()
253 {
254 $order = Env::v('order', $this->defaultkey);
255 $show_bounds = 0;
256 if (($order == "name") || ($order == "-name")) {
257 $this->bound_field = "nom";
258 $show_bounds = 1;
259 } elseif (($order == "promo") || ($order == "-promo")) {
260 $this->bound_field = "promo";
261 $show_bounds = -1;
262 }
263 if ($order{0} == '-') {
264 $show_bounds = -$show_bounds;
265 }
266 return $show_bounds;
267 }
268
269 public function templateName()
270 {
271 return 'include/plview.referent.tpl';
272 }
273 }
274
275 class TrombiView extends MultipageView
276 {
277 public function __construct(PlSet &$set, $data, array $params)
278 {
279 $this->entriesPerPage = 24;
280 $this->order = explode(',', Env::v('order', 'nom,prenom,promo'));
281 if (@$params['with_score']) {
282 $this->addSortKey('score', array('-score', '-watch_last', '-promo', 'nom', 'prenom'), 'pertinence');
283 }
284 $this->addSortKey('name', array('nom', 'prenom'), 'nom');
285 $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
286 parent::__construct($set, $data, $params);
287 }
288
289 public function fields()
290 {
291 return "u.user_id, IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom, u.prenom, u.promo, u.hruid ";
292 }
293
294 public function joins()
295 {
296 return "INNER JOIN photo AS p ON (p.uid = u.user_id) ";
297 }
298
299 public function bounds()
300 {
301 $order = Env::v('order', $this->defaultkey);
302 $show_bounds = 0;
303 if (($order == "name") || ($order == "-name")) {
304 $this->bound_field = "nom";
305 $show_bounds = 1;
306 } elseif (($order == "promo") || ($order == "-promo")) {
307 $this->bound_field = "promo";
308 $show_bounds = -1;
309 }
310 if ($order{0} == '-') {
311 $show_bounds = -$show_bounds;
312 }
313 return $show_bounds;
314 }
315
316 public function templateName()
317 {
318 return 'include/plview.trombi.tpl';
319 }
320
321 public function apply(PlPage &$page)
322 {
323 if (!empty($GLOBALS['IS_XNET_SITE'])) {
324 global $globals;
325 $page->assign('mainsiteurl', 'https://' . $globals->core->secure_domain . '/');
326 }
327 return parent::apply($page);
328 }
329 }
330
331 class GeolocView implements PlView
332 {
333 private $set;
334 private $type;
335 private $params;
336
337 public function __construct(PlSet &$set, $data, array $params)
338 {
339 $this->params = $params;
340 $this->set =& $set;
341 $this->type = $data;
342 }
343
344 private function use_map()
345 {
346 return is_file(dirname(__FILE__) . '/../modules/geoloc/dynamap.swf') &&
347 is_file(dirname(__FILE__) . '/../modules/geoloc/icon.swf');
348 }
349
350 public function args()
351 {
352 $args = $this->set->args();
353 unset($args['initfile']);
354 unset($args['mapid']);
355 return $args;
356 }
357
358 public function apply(PlPage &$page)
359 {
360 require_once 'geoloc.inc.php';
361 require_once '../modules/search/search.inc.php';
362
363 switch ($this->type) {
364 case 'icon.swf':
365 pl_cached_content_headers("application/x-shockwave-flash");
366 readfile(dirname(__FILE__).'/../modules/geoloc/icon.swf');
367 exit;
368
369 case 'dynamap.swf':
370 pl_cached_content_headers("application/x-shockwave-flash");
371 readfile(dirname(__FILE__).'/../modules/geoloc/dynamap.swf');
372 exit;
373
374 case 'init':
375 $page->changeTpl('geoloc/init.tpl', NO_SKIN);
376 pl_cached_content_headers("text/xml", "utf-8");
377 if (!empty($GLOBALS['IS_XNET_SITE'])) {
378 $page->assign('background', 0xF2E9D0);
379 }
380 break;
381
382 case 'city':
383 $page->changeTpl('geoloc/city.tpl', NO_SKIN);
384 pl_cached_content_headers("text/xml", "utf-8");
385 $only_current = Env::v('only_current', false)? ' AND FIND_IN_SET(\'active\', adrf.statut)' : '';
386 $it =& $this->set->get('u.user_id AS id, u.prenom, u.nom, u.promo, al.alias',
387 "INNER JOIN adresses AS adrf ON (adrf.uid = u.user_id $only_current)
388 LEFT JOIN aliases AS al ON (u.user_id = al.id
389 AND FIND_IN_SET('bestalias', al.flags))
390 INNER JOIN adresses AS avg ON (" . getadr_join('avg') . ")",
391 'adrf.cityid = ' . Env::i('cityid'), null, null, 11);
392 $page->assign('users', $it);
393 break;
394
395 case 'country':
396 if (Env::has('debug')) {
397 $page->changeTpl('geoloc/country.tpl', SIMPLE);
398 } else {
399 $page->changeTpl('geoloc/country.tpl', NO_SKIN);
400 pl_cached_content_headers("text/xml", "utf-8");
401 }
402 $mapid = Env::has('mapid') ? Env::i('mapid', -2) : false;
403 list($countries, $cities) = geoloc_getData_subcountries($mapid, $this->set, 10);
404 $page->assign('countries', $countries);
405 $page->assign('cities', $cities);
406 break;
407
408 default:
409 global $globals;
410 if (!$this->use_map()) {
411 $page->assign('request_geodesix', true);
412 }
413 $page->assign('annu', @$this->params['with_annu']);
414 $page->assign('protocole', @$_SERVER['HTTPS'] ? 'https' : 'http');
415 $this->set->get('u.user_id', null, "u.perms != 'pending' AND u.deces = 0", "u.user_id", null);
416 return 'include/plview.geoloc.tpl';
417 }
418 }
419 }
420
421 class GadgetView implements PlView
422 {
423 public function __construct(PlSet &$set, $data, array $params)
424 {
425 $this->set =& $set;
426 }
427
428 public function fields()
429 {
430 return "u.user_id AS id, u.*," .
431 (S::logged() ? "q.profile_mobile AS mobile, " : "IF(q.profile_mobile_pub = 'public', q.profile_mobile, NULL) as mobile, ") .
432 "u.perms != 'pending' AS inscrit,
433 u.perms != 'pending' AS wasinscrit,
434 u.deces != 0 AS dcd, u.deces,
435 FIND_IN_SET('femme', u.flags) AS sexe,
436 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region" .
437 (S::logged() ? ", c.contact AS contact" : '');
438 }
439
440 public function joins()
441 {
442 return "LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
443 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
444 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)" .
445 (S::logged() ?
446 "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
447 : "");
448 }
449
450 public function apply(PlPage &$page)
451 {
452 $page->assign_by_ref('set',
453 $this->set->get($this->fields(), $this->joins(), null, null, null, 5, 0));
454 }
455
456 public function args()
457 {
458 return null;
459 }
460 }
461
462 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
463 ?>