+ $single_types = XDB::fetchAllAssoc('id',
+ 'SELECT id, 0
+ FROM profile_name_enum
+ WHERE NOT FIND_IN_SET(\'allow_duplicates\', flags)');
+
+ foreach ($value as $key => $item) {
+ if (isset($single_types[$item['typeid']])) {
+ if ($single_types[$item['typeid']] === true) {
+ unset($value[$key]);
+ } else {
+ $single_types[$item['typeid']] = true;
+ }
+ }
+ }
+
+ return $value;
+ }
+
+ public function value(ProfilePage &$page, $field, $value, &$success)
+ {
+ $success = true;
+ $success_tmp = true;
+
+ if (is_null($value)) {
+ $sn_all = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS name,
+ sn.particle, sn.typeid, e.type, e.name AS type_name,
+ FIND_IN_SET('has_particle', e.flags) AS has_particle,
+ FIND_IN_SET('always_displayed', e.flags) AS always_displayed,
+ FIND_IN_SET('public', e.flags) AS pub
+ FROM profile_name AS sn
+ INNER JOIN profile_name_enum AS e ON (e.id = sn.typeid)
+ WHERE sn.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags)
+ ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name",
+ $page->pid());
+
+ $sn_types = XDB::iterator("SELECT id, type, name,
+ FIND_IN_SET('has_particle', flags) AS has_particle
+ FROM profile_name_enum
+ WHERE NOT FIND_IN_SET('not_displayed', flags)
+ AND FIND_IN_SET('always_displayed', flags)
+ ORDER BY id");
+
+ $value = array();
+ $sn = $sn_all->next();
+ while ($sn_type = $sn_types->next()) {
+ if ($sn_type['id'] == $sn['typeid']) {
+ $value[] = $sn;
+ if ($sn) {
+ $sn = $sn_all->next();
+ }
+ } else {
+ $value[] = array('name' => '',
+ 'particle' => '',
+ 'typeid' => $sn_type['id'],
+ 'type' => $sn_type['type'],
+ 'type_name' => $sn_type['name'],
+ 'has_particle' => $sn_type['has_particle'],
+ 'always_displayed' => 1,
+ 'pub' => 1);
+ }
+ }
+ if ($sn) {
+ do {
+ $value[] = $sn;
+ } while ($sn = $sn_all->next());
+ }
+ $value = $this->clean($value);
+ } else {
+ require_once 'name.func.inc.php';
+
+ $value = $this->clean($value);
+ $res = XDB::query("SELECT s.particle, s.name
+ FROM profile_name AS s
+ INNER JOIN profile_name_enum AS e ON (e.id = s.typeid)
+ WHERE s.pid = {?} AND e.type LIKE '%ini'
+ ORDER BY e.type = 'firstname_ini'",
+ $page->pid());
+ $res = $res->fetchAllAssoc();
+ $initial = array();
+ $initial['lastname'] = $res[0]['particle'] . $res[0]['name'];
+ $initial['firstname'] = $res[1]['name'];
+ $sn_types = build_types();
+ $this->search_names = array();
+ foreach ($value as &$sn) {
+ $sn['name'] = trim($sn['name']);
+ if ($sn['type'] == 'firstname' || $sn['type'] == 'lastname') {
+ $sn['name'] = $this->prepare($page, $sn['type'], $sn['name'],
+ $initial[$sn['type']], $success_tmp);
+ $success = $success && $success_tmp;
+ }
+ if ($sn['pub']) {
+ if (isset($sn['particle']) && ($sn['particle'] != '')) {
+ list($particle, $name) = explode(' ', $sn['name'], 2);
+ $particle = trim($particle) . ' ';
+ if (!$name) {
+ list($particle, $name) = explode('\'', $sn['name'], 2);
+ $particle = trim($particle);
+ }
+ } else {
+ $particle = '';
+ $name = $sn['name'];
+ }
+ }
+ if ($sn['name'] != '') {
+ if ($sn['pub']) {
+ $this->search_names[$sn['typeid']] = array('fullname' => $sn['name'],
+ 'name' => $name,
+ 'particle' => $particle,
+ 'pub' => $sn['pub']);
+ } else {
+ if (isset($this->search_names[$sn['typeid']])) {
+ $this->search_names[$sn['typeid']][] = $sn['name'];
+ } else {
+ $this->search_names[$sn['typeid']] = array('fullname' => $sn['name']);
+ }
+ $sn['type_name'] = $sn_types[$sn['typeid']];
+ }
+ }
+ }
+ $res = XDB::query("SELECT public_name, private_name
+ FROM profile_display
+ WHERE pid = {?}",
+ S::v('uid'));
+ list($public_name, $private_name) = $res->fetchOneRow();
+ if ($success) {
+ $sn_types_private = build_types('private');
+ $this->private_name_end = build_private_name($this->search_names, $sn_types_private);
+ $private_name = $public_name . $this->private_name_end;
+ }
+ Platal::page()->assign('public_name', $public_name);
+ Platal::page()->assign('private_name', $private_name);
+ }
+
+ return $value;
+ }
+
+ public function save(ProfilePage &$page, $field, $value)
+ {
+ require_once 'name.func.inc.php';
+ $sn_old = build_sn_pub($page->pid());
+ XDB::execute("DELETE FROM s
+ USING profile_name AS s
+ INNER JOIN profile_name_enum AS e ON (s.typeid = e.id)
+ WHERE s.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags)",
+ $page->pid());
+ $has_new = set_alias_names($this->search_names, $sn_old, $page->pid(), $page->owner->id());
+
+ // Only requires validation if modification in public names
+ if ($has_new) {
+ $new_names = new NamesReq(S::user(), $this->search_names, $this->private_name_end);
+ $new_names->submit();
+ Platal::page()->trigWarning('La demande de modification de tes noms a bien été prise en compte.' .
+ ' Tu recevras un email dès que ces changements auront été effectués.');
+ } else {
+ $display_names = array();
+ build_display_names($display_names, $this->search_names,
+ $page->profile->isFemale(), $this->private_name_end);
+ set_profile_display($display_names, $page->pid());
+ }