Adds name validation and new alias creation.
authorStéphane Jacob <jacou@melix.net>
Wed, 14 Jan 2009 06:31:04 +0000 (07:31 +0100)
committerStéphane Jacob <jacou@melix.net>
Fri, 16 Jan 2009 01:24:33 +0000 (02:24 +0100)
htdocs/javascript/profile.js
include/name.func.inc.php
include/validations/names.inc.php [moved from include/validations/nomusage.inc.php with 50% similarity]
modules/profile.php
modules/profile/general.inc.php
templates/include/form.valid.names.tpl [moved from templates/include/form.valid.nomusage.tpl with 75% similarity]
templates/profile/nomusage.tpl [deleted file]

index b54277f..b882b2d 100644 (file)
@@ -155,7 +155,6 @@ function updateNameDisplay()
     for (var i = 0; i < 10; i++) {
         if ($('#search_name_' + i).find(':text').val()) {
             searchnames += $('#search_name_' + i).find('[name*=typeid]').val() + ';';
-            searchnames += $('#search_name_' + i).find(':checked').length-1 + ';';
             searchnames += $('#search_name_' + i).find(':text').val() + ';;';
         }
     }
index 53d4241..968e251 100644 (file)
  *  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)";
@@ -63,7 +66,11 @@ function build_types($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['name']] = $sn_type['id'];
+        } else {
+            $types[$sn_type['id']] = $sn_type['name'];
+        }
     }
     return $types;
 }
@@ -72,10 +79,10 @@ 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] . ")";
+        $name .= $search_names[$sn_types['Nom usuel']]['fullname'] . " ("
+              . $search_names[$sn_types['Nom patronymique']]['fullname'] . ")";
     } else {
-        $name .= $search_names[$sn_types['Nom patronymique']][0];
+        $name .= $search_names[$sn_types['Nom patronymique']]['fullname'];
     }
     if (isset($search_names[$sn_types['Nom marital']])
         || isset($search_names[$sn_types['Pseudonyme (nom de plume)']])) {
@@ -87,13 +94,13 @@ function build_full_name(&$search_names, &$sn_types)
             } else {
                 $name .= "M ";
             }
-            $name .= $search_names[$sn_types['Nom marital']][0];
+            $name .= $search_names[$sn_types['Nom marital']]['fullname'];
             if (isset($search_names[$sn_types['Pseudonyme (nom de plume)']])) {
                 $name .= ", ";
             }
         }
         if (isset($search_names[$sn_types['Pseudonyme (nom de plume)']])) {
-            $name .= $search_names[$sn_types['Pseudonyme (nom de plume)']][0];
+            $name .= $search_names[$sn_types['Pseudonyme (nom de plume)']]['fullname'];
         }
         $name .= ")";
     }
@@ -102,7 +109,7 @@ 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['Prénom']]['fullname'] . " " . $full_name;
 }
 
 function build_private_name(&$search_names, &$sn_types)
