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