+class ProfileSettingHobby implements ProfileSetting
+{
+ private $pub;
+ static private $type = array('Sport', 'Loisir', 'Hobby');
+
+ public function __construct()
+ {
+ $this->pub = new ProfileSettingPub();
+ }
+
+ public function value(ProfilePage $page, $field, $value, &$success)
+ {
+ $success = true;
+ if (is_null($value)) {
+ $value = XDB::fetchAllAssoc('SELECT type, text, pub
+ FROM profile_hobby
+ WHERE pid = {?}',
+ $page->pid());
+ }
+ if (!is_array($value)) {
+ return array();
+ }
+ foreach($value as $i => &$hobby) {
+ $hobby['text'] = trim($hobby['text']);
+ if (!$hobby['text'] ||!in_array($hobby['type'], self::$type)) {
+ unset($value[$i]);
+ } else {
+ if (!isset($hobby['pub'])) {
+ $hobby['pub'] = 'private';
+ }
+ $s = true;
+ $hobby['pub'] = $this->pub->value($page, 'pub', $hobby['pub'], $s);
+ $success = $success && $s;
+ }
+ }
+ return $value;
+ }
+
+ public function save(ProfilePage $page, $field, $value)
+ {
+ XDB::execute('DELETE FROM profile_hobby
+ WHERE pid = {?}',
+ $page->pid());
+ if (!count($value)) {
+ return;
+ }
+ foreach ($value as $id => $hobby) {
+ XDB::execute("INSERT INTO profile_hobby (pid, id, type, text, pub)
+ VALUES ({?}, {?}, {?}, {?}, {?})",
+ $page->pid(), $id, $hobby['type'], $hobby['text'], $hobby['pub']);
+ }
+ }
+
+ public function getText($value) {
+ static $pubs = array('public' => 'publique', 'private' => 'privé');
+ $hobbies = array();
+ foreach (self::$type as $type) {
+ $hobbies[$type] = array();
+ }
+ foreach ($value as $hobby) {
+ $hobbies[$hobby['type']][] = $hobby['text'] . ' (affichage ' . $pubs[$hobby['pub']] . ')';
+ }
+ $text = array();
+ foreach (self::$type as $type) {
+ if (!empty($hobbies[$type])) {
+ $text[] = $hobbies[$type] . ' : ' . implode(', ' , $hobbies[$type]);
+ }
+ }
+ return implode(', ' , $text);
+ }
+}
+
+
+class ProfileSettingPromo implements ProfileSetting
+{
+ public function __construct(){}
+
+ public function save(ProfilePage $page, $field, $value)
+ {
+ $gradYearNew = $value;
+ if ($page->profile->mainEducation() == 'X') {
+ $gradYearNew += $page->profile->mainEducationDuration();
+ }
+ if (($page->profile->mainEducation() != 'X'
+ && $value == $page->profile->entry_year + $page->profile->mainEducationDuration())
+ || ($page->profile->mainEducation() == 'X' && $value == $page->profile->entry_year)) {
+ XDB::execute('UPDATE profile_display
+ SET promo = {?}
+ WHERE pid = {?}',
+ $page->profile->mainEducation() . strval($value), $page->profile->id());
+ XDB::execute('UPDATE profile_education
+ SET grad_year = {?}
+ WHERE pid = {?} AND FIND_IN_SET(\'primary\', flags)',
+ $gradYearNew, $page->profile->id());
+ Platal::page()->trigSuccess('Ton statut « orange » a été supprimé.');
+ } else {
+ $myorange = new OrangeReq(S::user(), $page->profile, $gradYearNew);
+ $myorange->submit();
+ Platal::page()->trigSuccess('Tu pourras changer l\'affichage de ta promotion dès que ta nouvelle promotion aura été validée.');
+ }
+ }
+
+ public function value(ProfilePage $page, $field, $value, &$success)
+ {
+ $entryYear = $page->profile->entry_year;
+ $gradYear = $page->profile->grad_year;
+ $yearpromo = $page->profile->yearpromo();
+ $success = true;
+ if (is_null($value) || $value == $yearpromo) {
+ if ($gradYear != $entryYear + $page->profile->mainEducationDuration()) {
+ $promoChoice = array();
+ for ($i = $entryYear; $i <= $gradYear - $page->profile->mainEducationDuration(); ++$i) {
+ if ($page->profile->mainEducation() == 'X') {
+ $promoChoice[] = $page->profile->mainEducation() . strval($i);
+ } else {
+ $promoChoice[] = $page->profile->mainEducation() . strval($i + $page->profile->mainEducationDuration());
+ }
+ }
+ Platal::page()->assign('promo_choice', $promoChoice);
+ }
+
+ // If this profile belongs to an X, return grad year minus education duration.
+ if ($page->profile->mainEducation() == 'X') {
+ return $gradYear - $page->profile->mainEducationDuration();
+ }
+
+ return $gradYear;
+ }
+
+ // If this profile belongs to an X, $promoNew needs to be changed to
+ // the graduation year.
+ $gradYearNew = $value;
+ if ($page->profile->mainEducation() == 'X') {
+ $gradYearNew += $page->profile->mainEducationDuration();
+ }
+
+ if ($value < 1000 || $value > 9999) {
+ Platal::page()->trigError('L\'année de sortie doit être un nombre de quatre chiffres.');
+ $success = false;
+ } elseif ($gradYearNew < $entryYear + $page->profile->mainEducationDuration()) {
+ Platal::page()->trigError('Trop tôt !');
+ $success = false;
+ }
+ return intval($value);
+ }
+
+ public function getText($value) {
+ return $value;
+ }
+}
+
+
+class ProfilePageGeneral extends ProfilePage