X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=include%2Fname.func.inc.php;h=8ac831de039255739b9746ebc79dde6fd82a74b8;hb=54722967b9b605dca8cff67fc3a050194beba368;hp=53d4241df8a70f3416b8692f0330ad34d2d1cda2;hpb=c4b453748e0affd8711c3a7a95ab6beaad2c2834;p=platal.git diff --git a/include/name.func.inc.php b/include/name.func.inc.php index 53d4241..8ac831d 100644 --- a/include/name.func.inc.php +++ b/include/name.func.inc.php @@ -1,6 +1,6 @@ $searchname[1]); } } + $sn_types_public = build_types('public'); $sn_types_private = build_types('private'); - $full_name = build_full_name($search_names, $sn_types_public); + $full_name = build_full_name($search_names, $sn_types_public, $isFemale); return build_public_name($search_names, $sn_types_public, $full_name) . ';' . - build_private_name($search_names, $sn_types_private); + build_private_name($search_names, $sn_types_private); } -function build_types($pub) +function build_display_names(&$display_names, $search_names, $isFemale, $private_name_end = null, &$alias = null) +{ + $sn_types_public = build_types('public'); + $full_name = build_full_name($search_names, $sn_types_public, $isFemale); + $display_names['public_name'] = build_public_name($search_names, $sn_types_public, $full_name); + $display_names['private_name'] = $display_names['public_name'] . $private_name_end; + $display_names['directory_name'] = build_directory_name($search_names, $sn_types_public, $full_name); + $display_names['short_name'] = build_short_name($search_names, $sn_types_public, $alias); + $display_names['sort_name'] = build_sort_name($search_names, $sn_types_public); +} + +function build_types($pub = null) { if ($pub == 'public') { $sql_pub = "AND FIND_IN_SET('public', flags)"; @@ -57,43 +60,46 @@ function build_types($pub) } else { $sql_pub = ""; } - $sql = "SELECT id, name - FROM profile_name_search_enum + $sql = "SELECT id, type, name + FROM profile_name_enum WHERE NOT FIND_IN_SET('not_displayed', flags)" . $sql_pub; $sn_types = XDB::iterator($sql); $types = array(); while ($sn_type = $sn_types->next()) { - $types[$sn_type['name']] = $sn_type['id']; + if ($pub) { + $types[$sn_type['type']] = $sn_type['id']; + } else { + $types[$sn_type['id']] = $sn_type['name']; + } } return $types; } -function build_full_name(&$search_names, &$sn_types) +function build_full_name(&$search_names, &$sn_types, $isFemale) { $name = ""; - if (isset($search_names[$sn_types['Nom usuel']])) { - $name .= $search_names[$sn_types['Nom usuel']][0] . " (" - . $search_names[$sn_types['Nom patronymique']][0] . ")"; + if (isset($search_names[$sn_types['lastname_ordinary']])) { + $name .= $search_names[$sn_types['lastname_ordinary']]['fullname'] . " (" + . $search_names[$sn_types['lastname']]['fullname'] . ")"; } else { - $name .= $search_names[$sn_types['Nom patronymique']][0]; + $name .= $search_names[$sn_types['lastname']]['fullname']; } - if (isset($search_names[$sn_types['Nom marital']]) - || isset($search_names[$sn_types['Pseudonyme (nom de plume)']])) { + if (isset($search_names[$sn_types['lastname_marital']]) + || isset($search_names[$sn_types['pseudonym']])) { $name .= " ("; - if (isset($search_names[$sn_types['Nom marital']])) { - $user = S::user(); - if ($user->isFemale()) { + if (isset($search_names[$sn_types['lastname_marital']])) { + if ($isFemale) { $name .= "Mme "; } else { $name .= "M "; } - $name .= $search_names[$sn_types['Nom marital']][0]; - if (isset($search_names[$sn_types['Pseudonyme (nom de plume)']])) { + $name .= $search_names[$sn_types['lastname_marital']]['fullname']; + if (isset($search_names[$sn_types['pseudonym']])) { $name .= ", "; } } - if (isset($search_names[$sn_types['Pseudonyme (nom de plume)']])) { - $name .= $search_names[$sn_types['Pseudonyme (nom de plume)']][0]; + if (isset($search_names[$sn_types['pseudonym']])) { + $name .= $search_names[$sn_types['pseudonym']]['fullname']; } $name .= ")"; } @@ -102,44 +108,44 @@ function build_full_name(&$search_names, &$sn_types) function build_public_name(&$search_names, &$sn_types, $full_name) { - return $search_names[$sn_types['Prénom']][0] . " " . $full_name; + return $search_names[$sn_types['firstname']]['fullname'] . " " . $full_name; } function build_private_name(&$search_names, &$sn_types) { $name = ""; - if (isset($search_names[$sn_types['Surnom']]) - || (isset($search_names[$sn_types['Autre prénom']]) - || isset($search_names[$sn_types['Autre nom']]))) { + if (isset($search_names[$sn_types['nickname']]) + || (isset($search_names[$sn_types['name_other']]) + || isset($search_names[$sn_types['name_other']]))) { $name .= " ("; - if (isset($search_names[$sn_types['Surnom']])) { - $name .= "alias " . $search_names[$sn_types['Surnom']][0]; - $i = 2; - while (isset($search_names[$sn_types['Surnom']][$i])) { - $name .= ", " . $search_names[$sn_types['Surnom']][$i]; + if (isset($search_names[$sn_types['nickname']])) { + $name .= "alias " . $search_names[$sn_types['nickname']]['fullname']; + $i = 0; + while (isset($search_names[$sn_types['nickname']][$i])) { + $name .= ", " . $search_names[$sn_types['nickname']][$i]; $i++; } - if (isset($search_names[$sn_types['Autre prénom']]) - || isset($search_names[$sn_types['Autre nom']])) { + if (isset($search_names[$sn_types['name_other']]) + || isset($search_names[$sn_types['firstname_other']])) { $name .= ", "; } } - if (isset($search_names[$sn_types['Autre prénom']])) { - $name .= "autres prénoms : " . $search_names[$sn_types['Autre prénom']][0]; - $i = 2; - while (isset($search_names[$sn_types['Autre prénom']][$i])) { - $name .= ", " . $search_names[$sn_types['Autre prénom']][$i]; + if (isset($search_names[$sn_types['firstname_other']])) { + $name .= "autres prénoms : " . $search_names[$sn_types['firstname_other']]['fullname']; + $i = 0; + while (isset($search_names[$sn_types['firstname_other']][$i])) { + $name .= ", " . $search_names[$sn_types['firstname_other']][$i]; $i++; } - if (isset($search_names[$sn_types['Autre nom']])) { + if (isset($search_names[$sn_types['name_other']])) { $name .= ", "; } } - if (isset($search_names[$sn_types['Autre nom']])) { - $name .= "autres noms : " . $search_names[$sn_types['Autre nom']][0]; - $i = 2; - while (isset($search_names[$sn_types['Autre nom']][$i])) { - $name .= ", " . $search_names[$sn_types['Autre nom']][$i]; + if (isset($search_names[$sn_types['name_other']])) { + $name .= "autres noms : " . $search_names[$sn_types['name_other']]['fullname']; + $i = 0; + while (isset($search_names[$sn_types['name_other']][$i])) { + $name .= ", " . $search_names[$sn_types['name_other']][$i]; $i++; } } @@ -150,37 +156,162 @@ function build_private_name(&$search_names, &$sn_types) function build_directory_name(&$search_names, &$sn_types, $full_name) { - return $full_name . " " . $search_names[$sn_types['Prénom']][0]; + return $full_name . " " . $search_names[$sn_types['firstname']]['fullname']; } -function short_name(&$search_names, &$sn_types) +function build_short_name(&$search_names, &$sn_types, &$alias = null) { - $name = ""; - if (isset($search_names[$sn_types['Nom usuel']])) { - $name .= $search_names[$sn_types['Nom usuel']][0]; + if (isset($search_names[$sn_types['lastname_ordinary']])) { + $lastname = $search_names[$sn_types['lastname_ordinary']]['fullname']; } else { - $name .= $search_names[$sn_types['Nom patronymique']][0]; + $lastname = $search_names[$sn_types['lastname']]['fullname']; } - $name = " "; - if (isset($search_names[$sn_types['Prénom usuel']])) { - $name .= $search_names[$sn_types['Prénom usuel']][0]; + if (isset($search_names[$sn_types['firstname_ordinary']])) { + $firstname = $search_names[$sn_types['firstname_ordinary']]['fullname']; } else { - $name .= $search_names[$sn_types['Prénom']][0]; + $firstname = $search_names[$sn_types['firstname']]['fullname']; } - return $name; + if ($alias) { + $alias = PlUser::makeUserName($firstname, $lastname); + } + return $firstname . " " . $lastname; } -function sort_name(&$search_names, &$sn_types) +function build_sort_name(&$search_names, &$sn_types) { $name = ""; - if (isset($search_names[$sn_types['Nom usuel']])) { - $name .= $search_names[$sn_types['Nom usuel']][1]; + if (isset($search_names[$sn_types['lastname_ordinary']])) { + $name .= $search_names[$sn_types['lastname_ordinary']]['name']; } else { - $name .= $search_names[$sn_types['Nom patronymique']][1]; + $name .= $search_names[$sn_types['lastname']]['name']; } - $name .= $search_names[$sn_types['Prénom']][0]; + $name .= " " . $search_names[$sn_types['firstname']]['fullname']; return $name; } +function set_profile_display(&$display_names, Profile $profile) +{ + XDB::execute("UPDATE profile_display + SET public_name = {?}, private_name = {?}, + directory_name = {?}, short_name = {?}, sort_name = {?} + WHERE pid = {?}", + $display_names['public_name'], $display_names['private_name'], + $display_names['directory_name'], $display_names['short_name'], + $display_names['sort_name'], $profile->id()); + + $owner = $profile->owner(); + if ($owner) { + XDB::execute('UPDATE accounts + SET full_name = {?}, directory_name = {?} + WHERE uid = {?}', + $display_names['public_name'], $display_names['directory_name'], $owner->id()); + } +} + +function build_sn_pub($pid) +{ + $res = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS fullname, sn.typeid, + sn.particle, sn.name, sn.id + 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) + AND FIND_IN_SET('public', e.flags) + ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name", + $pid); + $sn_old = array(); + while ($old = $res->next()) { + $sn_old[$old['typeid']] = array('fullname' => $old['fullname'], + 'name' => $old['name'], + 'particle' => $old['particle'], + 'id' => $old['id']); + } + return $sn_old; +} + +/** Transform a name to its canonical value so it can be compared + * to another form (different case, with accents or with - instead + * of blanks). + * @see compare_basename to compare + */ +function name_to_basename($value) { + $value = mb_strtoupper(replace_accent($value)); + return preg_replace('/[^A-Z]/', ' ', $value); +} + +/** Compares two strings and check if they are two forms of the + * same name (different case, with accents or with - instead of + * blanks). + * @see name_to_basename to retreive the compared string + */ +function compare_basename($a, $b) { + return name_to_basename($a) == name_to_basename($b); +} + +function set_alias_names(&$sn_new, $sn_old, $pid, PlUser $user, $update_new = false, $new_alias = null) +{ + $has_new = false; + foreach ($sn_new as $typeid => $sn) { + if (isset($sn['pub']) && !is_null($sn['fullname'])) { + if (isset($sn_old[$typeid]) && $update_new) { + XDB::execute("UPDATE profile_name + SET particle = {?}, name = {?}, typeid = {?} + WHERE id = {?} AND pid = {?}", + $sn['particle'], $sn['name'], $typeid, $sn_old[$typeid]['id'], $pid); + unset($sn_old[$typeid]); + } elseif ($sn['fullname'] == $sn_old[$typeid]['fullname'] && $sn['name'] == $sn_old[$typeid]['name']) { + XDB::execute('INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ({?}, {?}, {?}, {?})', + $sn_old[$typeid]['particle'], $sn_old[$typeid]['name'], $typeid, $pid); + unset($sn_old[$typeid]); + } else { + $has_new = true; + } + } else { + if ($sn['fullname'] != '') { + XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ('', {?}, {?}, {?})", + $sn['fullname'], $typeid, $pid); + } + $i = 0; + while (isset($sn[$i])) { + XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ('', {?}, {?}, {?})", + $sn[$i], $typeid, $pid); + $i++; + } + } + } + if (count($sn_old) > 0) { + if (!$update_new) { + $has_new = true; + foreach ($sn_old as $typeid => $sn) { + XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ({?}, {?}, {?}, {?})", + $sn['particle'], $sn['name'], $typeid, $pid); + } + } else { + foreach ($sn_old as $typeid => $sn) { + XDB::execute("DELETE FROM profile_name + WHERE pid = {?} AND id = {?}", + $pid, $sn['id']); + } + } + } + if ($update_new) { + XDB::execute('DELETE FROM email_source_account + WHERE FIND_IN_SET(\'usage\', flags) AND uid = {?} AND type = \'alias\'', + $user->id()); + } + if ($new_alias) { + XDB::execute('INSERT INTO email_source_account (email, uid, type, flags, domain) + SELECT {?}, {?}, \'alias\', \'usage\', id + FROM email_virtual_domains + WHERE name = {?}', + $new_alias, $user->id(), $user->mainEmailDomain()); + } + Profile::rebuildSearchTokens($pid, false); + return $has_new; +} + // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: ?>