Fixes bugs in name edition.
authorStéphane Jacob <sj@m4x.org>
Mon, 24 May 2010 20:16:59 +0000 (22:16 +0200)
committerStéphane Jacob <sj@m4x.org>
Wed, 26 May 2010 07:42:20 +0000 (09:42 +0200)
Signed-off-by: Stéphane Jacob <sj@m4x.org>
classes/direnum.php
modules/profile/general.inc.php
upgrade/newdirectory-0.0.1/00_names.sql

index 2cd0f41..a8b9a8e 100644 (file)
@@ -30,6 +30,7 @@ class DirEnum
      * being DE_$basename).
      */
     const NAMETYPES      = 'nametypes';
+    const NAMES          = 'names';
 
     const BINETS         = 'binets';
     const GROUPESX       = 'groupesx';
@@ -427,6 +428,18 @@ class DE_NameTypes extends DirEnumeration
 }
 // }}}
 
+// {{{ class DE_Names
+// returns 'system' names ('lastname', 'lastname_marital', ...)
+class DE_Names extends DirEnumeration
+{
+    public $capabilities = 0x005; // self::HAS_OPTIONS | self::SAVE_IN_SESSION;
+
+    protected $from     = 'profile_name_enum';
+    protected $idfield  = 'type';
+    protected $valfield = 'name';
+}
+// }}}
+
 /** GROUPS
  */
 // {{{ class DE_Binets
index 2449a6c..d6a2b21 100644 (file)
@@ -23,6 +23,11 @@ class ProfileSettingSearchNames implements ProfileSetting
 {
     private $private_name_end;
     private $search_names;
+    private $name_types;
+
+    public function __construct() {
+            $this->name_types = DirEnum::getOptions(DirEnum::NAMES);
+    }
 
     private function matchWord($old, $new, $newLen)
     {
@@ -47,12 +52,33 @@ class ProfileSettingSearchNames implements ProfileSetting
                    || ($field == 'lastname' && $new == 'DE ' . $ini);
         if (!$success) {
             $field = strtolower($field);
-            Platal::page()->trigError("Le " . $field . " que tu as choisi (" . $value .
-                                      ") est trop loin de ton " . $field . " initial (" . $init . ").");
+            Platal::page()->trigError("Le " . $this->name_types[$field] . " que tu as choisi (" . $value .
+                                      ") est trop loin de ton " . $this->name_types[$field] . " initial (" . $init . ").");
         }
         return $success ? $value : $init;
     }
 
+    /* Removes duplicated entries for the fields that do not allow them. */
+    private function clean($value)
+    {
+        $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;
@@ -101,9 +127,11 @@ class ProfileSettingSearchNames implements ProfileSetting
                     $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)
@@ -184,8 +212,8 @@ class ProfileSettingSearchNames implements ProfileSetting
         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.");
+            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, $this->private_name_end);
index 77113af..2e9858a 100644 (file)
@@ -31,7 +31,7 @@ CREATE TABLE IF NOT EXISTS profile_name_enum (
   name VARCHAR(255) NOT NULL,
   explanations VARCHAR(255) NOT NULL,
   type VARCHAR(255) NOT NULL,
-  flags SET('has_particle', 'not_displayed', 'always_displayed', 'public') NOT NULL,
+  flags SET('has_particle', 'not_displayed', 'always_displayed', 'public', 'allow_duplicates') NOT NULL,
   score TINYINT(2) UNSIGNED NOT NULL DEFAULT 10,
   PRIMARY KEY (id),
   UNIQUE (name)
@@ -48,12 +48,12 @@ INSERT INTO  profile_name_enum (name, flags, explanations, type, score)
              ('Prénom', 'always_displayed,public', 'Ton prénom', 'firstname', 10),
              ('Pseudonyme (nom de plume)', 'always_displayed,public',
               'Pseudonyme pour les artistes, gens de lettres', 'pseudonym', 10),
-             ('Surnom', '', 'Surnom à l\'École ou ailleurs', 'nickname', 2),
+             ('Surnom', 'allow_duplicates', 'Surnom à l\'École ou ailleurs', 'nickname', 2),
              ('Prénom usuel', 'public', 'Si tu utilises une version raccourcie, francisée... de ton prénom',
               'firstname_ordinary', 10),
-             ('Autre prénom', '', 'Si tu as d\'autres prénoms et que tu souhaites les faire apparaître',
+             ('Autre prénom', 'allow_duplicates', 'Si tu as d\'autres prénoms et que tu souhaites les faire apparaître',
               'firstname_other', 1),
-             ('Autre nom', '', 'Si tu as d\'autres noms et que tu souhaites les faire apparaître',
+             ('Autre nom', 'allow_duplicates', 'Si tu as d\'autres noms et que tu souhaites les faire apparaître',
               'name_other', 1),
              ('Nom initial', 'has_particle,not_displayed,public', '', 'name_ini', 10),
              ('Prénom initial', 'has_particle,not_displayed,public', '', 'firstname_ini', 10);