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