Moves user_reindex to Profile.
[platal.git] / include / name.func.inc.php
index ddb85a1..f1f3f68 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2009 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-function build_names_display($data)
+function build_javascript_names($data)
 {
     $data_array = explode(';;', $data);
     $n = count($data_array);
     $n--;
     for ($i = 0; $i < $n; $i++) {
         $searchname = explode(';', $data_array[$i]);
-        if ($searchname[1] != 0) {
-            list($particle, $name) = explode(' ', $searchname[2], 2);
-            if (!$name) {
-                list($particle, $name) = explode('\'', $searchname[2], 2);
-            }
-        } else {
-            $particle = '';
-            $name     = $searchname[2];
-        }
-        if (!isset($search_names[$searchname[0]])) {
-            $search_names[$searchname[0]] = array($searchname[2], $name);
+        if (isset($search_names[$searchname[0]])) {
+            $search_names[$searchname[0]][] = $searchname[1];
         } else {
-            $search_names[$searchname[0]] = array_merge($search_names[$searchname[0]], array($name));
+            $search_names[$searchname[0]] = array('fullname' => $searchname[1]);
         }
     }
+
     $sn_types_public  = build_types('public');
     $sn_types_private = build_types('private');
     $full_name        = build_full_name($search_names, $sn_types_public);
     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_display_names(&$display_names, $search_names, $private_name_end = null, &$alias = null)
+{
+    $sn_types_public  = build_types('public');
+    $full_name        = build_full_name($search_names, $sn_types_public);
+    $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)
+function build_types($pub = null)
 {
     if ($pub == 'public') {
         $sql_pub = "AND FIND_IN_SET('public', flags)";
@@ -57,13 +60,17 @@ 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;
 }
@@ -71,28 +78,29 @@ function build_types($pub)
 function build_full_name(&$search_names, &$sn_types)
 {
     $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['Nom marital']])) {
+    if (isset($search_names[$sn_types['lastname_marital']])
+        || isset($search_names[$sn_types['pseudonym']])) {
+        $name .= " (";
+        if (isset($search_names[$sn_types['lastname_marital']])) {
             $user = S::user();
             if ($user->isFemale()) {
-                $name .= " (Mme ";
+                $name .= "Mme ";
             } else {
-                $name .= " (M ";
+                $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 .= ")";
     }
@@ -101,44 +109,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['name_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++;
             }
         }
@@ -149,37 +157,134 @@ 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 = make_username($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)
+{
+    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'], S::v('uid'));
+}
+
+function build_sn_pub()
+{
+    $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",
+                        S::i('uid'));
+    $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;
+}
+
+function set_alias_names(&$sn_new, $sn_old, $update_new = false, $new_alias = null)
+{
+    $has_new = false;
+    foreach ($sn_new as $typeid => $sn) {
+        if (isset($sn['pub'])) {
+            if (isset($sn_old[$typeid]) && ($sn_old[$typeid]['fullname'] == $sn['fullname'] && $update_new)) {
+                XDB::execute("UPDATE  profile_name
+                                 SET  particle = {?}, name = {?}, typeid = {?}
+                               WHERE  id = {?} AND pid = {?}",
+                             $sn['particle'], $sn['name'], $typeid, $sn_old[$typeid]['id'], S::i('uid'));
+                unset($sn_old[$typeid]);
+            } elseif ($update_new
+                      || (isset($sn_old[$typeid]) && $sn_old[$typeid]['fullname'] == $sn['fullname'])) {
+                XDB::execute("INSERT INTO  profile_name (particle, name, typeid, pid)
+                                   VALUES  ({?}, {?}, {?}, {?})",
+                             $sn['particle'], $sn['name'], $typeid, S::i('uid'));
+                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, S::i('uid'));
+            }
+            $i = 0;
+            while (isset($sn[$i])) {
+                XDB::execute("INSERT INTO  profile_name (particle, name, typeid, pid)
+                                   VALUES  ('', {?}, {?}, {?})",
+                             $sn[$i], $typeid, S::i('uid'));
+                $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, S::i('uid'));
+            }
+        } else {
+            foreach ($sn_old as $typeid => $sn) {
+                XDB::execute("DELETE FROM  profile_name
+                                    WHERE  pid = {?} AND id = {?}",
+                             S::i('uid'), $sn['id']);
+            }
+        }
+    }
+    if ($update_new) {
+        XDB::execute("DELETE FROM  aliases
+                            WHERE  FIND_IN_SET('usage', flags) AND id = {?}",
+                     S::i('uid'));
+    }
+    if ($new_alias) {
+        XDB::execute("INSERT INTO  aliases (alias, type, flags, id)
+                           VALUES  ({?}, 'alias', 'usage', {?})",
+                     $new_alias, S::i('uid'));
+    }
+    Profile::rebuildSearchTokens(S::i('uid'));
+    return $has_new;
+}
+
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
 ?>