@@ -113,8 +120,8 @@ function build_private_name(&$search_names, &$sn_types)
         || isset($search_names[$sn_types['Autre nom']]))) {
         $name .= " (";
         if (isset($search_names[$sn_types['Surnom']])) {
-            $name .= "alias " . $search_names[$sn_types['Surnom']][0];
-            $i = 2;
+            $name .= "alias " . $search_names[$sn_types['Surnom']]['fullname'];
+            $i = 0;
             while (isset($search_names[$sn_types['Surnom']][$i])) {
                 $name .= ", " . $search_names[$sn_types['Surnom']][$i];
                 $i++;
@@ -125,8 +132,8 @@ function build_private_name(&$search_names, &$sn_types)
             }
         }
         if (isset($search_names[$sn_types['Autre prénom']])) {
-            $name .= "autres prénoms : " . $search_names[$sn_types['Autre prénom']][0];
-            $i = 2;
+            $name .= "autres prénoms : " . $search_names[$sn_types['Autre prénom']]['fullname'];
+            $i = 0;
             while (isset($search_names[$sn_types['Autre prénom']][$i])) {
                 $name .= ", " . $search_names[$sn_types['Autre prénom']][$i];
                 $i++;
@@ -136,8 +143,8 @@ function build_private_name(&$search_names, &$sn_types)
             }
         }
         if (isset($search_names[$sn_types['Autre nom']])) {
-            $name .= "autres noms : " . $search_names[$sn_types['Autre nom']][0];
-            $i = 2;
+            $name .= "autres noms : " . $search_names[$sn_types['Autre nom']]['fullname'];
+            $i = 0;
             while (isset($search_names[$sn_types['Autre nom']][$i])) {
                 $name .= ", " . $search_names[$sn_types['Autre nom']][$i];
                 $i++;
@@ -150,37 +157,128 @@ 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['Prénom']]['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];
+        $lastname = $search_names[$sn_types['Nom usuel']]['fullname'];
     } else {
-        $name .= $search_names[$sn_types['Nom patronymique']][0];
+        $lastname = $search_names[$sn_types['Nom patronymique']]['fullname'];
     }
-    $name = " ";
     if (isset($search_names[$sn_types['Prénom usuel']])) {
-        $name .= $search_names[$sn_types['Prénom usuel']][0];
+        $firstname = $search_names[$sn_types['Prénom usuel']]['fullname'];
     } else {
-        $name .= $search_names[$sn_types['Prénom']][0];
+        $firstname = $search_names[$sn_types['Prénom']]['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];
+        $name .= $search_names[$sn_types['Nom usuel']]['name'];
     } else {
-        $name .= $search_names[$sn_types['Nom patronymique']][1];
+        $name .= $search_names[$sn_types['Nom patronymique']]['name'];
     }
-    $name .= $search_names[$sn_types['Prénom']][0];
+    $name .= " " . $search_names[$sn_types['Prénom']]['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_search      AS sn
+                      INNER JOIN  profile_name_search_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_search
+                                 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_search (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_search (particle, name, typeid, pid)
+                                   VALUES  ('', {?}, {?}, {?})",
+                             $sn['fullname'], $typeid, S::i('uid'));
+            }
+        }
+    }
+    if (count($sn_old) > 0) {
+        if (!$update_new) {
+            $has_new = true;
+            foreach ($sn_old as $typeid => $sn) {
+                XDB::execute("INSERT INTO  profile_name_search (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_search
+                                    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'));
+    }
+    /*require_once('user.func.inc.php');
+    user_reindex($uid);*/
+    return $has_new;
+}
+
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
 ?>
similarity index 50%
rename from include/validations/nomusage.inc.php
rename to include/validations/names.inc.php
index 77b964b..b5b62ff 100644 (file)
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-// {{{ class UsageReq
+// {{{ class NamesReq4
 
-class UsageReq extends Validate
+class NamesReq extends Validate
 {
     // {{{ properties
 
     public $unique = true;
 
-    public $nom_usage;
-    public $alias = '';
+    public $sn_old;
+    public $sn_new;
+    public $display_names;
+    public $old_alias;
+    public $new_alias;
+    public $sn_types;
 
-    public $oldusage;
-    public $oldalias;
-
-    public $homonyme;
-    public $reason;
-
-    public $rules = "Refuser
-    tout ce qui n'est visiblement pas un nom de famille (ce qui est
-    extremement rare car à peu près n'importe quoi peut être un nom de
-    famille...)";
+    public $rules = "Refuser tout ce qui n'est visiblement pas un nom de famille (ce qui est extremement rare car à peu près n'importe quoi peut être un nom de famille).";
 
     // }}}
     // {{{ constructor
 
-    public function __construct(User &$_user, $_usage, $_reason)
+    public function __construct(User &$_user, $_search_names, $_private_name_end)
     {
         parent::__construct($_user, true, 'usage');
-        $this->nom_usage = $_usage;
-        $this->reason = $_reason;
-
-        $res = XDB::query("SELECT prenom FROM auth_user_md5 WHERE user_id = {?}", $this->user->id());
-        $this->alias = make_username($res->fetchOneCell(), $this->nom_usage);
-        if (!$this->nom_usage) {
-            $this->alias = "";
+        require_once 'name.func.inc.php';
+
+        $this->sn_types  = build_types();
+        $this->sn_old    = build_sn_pub();
+        $this->sn_new    = $_search_names;
+        $this->new_alias = true;
+        $this->display_names = array();
+
+        build_display_names($this->display_names, $_search_names, $_private_name_end, $this->new_alias);
+        foreach ($this->sn_new AS $key => &$sn) {
+            if (!isset($sn['pub'])) {
+                unset($this->sn_new[$key]);
+            }
+        }
+        $res = XDB::query("SELECT  alias
+                             FROM  aliases
+                            WHERE  id = {?} AND type = 'alias' AND FIND_IN_SET('usage', flags)",
+                          $this->user->id());
+        $this->old_alias  = $res->fetchOneCell();
+        if ($this->old_alias != $this->new_alias) {
+            $res = XDB::query("SELECT  id
+                                 FROM  aliases
+                                WHERE  alias = {?}",
+                              $this->new_alias);
+            if ($res->fetchOneCell()) {
+                $this->new_alias = null;
+            }
         }
-
-        $res = XDB::query("
-                SELECT  e.alias, u.nom_usage, a.id
-                  FROM  auth_user_md5 as u
-             LEFT JOIN  aliases       as e ON(e.type='alias' AND FIND_IN_SET('usage',e.flags) AND e.id = u.user_id)
-             LEFT JOIN  aliases       as a ON(a.alias = {?} AND a.id != u.user_id)
-                 WHERE  u.user_id = {?}", $this->alias, $this->user->id());
-        list($this->oldalias, $this->oldusage, $this->homonyme) = $res->fetchOneRow();
     }
 
     // }}}
@@ -70,7 +77,7 @@ class UsageReq extends Validate
 
     public function formu()
     {
-        return 'include/form.valid.nomusage.tpl';
+        return 'include/form.valid.names.tpl';
     }
 
     // }}}
@@ -78,7 +85,7 @@ class UsageReq extends Validate
 
     protected function _mail_subj()
     {
-        return "[Polytechnique.org/USAGE] Changement de nom d'usage";
+        return "[Polytechnique.org/NOMS] Changement de noms";
     }
 
     // }}}
@@ -88,23 +95,25 @@ class UsageReq extends Validate
     {
         global $globals;
         if ($isok) {
-            $res = "  Le changement de nom d'usage que tu as demandé vient d'être effectué.";
-            if ($this->oldalias) {
-                $res .= "\n\n  Les alias {$this->oldalias}@{$globals->mail->domain} et @{$globals->mail->domain2} ont été supprimés.";
-            }
-            if ($this->nom_usage) {
-                $res .= "\n\n  Les alias {$this->alias}@{$globals->mail->domain} et @{$globals->mail->domain2} sont maintenant à ta disposition !";
+            $res = "  Le changement de nom que tu as demandé vient d'être effectué.";
+            if ($this->old_alias != $this->new_alias) {
+                if ($this->old_alias) {
+                    $res .= "\n\n  Les alias {$this->old_alias}@{$globals->mail->domain} et @{$globals->mail->domain2} ont été supprimés.";
+                }
+                if ($this->new_alias) {
+                    $res .= "\n\n  Les alias {$this->new_alias}@{$globals->mail->domain} et @{$globals->mail->domain2} sont maintenant à ta disposition !";
+                }
             }
             if ($globals->mailstorage->googleapps_domain) {
                 require_once 'googleapps.inc.php';
                 $account = new GoogleAppsAccount($this->user);
                 if ($account->active()) {
-                    $res .= "\n\n  Si tu utilises Google Apps, tu peux changer ton nom d'usage sur https://mail.google.com/a/polytechnique.org/#settings/accounts";
+                    $res .= "\n\n  Si tu utilises Google Apps, tu peux changer ton nom d'usage sur https://mail.google.com/a/polytechnique.org/#settings/accounts.";
                 }
             }
             return $res;
         } else {
-            return "  La demande de changement de nom d'usage que tu avais faite a été refusée.";
+            return "  La demande de changement de nom que tu avais faite a été refusée.";
         }
     }
 
@@ -114,9 +123,11 @@ class UsageReq extends Validate
     public function commit()
     {
         require_once 'notifs.inc.php';
-        register_watch_op($this->user->id(), WATCH_FICHE, '', 'nom');
-        require_once('user.func.inc.php');
-        set_new_usage($this->user->id(), $this->nom_usage, $this->alias);
+        require_once('name.func.inc.php');
+
+        register_watch_op($this->user->id(), WATCH_FICHE, '', 'search_names');
+        set_profile_display($this->display_names);
+        set_alias_names($this->sn_new, $this->sn_old, true, $this->new_alias);
         return true;
     }
 
index 66343b5..da107c2 100644 (file)
@@ -48,7 +48,6 @@ class ProfileModule extends PLModule
             'profile/medal'              => $this->make_hook('medal',                      AUTH_PUBLIC),
             'profile/name_info'          => $this->make_hook('name_info',                  AUTH_PUBLIC),
             'profile/orange'             => $this->make_hook('p_orange',                   AUTH_MDP),
-            'profile/usage'              => $this->make_hook('p_usage',                    AUTH_MDP),
 
             'referent'                   => $this->make_hook('referent',                   AUTH_COOKIE),
             'emploi'                     => $this->make_hook('ref_search',                 AUTH_COOKIE),
@@ -556,7 +555,7 @@ class ProfileModule extends PLModule
         header('Content-Type: text/html; charset=utf-8');
         $page->changeTpl('profile/general.buildnames.tpl', NO_SKIN);
         require_once 'name.func.inc.php';
-        $page->assign('names', build_names_display($data));
+        $page->assign('names', build_javascript_names($data));
     }
 
     function handler_p_orange(&$page)
@@ -745,49 +744,6 @@ class ProfileModule extends PLModule
         $page->assign('list', $it);
     }
 
-    function handler_p_usage(&$page)
-    {
-        $page->changeTpl('profile/nomusage.tpl');
-
-        require_once 'validations.inc.php';
-
-        $res = XDB::query(
-                "SELECT  u.nom, u.nom_usage, u.flags, e.alias
-                   FROM  auth_user_md5  AS u
-              LEFT JOIN  aliases        AS e ON(u.user_id = e.id
-                                                AND FIND_IN_SET('usage', e.flags))
-                  WHERE  user_id={?}", S::v('uid'));
-
-        list($nom, $usage_old, $flags, $alias_old) = $res->fetchOneRow();
-        $flags = new PlFlagSet($flags);
-        $page->assign('usage_old', $usage_old);
-        $page->assign('alias_old',  $alias_old);
-
-        $nom_usage = replace_accent(trim(Env::v('nom_usage')));
-        $nom_usage = strtoupper($nom_usage);
-        $page->assign('usage_req', $nom_usage);
-
-        if (Env::has('submit') && ($nom_usage != $usage_old)) {
-            S::assert_xsrf_token();
-
-            // on vient de recevoir une requete, differente de l'ancien nom d'usage
-            if ($nom_usage == $nom) {
-                $page->trigWarning('Le nom d\'usage que tu demandes est identique à ton nom à l\'X, '
-                                   . 'aucune modification n\'a donc été effectuée.');
-                $page->assign('same', true);
-            } else { // le nom de mariage est distinct du nom à l'X
-                // on calcule l'alias pour l'afficher
-                $reason = Env::v('reason');
-                if ($reason == 'other') {
-                    $reason = Env::v('other_reason');
-                }
-                $myusage = new UsageReq(S::user(), $nom_usage, $reason);
-                $myusage->submit();
-                $page->assign('myusage', $myusage);
-            }
-        }
-    }
-
     function handler_xnet(&$page)
     {
         $page->changeTpl('profile/groupesx.tpl');
index 7fd9816..3de46fb 100644 (file)
 
 class ProfileSearchNames implements ProfileSetting
 {
-    private $public_name;
-    private $private_name;
-    private $directory_name;
-    private $short_name;
-    private $sort_name;
+    private $private_name_end;
+    private $search_names;
 
     private function matchWord($old, $new, $newLen) {
         return ($i = strpos($old, $new)) !== false
@@ -42,8 +39,8 @@ class ProfileSearchNames implements ProfileSetting
     private function prepare(ProfilePage &$page, $field, $value, $init, &$success)
     {
         $success = true;
-        $ini = $this->prepareField($init);
-        $new = $this->prepareField($value);
+        $ini     = $this->prepareField($init);
+        $new     = $this->prepareField($value);
         $newLen  = strlen($new);
         $success = $this->matchWord($ini, $new, $newLen)
                    || ($field == 'Nom patronymique' && $new == 'DE ' . $ini);
@@ -57,7 +54,7 @@ class ProfileSearchNames implements ProfileSetting
 
     public function value(ProfilePage &$page, $field, $value, &$success)
     {
-        $success = true;
+        $success     = true;
         $success_tmp = true;
         if (is_null($value)) {
             $sn_all = XDB::iterator("SELECT  CONCAT(sn.particle, sn.name) AS name,
@@ -105,71 +102,81 @@ class ProfileSearchNames implements ProfileSetting
             $initial = array();
             $initial['Nom patronymique'] = $res[0]['particle'] . $res[0]['name'];
             $initial['Prénom'] = $res[1]['name'];
-            $search_names = array();
-            foreach ($value as $key => &$sn) {
+            $this->search_names = array();
+            foreach ($value as &$sn) {
                 $sn['name'] = trim($sn['name']);
                 if ($sn['type'] == 'Prénom' || $sn['type'] == 'Nom patronymique') {
                     $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 (!isset($search_names[$sn['typeid']])) {
-                        $search_names[$sn['typeid']] = array($sn['name'], $name);
+                    if ($sn['pub']) {
+                        $this->search_names[$sn['typeid']] = array('fullname' => $sn['name'],
+                                                                   'name'     => $name,
+                                                                   'particle' => $particle,
+                                                                   'pub'      => $sn['pub']);
                     } else {
-                        $search_names[$sn['typeid']] = array_merge($search_names[$sn['typeid']], array($name));
+                        if (isset($this->search_names[$sn['typeid']])) {
+                            $this->search_names[$sn['typeid']][] = $sn['name'];
+                        } else {
+                            $this->search_names[$sn['typeid']] = array('fullname' => $sn['name']);
+                        }
                     }
                 }
             }
-            require_once 'name.func.inc.php';
-            $sn_types_public  = build_types('public');
-            $sn_types_private = build_types('private');
-            $full_name        = build_full_name($search_names, $sn_types_public);
-            $this->directory_name = build_directory_name($search_names, $sn_types_public, $full_name);
-            $this->short_name     = short_name($search_names, $sn_types_public);
-            $this->sort_name      = short_name($search_names, $sn_types_public);
-            $this->public_name    = build_public_name($search_names, $sn_types_public, $full_name);
-            $this->private_name   = $this->public_name . build_private_name($search_names, $sn_types_private);
-            Platal::page()->assign('public_name', $this->public_name);
-            Platal::page()->assign('private_name', $this->private_name);
+            $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) {
+                require_once 'name.func.inc.php';
+                $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();
         XDB::execute("DELETE FROM  s
                             USING  profile_name_search      AS s
                        INNER JOIN  profile_name_search_enum AS e ON (s.typeid = e.id)
                             WHERE  s.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags)",
                      S::i('uid'));
-        foreach ($value as $sn) {
-            if ($sn['name'] != '') {
-                if ($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'];
-                }
-                $name = trim($name);
-                XDB::execute("INSERT INTO  profile_name_search (particle, name, typeid, pid)
-                                   VALUES  ({?}, {?}, {?}, {?})",
-                             $particle, $name, $sn['typeid'], S::i('uid'));
-            }
+        $has_new = set_alias_names($this->search_names, $sn_old);
+
+        // 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é prises 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, $this->private_name_end);
+            set_profile_display($display_names);
         }
-        XDB::execute("UPDATE  profile_display
-                         SET  public_name = {?}, private_name = {?},
-                              directory_name = {?}, short_name = {?}, sort_name = {?}
-                       WHERE  pid = {?}",
-                     $this->public_name, $this->private_name, $this->directory_name,
-                     $this->short_name, $this->sort_name, S::v('uid'));
-        /*require_once('user.func.inc.php');
-        user_reindex(S::v('uid'));*/
     }
 }
 
similarity index 75%
rename from templates/include/form.valid.nomusage.tpl
rename to templates/include/form.valid.names.tpl
index 7f034b3..4e9d58b 100644 (file)
 
 
 <tr class="impair">
-  <td class="titre">Nom d'usage&nbsp;:</td>
-  <td>{$valid->nom_usage}</td>
+  <td class="titre">Ancien alias&nbsp;:</td>
+  <td>{$valid->old_alias}</td>
 </tr>
 <tr class="impair">
-  <td class="titre">Nouvel&nbsp;alias&nbsp;:</td>
-  <td>{$valid->alias|default:"<span class='erreur'>suppression</span>"}</td>
+  <td class="titre">Nouvel alias&nbsp;:</td>
+  <td>{$valid->new_alias}</td>
 </tr>
+{foreach from=$valid->sn_new item=sn key=typeid}
 <tr class="impair">
-  <td class="titre">Raison&nbsp;:</td>
-  <td>{$valid->reason}</td>
+  <td class="titre">*{$valid->sn_types.$typeid}&nbsp;:</td>
+  <td>{$sn.name}</td>
 </tr>
-{if $valid->homonyme}
+{/foreach}
+{foreach from=$valid->sn_old item=sn key=typeid}
 <tr class="impair">
-  <td colspan="2">
-    <span class="erreur">Probleme d'homonymie !
-      <a href="profile/{$valid->homonyme}" class="popup2">{$valid->homonyme}</a>
-    </span>
+  <td class="titre">&#8224;{$valid->sn_types.$typeid}&nbsp;:</td>
+  <td>{$sn.name}</td>
+</tr>
+{/foreach}
+<tr class="impair">
+  <td class="center" colspan="2">
+    <span class="smaller">* nouveau nom ; &#8224; ancien nom</span>
   </td>
 </tr>
-{/if}
 
 {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
diff --git a/templates/profile/nomusage.tpl b/templates/profile/nomusage.tpl
deleted file mode 100644 (file)
index edefb1d..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-{**************************************************************************}
-{*                                                                        *}
-{*  Copyright (C) 2003-2009 Polytechnique.org                             *}
-{*  http://opensource.polytechnique.org/                                  *}
-{*                                                                        *}
-{*  This program is free software; you can redistribute it and/or modify  *}
-{*  it under the terms of the GNU General Public License as published by  *}
-{*  the Free Software Foundation; either version 2 of the License, or     *}
-{*  (at your option) any later version.                                   *}
-{*                                                                        *}
-{*  This program is distributed in the hope that it will be useful,       *}
-{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
-{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
-{*  GNU General Public License for more details.                          *}
-{*                                                                        *}
-{*  You should have received a copy of the GNU General Public License     *}
-{*  along with this program; if not, write to the Free Software           *}
-{*  Foundation, Inc.,                                                     *}
-{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
-{*                                                                        *}
-{**************************************************************************}
-
-<h1>Nom d'usage</h1>
-
-{if $same}
-  <p>
-    Tu peux soit <a href='profile/usage'>refaire une demande de nom d'usage</a>, soit <a href='profile/edit'>retourner à l'édition de ton profil</a>.
-  </p>
-{else}
-  {if $myusage}
-    {if $usage_old}
-      <p>
-        Ta demande de suppression de ton nom d'usage ainsi que de tes
-        alias {$alias_old}@{#globals.mail.domain#} et
-        {$alias_old}@{#globals.mail.domain2#} a bien été enregistrée. 
-      </p>
-    {/if}
-
-    {if $myusage->alias}
-      <p>
-        Ta demande d'ajout de ton nom d'usage a bien été enregistrée. Sa
-        validation engendrera la création des alias
-        <strong>{$myusage->alias}@{#globals.mail.domain#}</strong> et
-        <strong>{$myusage->alias}@{#globals.mail.domain2#}</strong>.
-      </p>
-    {/if}
-  
-    <p>
-      Tu recevras un email dès que les changements demandés auront été effectués. 
-      Encore merci de nous faire confiance pour tes emails !
-    </p>
-
-  {else}
-
-<p>
-Le nom d'usage est un patronyme qui doit être <strong>reconnu par la
-  loi</strong> (nom du conjoint, d'un de ses parents, ou bien plus
-exceptionnellement sur changement de l'état civil, ...).
-</p>
-
-<p>
-Les surnoms sont <strong>systématiquement refusés</strong>. Pour
-utiliser une adresse personnalisée, il faut se tourner vers
-<a href="emails/alias">l'alias @{#globals.mail.alias_dom#}</a>.
-</p>
-
-  <p>
-  Afin d'être joignable à la fois sous ton nom à l'X et sous ton nom d'usage, tu peux
-  saisir ici ce dernier. Il apparaîtra alors dans l'annuaire et tu disposeras
-  des adresses correspondantes @{#globals.mail.domain#} et @{#globals.mail.domain2#}, en plus de
-  celles que tu possèdes déjà.
-  </p>
-
-  <br />
-
-{literal}
-  <form action="profile/usage" method="post" onsubmit="
-  for (var i=this.reason.length-1; i>=0; i--) {
-    if (this.reason[i].checked && 
-      (this.reason[i].value != 'other' || this.other_reason.value != '')) {
-      return true;
-    }
-  }
-  alert('Tu dois préciser une raison motivant ta demande.');
-  return false;
-">
-{/literal}
-    {xsrf_token_field}
-    <table class="bicol" cellpadding="4" summary="Nom d'usage">
-      <tr>
-        <th>Nom d'usage</th>
-      </tr>
-      <tr>
-        <td class="center">
-          <input type="text" name="nom_usage" id="nom_usage" value="{$usage_old}" />
-          <script type="text/javascript">
-            document.getElementById("nom_usage").focus();
-          </script>
-        </td>
-      </tr>
-      <tr>
-        <th>Raison du changement de nom</th>
-      </tr>
-      <tr>
-        <td class="rt">
-          <input type="radio" name="reason" value="époux/se" id="reason_ep" onclick="this.form.other_reason.value=''" /><label for="reason_ep">Nom d'épouse / d'époux</label><br />
-          {if $usage_old}
-            <input type="radio" name="reason" value="divorce" id="reason_div" onclick="this.form.other_reason.value=''" /><label for="reason_div">Divorce</label><br />
-          {/if}
-          <input type="radio" name="reason" value="raccourci" id="reason_rac" onclick="this.form.other_reason.value=''" /><label for="reason_rac">Nom d'état civil simplifié, le nom officiel étant trop long</label><br />
-          <input type="radio" name="reason" value="other" id="reason_oth" /><label for="reason_oth">Autre&nbsp;:</label><br />
-          <input type="text" name="other_reason" onfocus="document.getElementById('reason_oth').checked='checked'" size="60" />
-        </td>
-      </tr>
-      <tr>
-        <td class="center">
-          {if !$usage_old}
-            <input type="submit" name="submit" value="Faire la demande" />
-          {else}
-            <input type="submit" name="submit" value="Modifier" />
-            <input type="submit" name="submit" value="Supprimer" onClick="this.form.nom_usage.value=''" />
-          {/if}
-        </td>
-      </tr>
-    </table>
-  </form>
-  {/if}
-{/if}
-
-
-{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}