User::canEdit takes user permissions into account.
[platal.git] / modules / profile / jobs.inc.php
CommitLineData
3950bc21
FB
1<?php
2/***************************************************************************
9f5bd98e 3 * Copyright (C) 2003-2010 Polytechnique.org *
3950bc21
FB
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
12bcf04b 22class ProfileSettingJob extends ProfileSettingGeocoding
37d44b3b
FB
23{
24 private $pub;
541e8d03
SJ
25 private $email_new;
26 private $email;
27 private $url;
f93fb300 28 private $bool;
37d44b3b
FB
29 private $checks;
30
31 public function __construct()
32 {
12bcf04b 33 $this->pub = new ProfileSettingPub();
541e8d03
SJ
34 $this->email
35 = $this->email_new
12bcf04b
RB
36 = new ProfileSettingEmail();
37 $this->url = new ProfileSettingWeb();
38 $this->bool = new ProfileSettingBool();
541e8d03
SJ
39 $this->checks = array('url' => array('w_url'),
40 'email' => array('w_email'),
41 'pub' => array('pub', 'w_email_pub'),
42 );
37d44b3b
FB
43 }
44
afaa2cc7
SJ
45 public function emptyJob()
46 {
47 return array(
48 'id' => '0',
49 'jobid' => '',
50 'pub' => 'private',
51 'name' => '',
52 'hq_acronym' => '',
53 'hq_url' => '',
54 'hq_email' => '',
55 'hq_address' => array(
56 'text' => '',
57 'accuracy' => '',
58 'postalText' => '',
59 'postalCode' => '',
60 'administrativeAreaId' => '',
61 'subAdministrativeAreaId' => '',
62 'localityId' => '',
63 'countryId' => '',
64 'latitude' => '',
65 'longitude' => '',
66 'north' => '',
67 'south' => '',
68 'east' => '',
69 'west' => '',
70 'cedex' => '',
71 'updateTime' => '',
72 'changed' => '0',
73 'removed' => '0',
74 ),
0b6c8b36 75 'hq_fixed' => '',
afaa2cc7
SJ
76 'hq_fax' => '',
77 'subSubSectorName' => null,
78 'sector' => '0',
79 'subSector' => '0',
80 'subSubSector' => '0',
81 'description' => '',
82 'w_url' => '',
83 'w_address' => array(
84 'pub' => 'private',
85 'text' => '',
86 'accuracy' => '',
87 'postalText' => '',
88 'postalCode' => '',
89 'administrativeAreaId' => '',
90 'subAdministrativeAreaId' => '',
91 'localityId' => '',
92 'countryId' => '',
93 'latitude' => '',
94 'longitude' => '',
95 'north' => '',
96 'south' => '',
97 'east' => '',
98 'west' => '',
99 'cedex' => '',
100 'updateTime' => '',
101 'changed' => '0',
102 'removed' => '0',
103 ),
104 'w_email' => '',
105 'w_email_pub' => 'private',
106 'w_email_new' => '',
107 'w_phone' => array(0 => array(
108 'type' => 'fixed',
109 'tel' => '',
110 'pub' => 'private',
111 'comment' => '',
3ac45f10
PC
112 ),
113 'terms' => array()),
afaa2cc7
SJ
114 );
115 }
116
b814a8b8 117 private function cleanJob(ProfilePage &$page, $jobid, array &$job, &$success)
37d44b3b
FB
118 {
119 $success = true;
541e8d03
SJ
120 if ($job['w_email'] == "new@example.org") {
121 $job['w_email'] = $job['w_email_new'];
122 }
37d44b3b
FB
123 foreach ($this->checks as $obj=>&$fields) {
124 $chk =& $this->$obj;
125 foreach ($fields as $field) {
126 $job[$field] = $chk->value($page, $field, $job[$field], $s);
127 if (!$s) {
128 $success = false;
129 $job[$field . '_error'] = true;
130 }
131 }
132 }
541e8d03 133 if (!$job['subSubSectorName']) {
c7139c07
SJ
134 $res = XDB::query("SELECT name
135 FROM profile_job_subsubsector_enum
136 WHERE id = {?}",
541e8d03
SJ
137 $job['subSubSector']);
138 $job['subSubSectorName'] = $res->fetchOneCell();
c7139c07
SJ
139 } else {
140 $res = XDB::query("SELECT sectorid, subsectorid, id
141 FROM profile_job_subsubsector_enum
142 WHERE name = {?}",
541e8d03 143 $job['subSubSectorName']);
c7139c07
SJ
144 if ($res->numRows() != 1) {
145 $success = false;
146 $job['sector_error'] = true;
147 } else {
541e8d03 148 list($job['sector'], $job['subSector'], $job['subSubSector']) = $res->fetchOneRow();
c7139c07
SJ
149 }
150 }
3ac45f10
PC
151 if (count($job['terms'])) {
152 $termsid = array();
153 foreach ($job['terms'] as $term) {
154 if (!$term['full_name']) {
155 $termsid[] = $term['jtid'];
156 }
157 }
158 if (count($termsid)) {
159 $res = XDB::query("SELECT jtid, full_name
160 FROM profile_job_term_enum
161 WHERE jtid IN {?}",
162 $termsid);
163 $term_id_to_name = $res->fetchAllAssoc('jtid', false);
164 foreach ($job['terms'] as &$term) {
165 if (!$term['full_name']) {
166 $term['full_name'] = $term_id_to_name[$term['jtid']];
167 }
168 }
169 }
170 }
b814a8b8 171 if ($job['name']) {
c7139c07
SJ
172 $res = XDB::query("SELECT id
173 FROM profile_job_enum
174 WHERE name = {?}",
175 $job['name']);
176 if ($res->numRows() != 1) {
4d7d27fc
SJ
177 $this->geocodeAddress($job['hq_address'], $s);
178 if (!$s) {
179 $gmapsGeocoder = new GMapsGeocoder();
180 $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']);
181 }
024ec1e5 182 $req = new EntrReq(S::user(), $page->profile, $jobid, $job['name'], $job['hq_acronym'], $job['hq_url'],
4d7d27fc 183 $job['hq_email'], $job['hq_fixed'], $job['hq_fax'], $job['hq_address']);
b814a8b8
SJ
184 $req->submit();
185 $job['jobid'] = null;
858a5b42 186 sleep(1);
c7139c07
SJ
187 } else {
188 $job['jobid'] = $res->fetchOneCell();
189 }
190 }
541e8d03 191 $job['w_address']['pub'] = $this->pub->value($page, 'address_pub', $job['w_address']['pub'], $s);
0b6c8b36 192 $job['w_phone'] = Phone::formatFormArray($job['w_phone'], $s);
afaa2cc7 193
37d44b3b
FB
194 unset($job['removed']);
195 unset($job['new']);
37d44b3b
FB
196 }
197
198 public function value(ProfilePage &$page, $field, $value, &$success)
199 {
a6483c12 200 require_once 'validations.inc.php';
024ec1e5 201 $entreprise = ProfileValidate::get_typed_requests($page->pid(), 'entreprise');
b814a8b8
SJ
202 $entr_val = 0;
203
37d44b3b
FB
204 $init = false;
205 if (is_null($value)) {
206 $value = $page->values['jobs'];
207 $init = true;
208 }
209 $success = true;
a6483c12 210 foreach ($value as $key => &$job) {
b814a8b8 211 $job['name'] = trim($job['name']);
a6483c12 212 if ($job['name'] == '' && $entreprise) {
b814a8b8 213 $job['tmp_name'] = $entreprise[$entr_val]->name;
a6483c12
SJ
214 ++$entr_val;
215 } else if ($job['name'] == '') {
ba6ee875
SJ
216 if ($job['subSubSectorName'] == '' && $job['description'] == '' && $job['w_url'] == ''
217 && $job['w_address']['text'] == '' && $job['w_email'] == ''
218 && count($job['w_phone']) == 1 && $job['w_phone']['tel'] == '') {
219 array_splice($value, $key, 1);
220 continue;
221 }
222
d1d01361
SJ
223 if (!$init) {
224 $job['name_error'] = true;
225 $success = false;
226 }
b814a8b8 227 }
b94719c1 228
541e8d03 229 if (isset($job['removed']) && $job['removed']) {
b94719c1
SJ
230 if ($job['name'] == '' && $entreprise) {
231 $entreprise[$entr_val - 1]->clean();
232 }
ed01acac 233 array_splice($value, $key, 1);
37d44b3b 234 }
8768e5af
SJ
235 foreach (array('sectorid', 'subsectorid', 'subsubsectorid') as $key) {
236 if ($job[$key] == 0) {
237 $job[$key] = null;
238 }
b139d0e6 239 }
37d44b3b 240 }
a6483c12 241 foreach ($value as $key => &$job) {
37d44b3b 242 $ls = true;
541e8d03 243 $this->geocodeAddress($job['w_address'], $s);
37d44b3b 244 $ls = ($ls && $s);
bde2be3b 245 $this->cleanJob($page, $key, $job, $s);
37d44b3b
FB
246 $ls = ($ls && $s);
247 if (!$init) {
248 $success = ($success && $ls);
249 }
250 }
251 return $value;
252 }
253
254 public function save(ProfilePage &$page, $field, $value)
255 {
0b6c8b36 256 // TODO: use address class to update profile_job_enum once it is done.
c7139c07 257 XDB::execute("DELETE FROM profile_job
ce0b2c6f 258 WHERE pid = {?}",
a6483c12 259 $page->pid());
541e8d03
SJ
260 XDB::execute("DELETE FROM profile_addresses
261 WHERE pid = {?} AND type = 'job'",
a6483c12 262 $page->pid());
0b6c8b36 263 Phone::deletePhones($page->pid(), Phone::LINK_JOB);
3ac45f10 264 $terms_values = array();
a6483c12 265 foreach ($value as $id => &$job) {
afaa2cc7
SJ
266 if (isset($job['name']) && $job['name']) {
267 if (isset($job['jobid']) && $job['jobid']) {
ce0b2c6f 268 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
afaa2cc7
SJ
269 subsubsectorid, email, url, pub, email_pub, jobid)
270 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
a6483c12 271 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
afaa2cc7
SJ
272 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']);
273 } else {
ce0b2c6f 274 XDB::execute("INSERT INTO profile_job (pid, id, description, sectorid, subsectorid,
afaa2cc7
SJ
275 subsubsectorid, email, url, pub, email_pub)
276 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
a6483c12 277 $page->pid(), $id, $job['description'], $job['sector'], $job['subSector'],
afaa2cc7
SJ
278 $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']);
279 }
12bcf04b 280 $address = new ProfileSettingAddress();
a6483c12 281 $address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
0b6c8b36 282 Phone::savePhones($job['w_phone'], $page->pid(), Phone::LINK_JOB, $id);
3ac45f10
PC
283 if (isset($job['terms'])) {
284 foreach ($job['terms'] as $term) {
285 $terms_values[] = '('.XDB::escape($page->pid()).', '. XDB::escape($id).', '.XDB::escape($term['jtid']).', "original")';
286 }
287 }
b814a8b8 288 }
37d44b3b 289 }
3ac45f10
PC
290 if (count($terms_values) > 0) {
291 XDB::execute('INSERT INTO profile_job_term (pid, jid, jtid, computed)
292 VALUES '.implode(', ', $terms_values));
293 }
37d44b3b 294 }
a0fce0c6
SJ
295
296 public function getText($value) {
297 $jobs = array();
298 foreach ($value as $id => $job) {
299 $address = new ProfileSettingAddress();
0b6c8b36 300 $phones = Phone::formArrayToString($job['w_phone']);
a0fce0c6
SJ
301 $jobs[] = 'Entreprise : ' . $job['name'] . ', secteur : ' . $job['subSubSectorName']
302 . ', description : ' . $job['description'] . ', web : ' . $job['w_url']
303 . ', email : ' . $job['w_email']
0b6c8b36 304 . ($phones ? ', ' . $phones : '') . ', ' . $address->getText($job['w_address']);
a0fce0c6
SJ
305 }
306 return implode(' ; ' , $jobs);
307 }
37d44b3b
FB
308}
309
603aeb6c
SJ
310class ProfileSettingCorps implements ProfileSetting
311{
312 public function value(ProfilePage &$page, $field, $value, &$success)
313 {
314 $success = true;
315 if (is_null($value)) {
316 $res = XDB::query("SELECT original_corpsid AS original, current_corpsid AS current,
317 rankid AS rank, corps_pub AS pub
318 FROM profile_corps
319 WHERE pid = {?}",
320 $page->pid());
321 return $res->fetchOneAssoc();
322 }
323 return $value;
324 }
325
326 public function save(ProfilePage &$page, $field, $value)
327 {
328 XDB::execute('REPLACE INTO profile_corps (original_corpsid, current_corpsid, rankid, corps_pub, pid)
329 VALUES ({?}, {?}, {?}, {?}, {?})',
330 $value['original'], $value['current'], $value['rank'], $value['pub'], $page->pid());
331 }
332
333 public function getText($value)
334 {
335 $corpsList = DirEnum::getOptions(DirEnum::CORPS);
336 $rankList = DirEnum::getOptions(DirEnum::CORPSRANKS);
337 return 'Corps actuel : ' . $corpsList[$value['current']] . ' , rang : ' . $corpsList[$value['rank']]
338 . ' , corps d\'origine : ' . $corpsList[$value['original']] . ' , affichage : ' . $value['pub'];
339 }
340}
341
12bcf04b 342class ProfileSettingJobs extends ProfilePage
3950bc21
FB
343{
344 protected $pg_template = 'profile/jobs.tpl';
345
346 public function __construct(PlWizard &$wiz)
347 {
348 parent::__construct($wiz);
37d44b3b 349 $this->settings['cv'] = null;
603aeb6c 350 $this->settings['corps'] = new ProfileSettingCorps();
12bcf04b 351 $this->settings['jobs'] = new ProfileSettingJob();
72e96bc0 352 $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true);
37d44b3b
FB
353 }
354
7c2e0f0d 355 protected function _fetchData()
37d44b3b 356 {
37d44b3b
FB
357 // Checkout the CV
358 $res = XDB::query("SELECT cv
e5bcd851
FB
359 FROM profiles
360 WHERE pid = {?}",
361 $this->pid());
37d44b3b
FB
362 $this->values['cv'] = $res->fetchOneCell();
363
364 // Build the jobs tree
563f86f5 365 $res = XDB::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid,
541e8d03
SJ
366 s.name, j.description, j.email, j.email_pub, j.url, j.pub,
367 je.acronym, je.url, je.email,
368 aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId,
369 aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId,
370 aw.latitude, aw.longitude, aw.pub, aw.updateTime,
371 aw.north, aw.south, aw.east, aw.west,
372 ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId,
373 ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId,
374 ah.latitude, ah.longitude, ah.pub, ah.updateTime,
375 ah.north, ah.south, ah.east, ah.west
c7139c07
SJ
376 FROM profile_job AS j
377 LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id)
c7139c07 378 LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid)
ce0b2c6f 379 LEFT JOIN profile_addresses AS aw ON (aw.pid = j.pid AND aw.type = 'job'
4d7d27fc 380 AND aw.id = j.id)
541e8d03 381 LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq')
ce0b2c6f 382 WHERE j.pid = {?}
541e8d03 383 ORDER BY j.id",
a6391000 384 $this->pid());
37d44b3b 385 $this->values['jobs'] = array();
bde2be3b 386
afaa2cc7
SJ
387 if ($res->numRows() > 0) {
388 while (list($id, $jobid, $name, $sector, $subSector, $subSubSector,
389 $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub,
390 $hq_acronym, $hq_url, $hq_email,
391 $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId,
392 $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId,
393 $w_latitude, $w_longitude, $w_pub, $w_updateTime,
394 $w_north, $w_south, $w_east, $w_west,
395 $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId,
396 $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId,
397 $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime,
398 $hq_north, $hq_south, $hq_east, $hq_west,
399 ) = $res->next()) {
400 $this->values['jobs'][] = array(
401 'id' => $id,
402 'jobid' => $jobid,
403 'name' => $name,
404 'sector' => $sector,
405 'subSector' => $subSector,
406 'subSubSector' => $subSubSector,
407 'subSubSectorName' => $subSubSectorName,
408 'description' => $description,
409 'pub' => $pub,
410 'w_email' => $w_email,
411 'w_email_pub' => $w_emailPub,
412 'w_url' => $w_url,
413 'hq_acronym' => $hq_acronym,
414 'hq_url' => $hq_url,
415 'hq_email' => $hq_email,
416 'w_address' => array(
417 'accuracy' => $w_accuracy,
418 'text' => $w_text,
419 'postalText' => $w_postalText,
420 'postalCode' => $w_postalCode,
421 'localityId' => $w_localityId,
422 'subAdministrativeAreaId' => $w_subAdministrativeAreaId,
423 'administrativeAreaId' => $w_administrativeAreaId,
424 'countryId' => $w_countryId,
425 'latitude' => $w_latitude,
426 'longitude' => $w_longitude,
427 'pub' => $w_pub,
428 'updateTime' => $w_updateTime,
429 'north' => $w_north,
430 'south' => $w_south,
431 'east' => $w_east,
432 'west' => $w_west,
433 ),
434 'hq_address' => array(
435 'accuracy' => $hq_accuracy,
436 'text' => $hq_text,
437 'postalText' => $hq_postalText,
438 'postalCode' => $hq_postalCode,
439 'localityId' => $hq_localityId,
440 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId,
441 'administrativeAreaId' => $hq_administrativeAreaId,
442 'countryId' => $hq_countryId,
443 'latitude' => $hq_latitude,
444 'longitude' => $hq_longitude,
445 'pub' => $hq_pub,
446 'updateTime' => $hq_updateTime,
447 'north' => $hq_north,
448 'south' => $hq_south,
449 'east' => $hq_east,
450 'west' => $hq_west,
451 ),
452 );
bde2be3b 453 }
afaa2cc7 454
0b6c8b36
SJ
455 $it = Phone::iterate(array($this->pid()), array(Phone::LINK_JOB));
456 while ($phone = $it->next()) {
457 $this->values['jobs'][$phone->linkId()]['w_phone'][$phone->id()] = $phone->toFormArray();
bde2be3b 458 }
3ac45f10
PC
459 $res = XDB::iterator("SELECT e.jtid, e.full_name, j.jid AS jobid
460 FROM profile_job_term_enum AS e
461 INNER JOIN profile_job_term AS j USING(jtid)
462 WHERE pid = {?}
463 ORDER BY j.jid",
464 $this->pid());
465 $i = 0;
466 $jobNb = count($this->values['jobs']);
467 while ($term = $res->next()) {
468 $jobid = $term['jobid'];
469 while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) {
470 $i++;
471 }
472 if ($i >= $jobNb) {
473 break;
474 }
475 $job =& $this->values['jobs'][$i];
476 if ($job['id'] != $jobid) {
477 continue;
478 }
479 if (!isset($job['terms'])) {
480 $job['terms'] = array();
481 }
482 $job['terms'][] = $term;
483 }
484
afaa2cc7 485 foreach ($this->values['jobs'] as $id => &$job) {
0b6c8b36 486 $phone = new Phone();
afaa2cc7 487 if (!isset($job['w_phone'])) {
0b6c8b36 488 $job['w_phone'] = array(0 => $phone->toFormArray());
afaa2cc7 489 }
bde2be3b 490 }
aab2ffdd 491
afaa2cc7 492 $job['w_email_new'] = '';
0b6c8b36
SJ
493 if (!isset($job['hq_fixed'])) {
494 $job['hq_fixed'] = '';
bde2be3b 495 }
afaa2cc7
SJ
496 if (!isset($job['hq_fax'])) {
497 $job['hq_fax'] = '';
bde2be3b 498 }
afaa2cc7
SJ
499 if (!isset($job['w_email_pub'])) {
500 $job['w_email_pub'] = 'private';
bde2be3b 501 }
afaa2cc7
SJ
502 if (!$job['hq_address']['text']) {
503 $job['hq_address'] = array(
504 'text' => '',
505 'accuracy' => '',
506 'postalText' => '',
507 'postalCode' => '',
508 'administrativeAreaId' => '',
509 'subAdministrativeAreaId' => '',
510 'localityId' => '',
511 'countryId' => '',
512 'latitude' => '',
513 'longitude' => '',
514 'north' => '',
515 'south' => '',
516 'east' => '',
517 'west' => '',
518 'cedex' => '',
519 'updateTime' => '',
520 'changed' => '0',
521 'removed' => '0',
522 );
523 }
524 $job['w_address']['cedex'] = '';
525 $job['w_address']['changed'] = '0';
526 $job['w_address']['removed'] = '0';
527 } else {
528 $this->values['jobs'][] = $this->settings['jobs']->emptyJob();
bde2be3b 529 }
37d44b3b
FB
530 }
531
7c2e0f0d 532 protected function _saveData()
37d44b3b
FB
533 {
534 if ($this->changed['cv']) {
e5bcd851 535 XDB::execute("UPDATE profiles
37d44b3b 536 SET cv = {?}
e5bcd851
FB
537 WHERE pid = {?}",
538 $this->values['cv'], $this->pid());
37d44b3b 539 }
3950bc21 540 }
2dcac0f5 541
04334c61 542 public function _prepare(PlPage &$page, $id)
2dcac0f5 543 {
a6483c12 544 require_once 'emails.combobox.inc.php';
4e698dc9 545 fill_email_combobox($page, $this->owner);
b715c1e1 546
33b6f5a0
SJ
547 $res = XDB::query("SELECT id, name AS label
548 FROM profile_job_sector_enum");
541e8d03 549 $page->assign('sectors', $res->fetchAllAssoc());
72e96bc0
SJ
550
551 $res = XDB::iterator("SELECT id, name
552 FROM profile_corps_enum
553 ORDER BY id = 1 DESC, name");
554 $page->assign('original_corps', $res->fetchAllAssoc());
555
556 $res = XDB::iterator("SELECT id, name
557 FROM profile_corps_enum
558 WHERE still_exists = 1
559 ORDER BY id = 1 DESC, name");
560 $page->assign('current_corps', $res->fetchAllAssoc());
561
562 $res = XDB::iterator("SELECT id, name
e489faf7
SJ
563 FROM profile_corps_rank_enum
564 ORDER BY id = 1 DESC, name");
72e96bc0 565 $page->assign('corps_rank', $res->fetchAllAssoc());
2dcac0f5 566 }
3950bc21
FB
567}
568
569// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
570?>