Simplifies profile names handling.
[platal.git] / modules / profile / general.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2011 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 class ProfileSettingSearchNames implements ProfileSetting
23 {
24 private function diff($pid, array $old, array $new)
25 {
26 $diff = false;
27 foreach ($old as $field => $name) {
28 $diff = $diff || ($name != $new[$field]);
29 }
30
31 return $diff;
32 }
33
34 private function matchWord($old, $new, $newLen)
35 {
36 return ($i = strpos($old, $new)) !== false
37 && ($i == 0 || $old{$i-1} == ' ')
38 && ($i + $newLen == strlen($old) || $old{$i + $newLen} == ' ');
39 }
40
41 private function prepare(ProfilePage $page, array &$new_value)
42 {
43 $initial_value = XDB::fetchOneAssoc('SELECT lastname_main, firstname_main
44 FROM profile_public_names
45 WHERE pid = {?}',
46 $page->pid());
47
48 $success = true;
49 foreach ($initial_value as $field => $name) {
50 $initial = name_to_basename($name);
51 $new = name_to_basename($new_value[$field]);
52
53 if (!($this->matchWord($initial, $new, strlen($new))
54 || ($field == 'lastname_main' && $new == 'DE ' . $initial))) {
55 $new_value[$field . '_error'] = true;
56 $success = false;
57 Platal::page()->trigError('Le nom choisi (' . $new . ') est trop loin de sa valeur initiale (' . $initial . ').');
58 }
59 }
60
61 return $success;
62 }
63
64 public function value(ProfilePage $page, $field, $value, &$success)
65 {
66 $success = true;
67
68 if (is_null($value)) {
69 $request = NamesReq::getPublicNames($page->pid());
70
71 if (!$request) {
72 $value['public_names'] = XDB::fetchOneAssoc('SELECT particles, lastname_main, lastname_marital, lastname_ordinary,
73 firstname_main, firstname_ordinary, pseudonym
74 FROM profile_public_names
75 WHERE pid = {?}',
76 $page->pid());
77
78 $flags = new PlFlagSet($value['public_names']['particles']);
79 unset($value['public_names']['particles']);
80 static $suffixes = array('main', 'marital', 'ordinary');
81
82 foreach ($suffixes as $suffix) {
83 $value['public_names']['particle_' . $suffix] = $flags->hasFlag($suffix);
84 }
85 } else {
86 $value['public_names'] = $request;
87 Platal::page()->assign('validation', true);
88 }
89
90 $value['private_names'] = XDB::fetchAllAssoc('SELECT type, name
91 FROM profile_private_names
92 WHERE pid = {?}
93 ORDER BY type, id',
94 $page->pid());
95 } else {
96 foreach ($value['public_names'] as $key => $name) {
97 $value['public_names'][$key] = trim($name);
98 }
99 foreach ($value['private_names'] as $key => $name) {
100 $value['private_names'][$key]['name'] = trim($name['name']);
101 if ($value['private_names'][$key]['name'] == '') {
102 unset($value['private_names'][$key]);
103 }
104 }
105
106 if (S::user()->isMe($page->owner)) {
107 $success = $this->prepare($page, $value['public_names']);
108 }
109 }
110
111 require_once 'name.func.inc.php';
112 $public_name = build_first_name($value['public_names']) . ' ' . build_full_last_name($value['public_names'], $page->profile->isFemale());
113 $private_name_end = build_private_name($value['private_names']);
114 $private_name = $public_name . $private_name_end;
115
116 Platal::page()->assign('public_name', $public_name);
117 Platal::page()->assign('private_name', $private_name);
118
119 return $value;
120 }
121
122 public function save(ProfilePage $page, $field, $value)
123 {
124 require_once 'name.func.inc.php';
125
126 $old = XDB::fetchOneAssoc('SELECT lastname_main, lastname_marital, lastname_ordinary,
127 firstname_main, firstname_ordinary, pseudonym
128 FROM profile_public_names
129 WHERE pid = {?}',
130 $page->pid());
131
132 if ($has_diff = $this->diff($page->pid(), $old, $value['public_names'])) {
133 $new_names = new NamesReq(S::user(), $page->profile, $value['public_names'], $old);
134 $new_names->submit();
135 Platal::page()->assign('validation', true);
136 Platal::page()->trigWarning('La demande de modification des noms a bien été prise en compte.' .
137 ' Un email sera envoyé dès que ces changements auront été effectués.');
138 }
139
140 XDB::execute('DELETE FROM profile_private_names
141 WHERE pid = {?}',
142 $page->pid());
143 $values = array();
144 $nickname = $lastname = $firstname = 0;
145 foreach ($value['private_names'] as $name) {
146 $values[] = XDB::format('({?}, {?}, {?}, {?})', $page->pid(), $name['type'], $$name['type']++, $name['name']);
147 }
148 if (count($values)) {
149 XDB::rawExecute('INSERT INTO profile_private_names (pid, type, id, name)
150 VALUES ' . implode(',', $values));
151 }
152
153 if ($has_diff) {
154 update_display_names($page->profile, $old, $value['private_names']);
155 } else {
156 update_display_names($page->profile, $value['public_names'], $value['private_names']);
157 }
158 }
159
160 public function getText($value) {
161 $public_names = array();
162 foreach ($value['public_names'] as $name) {
163 if ($name != '') {
164 $public_names[] = $name;
165 }
166 }
167
168 if (count($value['private_names'])) {
169 $private_names = array();
170 foreach ($value['private_names'] as $name) {
171 $private_names[] = $name['name'];
172 }
173 return 'noms publics : ' . implode(', ' , $public_names) . ', noms privés : ' . implode(', ' , $private_names);;
174 }
175
176 return 'noms publics : ' . implode(', ' , $public_names);
177 }
178 }
179
180 class ProfileSettingEdu implements ProfileSetting
181 {
182 public function __construct() {
183 }
184
185 static function sortByGradYear($line1, $line2) {
186 $a = (isset($line1['grad_year'])) ? (int) $line1['grad_year'] : 0;
187 $b = (isset($line2['grad_year'])) ? (int) $line2['grad_year'] : 0;
188 if ($a == $b) {
189 return 0;
190 }
191 return ($a < $b) ? -1 : 1;
192 }
193
194 public function value(ProfilePage $page, $field, $value, &$success)
195 {
196 $success = true;
197 if (is_null($value)) {
198 $value = array();
199 $value = XDB::fetchAllAssoc("SELECT eduid, degreeid, fieldid, grad_year, program
200 FROM profile_education
201 WHERE pid = {?} AND !FIND_IN_SET('primary', flags)
202 ORDER BY id",
203 $page->pid());
204 } else if (!is_array($value)) {
205 $value = null;
206 } else {
207 $i = 0;
208 foreach ($value as $key=>&$edu) {
209 if ($edu['eduid'] < 1 || !isset($edu['degreeid']) || $edu['degreeid'] < 1) {
210 Platal::page()->trigError('L\'université ou le diplôme d\'une formation manque.');
211 $success = false;
212 }
213 if (($edu['grad_year'] < 1921) || ($edu['grad_year'] > (date('Y') + 4))) {
214 Platal::page()->trigWarning('L\'année d\'obtention du diplôme est mal ou non renseignée, elle doit être du type : 2004.');
215 $edu['grad_year'] = null;
216 $edu['warning'] = true;
217 }
218 if ($key != $i) {
219 $value[$i] = $edu;
220 unset($value[$key]);
221 }
222 $i++;
223 }
224 usort($value, array("ProfileSettingEdu", "sortByGradYear"));
225 }
226 return $value;
227 }
228
229 public function save(ProfilePage $page, $field, $value)
230 {
231 XDB::execute("DELETE FROM profile_education
232 WHERE pid = {?} AND !FIND_IN_SET('primary', flags)",
233 $page->pid());
234 foreach ($value as $eduid=>&$edu) {
235 if ($edu['eduid'] != '') {
236 $fieldId = ($edu['fieldid'] == 0) ? null : $edu['fieldid'];
237 XDB::execute("INSERT INTO profile_education
238 SET id = {?}, pid = {?}, eduid = {?}, degreeid = {?},
239 fieldid = {?}, grad_year = {?}, program = {?}",
240 $eduid, $page->pid(), $edu['eduid'], $edu['degreeid'],
241 $fieldId, $edu['grad_year'], $edu['program']);
242 }
243 }
244 }
245
246 public function getText($value) {
247 $schoolsList = DirEnum::getOptions(DirEnum::EDUSCHOOLS);
248 $degreesList = DirEnum::getOptions(DirEnum::EDUDEGREES);
249 $fieldsList = DirEnum::getOptions(DirEnum::EDUFIELDS);
250 $educations = array();
251 foreach ($value as $id => $education) {
252 // XXX: the following condition should be removed once there are no more incomplete educations.
253 if (is_null($education['eduid']) || is_null($education['degreeid'])) {
254 if (is_null($education['eduid']) && is_null($education['degreeid'])) {
255 $educations[$id] = 'formation manquante';
256 } else {
257 $educations[$id] = (is_null($education['eduid']) ? 'université manquante' : $schoolsList[$education['eduid']]) . ', '
258 . (is_null($education['degreeid']) ? 'diplôme manquant' : $degreesList[$education['degreeid']]);
259 }
260 } else {
261 $educations[$id] = $schoolsList[$education['eduid']] . ', ' . $degreesList[$education['degreeid']];
262 }
263
264 $details = array();
265 if ($education['grad_year']) {
266 $details[] = $education['grad_year'];
267 }
268 if ($education['program']) {
269 $details[] = '« ' . $education['program'] . ' »';
270 }
271 if ($education['fieldid']) {
272 $details[] = $fieldsList[$education['fieldid']];
273 }
274 if (count($details)) {
275 $educations[$id] .= ' (' . implode(', ', $details) . ')';
276 }
277 }
278 return implode(', ', $educations);
279 }
280 }
281
282 class ProfileSettingMainEdu implements ProfileSetting
283 {
284 private $cycles;
285
286 public function __construct()
287 {
288 $eduDegrees = DirEnum::getOptions(DirEnum::EDUDEGREES);
289 $eduDegrees = array_flip($eduDegrees);
290 $this->cycles = array(
291 $eduDegrees[Profile::DEGREE_X] => 'Cycle polytechnicien',
292 $eduDegrees[Profile::DEGREE_M] => 'Cycle master',
293 $eduDegrees[Profile::DEGREE_D] => 'Cycle doctoral'
294 );
295 }
296
297 public function value(ProfilePage $page, $field, $value, &$success)
298 {
299 $success = true;
300 if (is_null($value)) {
301 $value = array();
302 $value = XDB::fetchAllAssoc("SELECT degreeid, fieldid, promo_year, program
303 FROM profile_education
304 WHERE pid = {?} AND FIND_IN_SET('primary', flags)
305 ORDER BY degreeid",
306 $page->pid());
307
308 foreach ($value as &$item) {
309 $item['cycle'] = $this->cycles[$item['degreeid']];
310 }
311 } elseif (!is_array($value)) {
312 $value = array();
313 } else {
314 foreach ($value as $key => $item) {
315 if (!isset($item['degreeid'])) {
316 unset($value[$key]);
317 }
318 }
319 }
320
321 return $value;
322 }
323
324 public function save(ProfilePage $page, $field, $value)
325 {
326 foreach ($value as $item) {
327 $fieldId = ($item['fieldid'] == 0) ? null : $item['fieldid'];
328 XDB::execute("UPDATE profile_education
329 SET fieldid = {?}, program = {?}
330 WHERE pid = {?} AND FIND_IN_SET('primary', flags) AND degreeid = {?}",
331 $fieldId, $item['program'], $page->pid(), $item['degreeid']);
332 }
333 }
334
335 public function getText($value) {
336 $fieldsList = DirEnum::getOptions(DirEnum::EDUFIELDS);
337 $educations = array();
338 foreach ($value as $item) {
339 $details = array($this->cycles[$item['degreeid']]);
340 if ($education['program']) {
341 $details[] = '« ' . $education['program'] . ' »';
342 }
343 if ($education['fieldid']) {
344 $details[] = $fieldsList[$education['fieldid']];
345 }
346 }
347 return implode(', ', $educations);
348 }
349 }
350
351 class ProfileSettingEmailDirectory implements ProfileSetting
352 {
353 public function __construct(){}
354 public function save(ProfilePage $page, $field, $value){}
355
356 public function value(ProfilePage $page, $field, $value, &$success)
357 {
358 $p = Platal::page();
359
360 $success = true;
361 if (!is_null($value)) {
362 $email_stripped = strtolower(trim($value));
363 if ((!isvalid_email($email_stripped)) && ($email_stripped) && ($page->values['email_directory'] == "new@example.org")) {
364 $p->assign('email_error', '1');
365 $p->assign('email_directory_error', $email_stripped);
366 $p->trigError('Adresse Email invalide');
367 $success = false;
368 } else {
369 $p->assign('email_error', '0');
370 }
371 }
372 return $value;
373 }
374
375 public function getText($value) {
376 return $value;
377 }
378 }
379
380 class ProfileSettingNetworking implements ProfileSetting
381 {
382 private $email;
383 private $pub;
384 private $web;
385 private $number;
386
387 public function __construct()
388 {
389 $this->email = new ProfileSettingEmail();
390 $this->pub = new ProfileSettingPub();
391 $this->web = new ProfileSettingWeb();
392 $this->number = new ProfileSettingNumber();
393 }
394
395 public function value(ProfilePage $page, $field, $value, &$success)
396 {
397 if (is_null($value)) {
398 $value = XDB::fetchAllAssoc("SELECT n.address, n.pub, n.nwid AS type
399 FROM profile_networking AS n
400 WHERE n.pid = {?}",
401 $page->pid());
402 }
403 if (!is_array($value)) {
404 $value = array();
405 }
406 $filters = XDB::fetchAllAssoc('type', 'SELECT filter, nwid AS type, name
407 FROM profile_networking_enum;');
408 $success = true;
409 foreach($value as $i=>&$network) {
410 if (!trim($network['address'])) {
411 unset($value[$i]);
412 } else {
413 if (!isset($network['pub'])) {
414 $network['pub'] = 'private';
415 }
416 $network['error'] = false;
417 $network['pub'] = $this->pub->value($page, 'pub', $network['pub'], $s);
418 $s = true;
419 $network['name'] = $filters[$network['type']]['name'];
420 if ($filters[$network['type']]['filter'] == 'web') {
421 $network['address'] = $this->web->value($page, 'address', $network['address'], $s);
422 } elseif ($filters[$network['type']]['filter'] == 'email') {
423 $network['address'] = $this->email->value($page, 'address', $network['address'], $s);
424 } elseif ($filters[$network['type']]['filter'] == 'number') {
425 $network['address'] = $this->number->value($page, 'address', $network['address'], $s);
426 }
427 if (!$s) {
428 $success = false;
429 $network['error'] = true;
430 }
431 }
432 }
433 return $value;
434 }
435
436 public function save(ProfilePage $page, $field, $value)
437 {
438 XDB::execute("DELETE FROM profile_networking
439 WHERE pid = {?}",
440 $page->pid());
441 if (!count($value)) {
442 return;
443 }
444 $insert = array();
445 foreach ($value as $id=>$network) {
446 XDB::execute("INSERT INTO profile_networking (pid, id, nwid, address, pub)
447 VALUES ({?}, {?}, {?}, {?}, {?})",
448 $page->pid(), $id, $network['type'], $network['address'], $network['pub']);
449 }
450 }
451
452 public function getText($value) {
453 static $pubs = array('public' => 'publique', 'ax' => 'annuaire AX', 'private' => 'privé');
454 $networkings = array();
455 foreach ($value as $network) {
456 $networkings[] = $network['name'] . ' : ' . $network['address'] . ' (affichage ' . $pubs[$network['pub']] . ')';
457 }
458 return implode(', ' , $networkings);
459 }
460 }
461
462 class ProfileSettingPromo implements ProfileSetting
463 {
464 public function __construct(){}
465
466 public function save(ProfilePage $page, $field, $value)
467 {
468 $gradYearNew = $value;
469 if ($page->profile->mainEducation() == 'X') {
470 $gradYearNew += $page->profile->mainEducationDuration();
471 }
472 if (($page->profile->mainEducation() != 'X'
473 && $value == $page->profile->entry_year + $page->profile->mainEducationDuration())
474 || ($page->profile->mainEducation() == 'X' && $value == $page->profile->entry_year)) {
475 XDB::execute('UPDATE profile_display
476 SET promo = {?}
477 WHERE pid = {?}',
478 $page->profile->mainEducation() . strval($value), $page->profile->id());
479 XDB::execute('UPDATE profile_education
480 SET grad_year = {?}
481 WHERE pid = {?} AND FIND_IN_SET(\'primary\', flags)',
482 $gradYearNew, $page->profile->id());
483 Platal::page()->trigSuccess('Ton statut « orange » a été supprimé.');
484 } else {
485 $myorange = new OrangeReq(S::user(), $page->profile, $gradYearNew);
486 $myorange->submit();
487 Platal::page()->trigSuccess('Tu pourras changer l\'affichage de ta promotion dès que ta nouvelle promotion aura été validée.');
488 }
489 }
490
491 public function value(ProfilePage $page, $field, $value, &$success)
492 {
493 $entryYear = $page->profile->entry_year;
494 $gradYear = $page->profile->grad_year;
495 $yearpromo = $page->profile->yearpromo();
496 $success = true;
497 if (is_null($value) || $value == $yearpromo) {
498 if ($gradYear != $entryYear + $page->profile->mainEducationDuration()) {
499 $promoChoice = array();
500 for ($i = $entryYear; $i <= $gradYear - $page->profile->mainEducationDuration(); ++$i) {
501 if ($page->profile->mainEducation() == 'X') {
502 $promoChoice[] = $page->profile->mainEducation() . strval($i);
503 } else {
504 $promoChoice[] = $page->profile->mainEducation() . strval($i + $page->profile->mainEducationDuration());
505 }
506 }
507 Platal::page()->assign('promo_choice', $promoChoice);
508 }
509 return $yearpromo;
510 }
511
512 // If this profile belongs to an X, $promoNew needs to be changed to
513 // the graduation year.
514 $gradYearNew = $value;
515 if ($page->profile->mainEducation() == 'X') {
516 $gradYearNew += $page->profile->mainEducationDuration();
517 }
518
519 if ($value < 1000 || $value > 9999) {
520 Platal::page()->trigError('L\'année de sortie doit être un nombre de quatre chiffres.');
521 $success = false;
522 } elseif ($gradYearNew < $entryYear + $page->profile->mainEducationDuration()) {
523 Platal::page()->trigError('Trop tôt&nbsp;!');
524 $success = false;
525 }
526 return intval($value);
527 }
528
529 public function getText($value) {
530 return $value;
531 }
532 }
533
534
535 class ProfilePageGeneral extends ProfilePage
536 {
537 protected $pg_template = 'profile/general.tpl';
538
539 public function __construct(PlWizard $wiz)
540 {
541 parent::__construct($wiz);
542 $this->settings['search_names']
543 = new ProfileSettingSearchNames();
544 $this->settings['nationality1']
545 = $this->settings['nationality2']
546 = $this->settings['nationality3']
547 = $this->settings['promo_display']
548 = null;
549 $this->settings['email_directory']
550 = new ProfileSettingEmail();
551 $this->settings['email_directory_new']
552 = new ProfileSettingEmailDirectory();
553 $this->settings['networking'] = new ProfileSettingNetworking();
554 $this->settings['tels'] = new ProfileSettingPhones();
555 $this->settings['edus'] = new ProfileSettingEdu();
556 $this->settings['main_edus'] = new ProfileSettingMainEdu();
557 $this->settings['promo'] = new ProfileSettingPromo();
558 $this->watched= array('tels' => true,
559 'networking' => true, 'edus' => true,
560 'nationality1' => true, 'nationality2' => true,
561 'nationality3' => true, 'search_names' => true);
562
563 /* Some fields editable under condition */
564 if (!S::user()->isMe($this->owner)) {
565 $this->settings['deathdate'] = new ProfileSettingDate(true);
566 $this->settings['birthdate'] = new ProfileSettingDate(true);
567 } else {
568 $this->settings['yourself'] = null;
569 $this->settings['birthdate'] = new ProfileSettingDate();
570 }
571 if (S::user()->checkPerms('directory_private')
572 || S::user()->isMyProfile($this->owner)) {
573 $this->settings['freetext'] = null;
574 $this->settings['freetext_pub']
575 = $this->settings['photo_pub']
576 = new ProfileSettingPub();
577 $this->watched['freetext'] = true;
578 }
579
580 }
581
582 protected function _fetchData()
583 {
584 // Checkout all data...
585 $res = XDB::query("SELECT p.nationality1, p.nationality2, p.nationality3, IF(p.birthdate = 0, '', p.birthdate) AS birthdate,
586 p.email_directory as email_directory, pd.promo AS promo_display,
587 p.freetext, p.freetext_pub, p.ax_id AS matricule_ax, pd.yourself,
588 p.deathdate
589 FROM profiles AS p
590 INNER JOIN profile_display AS pd ON (pd.pid = p.pid)
591 WHERE p.pid = {?}", $this->pid());
592 $this->values = $res->fetchOneAssoc();
593
594 // Retreive photo informations
595 $res = XDB::query("SELECT pub
596 FROM profile_photos
597 WHERE pid = {?}", $this->pid());
598 if ($res->numRows() == 0) {
599 $this->values['photo_pub'] = 'private';
600 } else {
601 $this->values['photo_pub'] = $res->fetchOneCell();
602 }
603
604 if ($this->owner) {
605 $res = XDB::query("SELECT COUNT(*)
606 FROM requests
607 WHERE type = 'photo' AND pid = {?}",
608 $this->owner->id());
609 $this->values['nouvellephoto'] = $res->fetchOneCell();
610 } else {
611 $this->values['nouvellephoto'] = 0;
612 }
613 }
614
615 protected function _saveData()
616 {
617 if ($this->changed['nationality1'] || $this->changed['nationality2'] || $this->changed['nationality3']
618 || $this->changed['birthdate'] || $this->changed['freetext'] || $this->changed['freetext_pub']
619 || $this->changed['email_directory']) {
620 if ($this->values['nationality3'] == "") {
621 $this->values['nationality3'] = NULL;
622 }
623 if ($this->values['nationality2'] == "") {
624 $this->values['nationality2'] = $this->values['nationality3'];
625 $this->values['nationality3'] = NULL;
626 }
627 if ($this->values['nationality1'] == "") {
628 $this->values['nationality1'] = $this->values['nationality2'];
629 $this->values['nationality2'] = $this->values['nationality3'];
630 $this->values['nationality3'] = NULL;
631 }
632 if ($this->values['nationality1'] == $this->values['nationality2']
633 && $this->values['nationality2'] == $this->values['nationality3']) {
634 $this->values['nationality2'] = NULL;
635 $this->values['nationality3'] = NULL;
636 } else if ($this->values['nationality1'] == $this->values['nationality2']) {
637 $this->values['nationality2'] = $this->values['nationality3'];
638 $this->values['nationality3'] = NULL;
639 } else if ($this->values['nationality2'] == $this->values['nationality3']
640 || $this->values['nationality1'] == $this->values['nationality3']) {
641 $this->values['nationality3'] = NULL;
642 }
643
644 $new_email = ($this->values['email_directory'] == "new@example.org") ?
645 $this->values['email_directory_new'] : $this->values['email_directory'];
646 if ($new_email == "") {
647 $new_email = NULL;
648 }
649
650 XDB::execute("UPDATE profiles
651 SET nationality1 = {?}, nationality2 = {?}, nationality3 = {?}, birthdate = {?},
652 freetext = {?}, freetext_pub = {?}, email_directory = {?}
653 WHERE pid = {?}",
654 $this->values['nationality1'], $this->values['nationality2'], $this->values['nationality3'],
655 ProfileSettingDate::toSQLDate($this->values['birthdate']),
656 $this->values['freetext'], $this->values['freetext_pub'], $new_email, $this->pid());
657 }
658 if ($this->changed['photo_pub']) {
659 XDB::execute("UPDATE profile_photos
660 SET pub = {?}
661 WHERE pid = {?}",
662 $this->values['photo_pub'], $this->pid());
663 }
664 if (S::user()->isMe($this->owner) && $this->changed['yourself']) {
665 if ($this->owner) {
666 XDB::execute('UPDATE accounts
667 SET display_name = {?}
668 WHERE uid = {?}',
669 $this->values['yourself'], $this->owner->id());
670 }
671 XDB::execute('UPDATE profile_display
672 SET yourself = {?}
673 WHERE pid = {?}', $this->values['yourself'],
674 $this->pid());
675 }
676 if ($this->changed['promo_display']) {
677 if ($this->values['promo_display']{0} == $this->profile->mainEducation()) {
678 $yearpromo = intval(substr($this->values['promo_display'], 1, 4));
679 if (($this->profile->mainEducation() == 'X' && $yearpromo >= $this->profile->entry_year)
680 || ($this->profile->mainEducation() != 'X'
681 && $yearpromo >= $this->profile->entry_year + $this->profile->mainEducationDuration())) {
682 XDB::execute('UPDATE profile_display
683 SET promo = {?}
684 WHERE pid = {?}',
685 $this->values['promo_display'], $this->pid());
686 XDB::execute('UPDATE profile_education
687 SET promo_year = {?}
688 WHERE pid = {?} AND FIND_IN_SET(\'primary\', flags)',
689 $yearpromo, $this->pid());
690 }
691 }
692 }
693 if (!S::user()->isMe($this->owner) && $this->changed['deathdate']) {
694 XDB::execute('UPDATE profiles
695 SET deathdate = {?}, deathdate_rec = NOW()
696 WHERE pid = {?} AND deathdate_rec IS NULL',
697 ProfileSettingDate::toSQLDate($this->values['deathdate']), $this->pid());
698 if (XDB::affectedRows() > 0) {
699 $this->profile->clear();
700 if ($this->owner) {
701 $this->owner->clear(true);
702 }
703 } else {
704 /* deathdate_rec was not NULL, this is just an update of the death date
705 */
706 XDB::execute('UPDATE profiles
707 SET deathdate = {?}
708 WHERE pid = {?}',
709 ProfileSettingDate::toSQLDate($this->values['deathdate']), $this->pid());
710 }
711 }
712 }
713
714 public function _prepare(PlPage $page, $id)
715 {
716 require_once "education.func.inc.php";
717
718 $res = XDB::query("SELECT id, field
719 FROM profile_education_field_enum
720 ORDER BY field");
721 $page->assign('edu_fields', $res->fetchAllAssoc());
722
723 require_once "emails.combobox.inc.php";
724 fill_email_combobox($page, array('source', 'redirect', 'job', 'directory'), $this->owner);
725
726 $res = XDB::query("SELECT nw.nwid AS type, nw.name
727 FROM profile_networking_enum AS nw
728 ORDER BY name");
729 $page->assign('network_list', $res->fetchAllAssoc());
730
731 $page->assign('lastnames', array('main' => 'Nom patronymique', 'marital' => 'Nom marital', 'ordinary' => 'Nom usuel'));
732 $page->assign('firstnames', array('firstname_main' => 'Prénom', 'firstname_ordinary' => 'Prénom usuel', 'pseudonym' => 'Pseudonyme (nom de plume)'));
733 $page->assign('other_names', array('nickname' => 'Surnom', 'firstname' => 'Autre prénom', 'lastname' => 'Autre nom'));
734 $page->assign('isFemale', $this->profile->isFemale() ? 1 : 0);
735 }
736 }
737
738 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
739 ?>