2 /***************************************************************************
3 * Copyright (C) 2003-2011 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
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. *
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. *
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 *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
22 class ProfileSettingSearchNames
implements ProfileSetting
24 private function diff($pid, array $old, array $new)
27 foreach ($old as $field => $name) {
28 $diff = $diff ||
($name != $new[$field]);
34 private function matchWord($old, $new, $newLen)
36 return ($i = strpos($old, $new)) !== false
37 && ($i == 0 ||
$old{$i-1} == ' ')
38 && ($i +
$newLen == strlen($old) ||
$old{$i +
$newLen} == ' ');
41 private function prepare(ProfilePage
$page, array &$new_value)
43 $initial_value = XDB
::fetchOneAssoc('SELECT lastname_main, firstname_main
44 FROM profile_public_names
49 foreach ($initial_value as $field => $name) {
50 $initial = name_to_basename($name);
51 $new = name_to_basename($new_value[$field]);
53 if (!($this->matchWord($initial, $new, strlen($new))
54 ||
($field == 'lastname_main' && $new == 'DE ' . $initial))) {
55 $new_value[$field . '_error'] = true
;
57 Platal
::page()->trigError('Le nom choisi (' . $new . ') est trop loin de sa valeur initiale (' . $initial . ').');
64 public function value(ProfilePage
$page, $field, $value, &$success)
68 if (is_null($value)) {
69 $request = NamesReq
::getPublicNames($page->pid());
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
78 $flags = new PlFlagSet($value['public_names']['particles']);
79 unset($value['public_names']['particles']);
80 static $suffixes = array('main', 'marital', 'ordinary');
82 foreach ($suffixes as $suffix) {
83 $value['public_names']['particle_' . $suffix] = $flags->hasFlag($suffix);
86 $value['public_names'] = $request;
87 Platal
::page()->assign('validation', true
);
90 $value['private_names'] = XDB
::fetchAllAssoc('SELECT type, name
91 FROM profile_private_names
96 foreach ($value['public_names'] as $key => $name) {
97 $value['public_names'][$key] = trim($name);
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]);
106 if (S
::user()->isMe($page->owner
)) {
107 $success = $this->prepare($page, $value['public_names']);
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;
116 Platal
::page()->assign('public_name', $public_name);
117 Platal
::page()->assign('private_name', $private_name);
122 public function save(ProfilePage
$page, $field, $value)
124 require_once 'name.func.inc.php';
126 $old = XDB
::fetchOneAssoc('SELECT lastname_main, lastname_marital, lastname_ordinary,
127 firstname_main, firstname_ordinary, pseudonym
128 FROM profile_public_names
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.');
140 XDB
::execute('DELETE FROM profile_private_names
144 $nickname = $lastname = $firstname = 0;
145 foreach ($value['private_names'] as $name) {
146 $values[] = XDB
::format('({?}, {?}, {?}, {?})', $page->pid(), $name['type'], $
$name['type']++
, $name['name']);
148 if (count($values)) {
149 XDB
::rawExecute('INSERT INTO profile_private_names (pid, type, id, name)
150 VALUES ' . implode(',', $values));
154 update_display_names($page->profile
, $old, $value['private_names']);
156 update_display_names($page->profile
, $value['public_names'], $value['private_names']);
160 public function getText($value) {
161 $public_names = array();
162 foreach ($value['public_names'] as $name) {
164 $public_names[] = $name;
168 if (count($value['private_names'])) {
169 $private_names = array();
170 foreach ($value['private_names'] as $name) {
171 $private_names[] = $name['name'];
173 return 'noms publics : ' . implode(', ' , $public_names) . ', noms privés : ' . implode(', ' , $private_names);;
176 return 'noms publics : ' . implode(', ' , $public_names);
180 class ProfileSettingEdu
implements ProfileSetting
182 public function __construct() {
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;
191 return ($a < $b) ?
-1 : 1;
194 public function value(ProfilePage
$page, $field, $value, &$success)
197 if (is_null($value)) {
199 $value = XDB
::fetchAllAssoc("SELECT eduid, degreeid, fieldid, grad_year, program
200 FROM profile_education
201 WHERE pid = {?} AND !FIND_IN_SET('primary', flags)
204 } else if (!is_array($value)) {
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.');
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
;
224 usort($value, array("ProfileSettingEdu", "sortByGradYear"));
229 public function save(ProfilePage
$page, $field, $value)
231 XDB
::execute("DELETE FROM profile_education
232 WHERE pid = {?} AND !FIND_IN_SET('primary', flags)",
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']);
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';
257 $educations[$id] = (is_null($education['eduid']) ?
'université manquante' : $schoolsList[$education['eduid']]) . ', '
258 . (is_null($education['degreeid']) ?
'diplôme manquant' : $degreesList[$education['degreeid']]);
261 $educations[$id] = $schoolsList[$education['eduid']] . ', ' . $degreesList[$education['degreeid']];
265 if ($education['grad_year']) {
266 $details[] = $education['grad_year'];
268 if ($education['program']) {
269 $details[] = '« ' . $education['program'] . ' »';
271 if ($education['fieldid']) {
272 $details[] = $fieldsList[$education['fieldid']];
274 if (count($details)) {
275 $educations[$id] .= ' (' . implode(', ', $details) . ')';
278 return implode(', ', $educations);
282 class ProfileSettingMainEdu
implements ProfileSetting
286 public function __construct()
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'
297 public function value(ProfilePage
$page, $field, $value, &$success)
300 if (is_null($value)) {
302 $value = XDB
::fetchAllAssoc("SELECT degreeid, fieldid, promo_year, program
303 FROM profile_education
304 WHERE pid = {?} AND FIND_IN_SET('primary', flags)
308 foreach ($value as &$item) {
309 $item['cycle'] = $this->cycles
[$item['degreeid']];
311 } elseif (!is_array($value)) {
314 foreach ($value as $key => $item) {
315 if (!isset($item['degreeid'])) {
324 public function save(ProfilePage
$page, $field, $value)
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']);
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'] . ' »';
343 if ($education['fieldid']) {
344 $details[] = $fieldsList[$education['fieldid']];
347 return implode(', ', $educations);
351 class ProfileSettingEmailDirectory
implements ProfileSetting
353 public function __construct(){}
354 public function save(ProfilePage
$page, $field, $value){}
356 public function value(ProfilePage
$page, $field, $value, &$success)
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');
369 $p->assign('email_error', '0');
375 public function getText($value) {
380 class ProfileSettingNetworking
implements ProfileSetting
387 public function __construct()
389 $this->email
= new ProfileSettingEmail();
390 $this->pub
= new ProfileSettingPub();
391 $this->web
= new ProfileSettingWeb();
392 $this->number
= new ProfileSettingNumber();
395 public function value(ProfilePage
$page, $field, $value, &$success)
397 if (is_null($value)) {
398 $value = XDB
::fetchAllAssoc("SELECT n.address, n.pub, n.nwid AS type
399 FROM profile_networking AS n
403 if (!is_array($value)) {
406 $filters = XDB
::fetchAllAssoc('type', 'SELECT filter, nwid AS type, name
407 FROM profile_networking_enum;');
409 foreach($value as $i=>&$network) {
410 if (!trim($network['address'])) {
413 if (!isset($network['pub'])) {
414 $network['pub'] = 'private';
416 $network['error'] = false
;
417 $network['pub'] = $this->pub
->value($page, 'pub', $network['pub'], $s);
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);
429 $network['error'] = true
;
436 public function save(ProfilePage
$page, $field, $value)
438 XDB
::execute("DELETE FROM profile_networking
441 if (!count($value)) {
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']);
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']] . ')';
458 return implode(', ' , $networkings);
462 class ProfileSettingPromo
implements ProfileSetting
464 public function __construct(){}
466 public function save(ProfilePage
$page, $field, $value)
468 $gradYearNew = $value;
469 if ($page->profile
->mainEducation() == 'X') {
470 $gradYearNew +
= $page->profile
->mainEducationDuration();
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
478 $page->profile
->mainEducation() . strval($value), $page->profile
->id());
479 XDB
::execute('UPDATE profile_education
481 WHERE pid = {?} AND FIND_IN_SET(\'primary\', flags)',
482 $gradYearNew, $page->profile
->id());
483 Platal
::page()->trigSuccess('Ton statut « orange » a été supprimé.');
485 $myorange = new OrangeReq(S
::user(), $page->profile
, $gradYearNew);
487 Platal
::page()->trigSuccess('Tu pourras changer l\'affichage de ta promotion dès que ta nouvelle promotion aura été validée.');
491 public function value(ProfilePage
$page, $field, $value, &$success)
493 $entryYear = $page->profile
->entry_year
;
494 $gradYear = $page->profile
->grad_year
;
495 $yearpromo = $page->profile
->yearpromo();
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);
504 $promoChoice[] = $page->profile
->mainEducation() . strval($i +
$page->profile
->mainEducationDuration());
507 Platal
::page()->assign('promo_choice', $promoChoice);
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();
519 if ($value < 1000 ||
$value > 9999) {
520 Platal
::page()->trigError('L\'année de sortie doit être un nombre de quatre chiffres.');
522 } elseif ($gradYearNew < $entryYear +
$page->profile
->mainEducationDuration()) {
523 Platal
::page()->trigError('Trop tôt !');
526 return intval($value);
529 public function getText($value) {
535 class ProfilePageGeneral
extends ProfilePage
537 protected $pg_template = 'profile/general.tpl';
539 public function __construct(PlWizard
$wiz)
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']
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
);
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
);
568 $this->settings
['yourself'] = null
;
569 $this->settings
['birthdate'] = new ProfileSettingDate();
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
;
582 protected function _fetchData()
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,
590 INNER JOIN profile_display AS pd ON (pd.pid = p.pid)
591 WHERE p.pid = {?}", $this->pid());
592 $this->values
= $res->fetchOneAssoc();
594 // Retreive photo informations
595 $res = XDB
::query("SELECT pub
597 WHERE pid = {?}", $this->pid());
598 if ($res->numRows() == 0) {
599 $this->values
['photo_pub'] = 'private';
601 $this->values
['photo_pub'] = $res->fetchOneCell();
605 $res = XDB
::query("SELECT COUNT(*)
607 WHERE type = 'photo' AND pid = {?}",
609 $this->values
['nouvellephoto'] = $res->fetchOneCell();
611 $this->values
['nouvellephoto'] = 0;
615 protected function _saveData()
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
;
623 if ($this->values
['nationality2'] == "") {
624 $this->values
['nationality2'] = $this->values
['nationality3'];
625 $this->values
['nationality3'] = NULL
;
627 if ($this->values
['nationality1'] == "") {
628 $this->values
['nationality1'] = $this->values
['nationality2'];
629 $this->values
['nationality2'] = $this->values
['nationality3'];
630 $this->values
['nationality3'] = NULL
;
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
;
644 $new_email = ($this->values
['email_directory'] == "new@example.org") ?
645 $this->values
['email_directory_new'] : $this->values
['email_directory'];
646 if ($new_email == "") {
650 XDB
::execute("UPDATE profiles
651 SET nationality1 = {?}, nationality2 = {?}, nationality3 = {?}, birthdate = {?},
652 freetext = {?}, freetext_pub = {?}, email_directory = {?}
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());
658 if ($this->changed
['photo_pub']) {
659 XDB
::execute("UPDATE profile_photos
662 $this->values
['photo_pub'], $this->pid());
664 if (S
::user()->isMe($this->owner
) && $this->changed
['yourself']) {
666 XDB
::execute('UPDATE accounts
667 SET display_name = {?}
669 $this->values
['yourself'], $this->owner
->id());
671 XDB
::execute('UPDATE profile_display
673 WHERE pid = {?}', $this->values
['yourself'],
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
685 $this->values
['promo_display'], $this->pid());
686 XDB
::execute('UPDATE profile_education
688 WHERE pid = {?} AND FIND_IN_SET(\'primary\', flags)',
689 $yearpromo, $this->pid());
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();
701 $this->owner
->clear(true
);
704 /* deathdate_rec was not NULL, this is just an update of the death date
706 XDB
::execute('UPDATE profiles
709 ProfileSettingDate
::toSQLDate($this->values
['deathdate']), $this->pid());
714 public function _prepare(PlPage
$page, $id)
716 require_once "education.func.inc.php";
718 $res = XDB
::query("SELECT id, field
719 FROM profile_education_field_enum
721 $page->assign('edu_fields', $res->fetchAllAssoc());
723 require_once "emails.combobox.inc.php";
724 fill_email_combobox($page, array('source', 'redirect', 'job', 'directory'), $this->owner
);
726 $res = XDB
::query("SELECT nw.nwid AS type, nw.name
727 FROM profile_networking_enum AS nw
729 $page->assign('network_list', $res->fetchAllAssoc());
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);
738 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: