From b270577e919c58455a3629a4d9d61bd38ea49e11 Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Jacob?= Date: Mon, 24 May 2010 22:16:59 +0200 Subject: [PATCH] Fixes bugs in name edition. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Jacob --- classes/direnum.php | 13 ++++++++++++ modules/profile/general.inc.php | 36 +++++++++++++++++++++++++++++---- upgrade/newdirectory-0.0.1/00_names.sql | 8 ++++---- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/classes/direnum.php b/classes/direnum.php index 2cd0f41..a8b9a8e 100644 --- a/classes/direnum.php +++ b/classes/direnum.php @@ -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 diff --git a/modules/profile/general.inc.php b/modules/profile/general.inc.php index 2449a6c..d6a2b21 100644 --- a/modules/profile/general.inc.php +++ b/modules/profile/general.inc.php @@ -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); diff --git a/upgrade/newdirectory-0.0.1/00_names.sql b/upgrade/newdirectory-0.0.1/00_names.sql index 77113af..2e9858a 100644 --- a/upgrade/newdirectory-0.0.1/00_names.sql +++ b/upgrade/newdirectory-0.0.1/00_names.sql @@ -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); -- 2.1.4