Commit | Line | Data |
---|---|---|
6e32823c SJ |
1 | <?php |
2 | /*************************************************************************** | |
d4c08d89 | 3 | * Copyright (C) 2003-2010 Polytechnique.org * |
6e32823c SJ |
4 | * http://opensource.polytechnique.org/ * |
5 | * * | |
6 | * This program is free software; you can redistribute it and/or modify * | |
7 | * it under the terms of the GNU General Public License as published by * | |
8 | * the Free Software Foundation; either version 2 of the License, or * | |
9 | * (at your option) any later version. * | |
10 | * * | |
11 | * This program is distributed in the hope that it will be useful, * | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
14 | * GNU General Public License for more details. * | |
15 | * * | |
16 | * You should have received a copy of the GNU General Public License * | |
17 | * along with this program; if not, write to the Free Software * | |
18 | * Foundation, Inc., * | |
19 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * | |
20 | ***************************************************************************/ | |
21 | ||
e8a7cf31 | 22 | function build_javascript_names($data, $isFemale) |
6e32823c SJ |
23 | { |
24 | $data_array = explode(';;', $data); | |
25 | $n = count($data_array); | |
26 | $n--; | |
27 | for ($i = 0; $i < $n; $i++) { | |
28 | $searchname = explode(';', $data_array[$i]); | |
dced83b4 SJ |
29 | if (isset($search_names[$searchname[0]])) { |
30 | $search_names[$searchname[0]][] = $searchname[1]; | |
6e32823c | 31 | } else { |
dced83b4 | 32 | $search_names[$searchname[0]] = array('fullname' => $searchname[1]); |
6e32823c SJ |
33 | } |
34 | } | |
dced83b4 | 35 | |
6e32823c SJ |
36 | $sn_types_public = build_types('public'); |
37 | $sn_types_private = build_types('private'); | |
e8a7cf31 | 38 | $full_name = build_full_name($search_names, $sn_types_public, $isFemale); |
6e32823c | 39 | return build_public_name($search_names, $sn_types_public, $full_name) . ';' . |
dced83b4 SJ |
40 | build_private_name($search_names, $sn_types_private); |
41 | } | |
42 | ||
e8a7cf31 | 43 | function build_display_names(&$display_names, $search_names, $isFemale, $private_name_end = null, &$alias = null) |
dced83b4 SJ |
44 | { |
45 | $sn_types_public = build_types('public'); | |
e8a7cf31 | 46 | $full_name = build_full_name($search_names, $sn_types_public, $isFemale); |
dced83b4 SJ |
47 | $display_names['public_name'] = build_public_name($search_names, $sn_types_public, $full_name); |
48 | $display_names['private_name'] = $display_names['public_name'] . $private_name_end; | |
49 | $display_names['directory_name'] = build_directory_name($search_names, $sn_types_public, $full_name); | |
50 | $display_names['short_name'] = build_short_name($search_names, $sn_types_public, $alias); | |
51 | $display_names['sort_name'] = build_sort_name($search_names, $sn_types_public); | |
6e32823c SJ |
52 | } |
53 | ||
dced83b4 | 54 | function build_types($pub = null) |
6e32823c SJ |
55 | { |
56 | if ($pub == 'public') { | |
57 | $sql_pub = "AND FIND_IN_SET('public', flags)"; | |
58 | } elseif ($pub == 'private') { | |
59 | $sql_pub = "AND NOT FIND_IN_SET('public', flags)"; | |
60 | } else { | |
61 | $sql_pub = ""; | |
62 | } | |
6cb58d39 | 63 | $sql = "SELECT id, type, name |
97a98687 | 64 | FROM profile_name_enum |
6e32823c SJ |
65 | WHERE NOT FIND_IN_SET('not_displayed', flags)" . $sql_pub; |
66 | $sn_types = XDB::iterator($sql); | |
67 | $types = array(); | |
68 | while ($sn_type = $sn_types->next()) { | |
dced83b4 | 69 | if ($pub) { |
6cb58d39 | 70 | $types[$sn_type['type']] = $sn_type['id']; |
dced83b4 | 71 | } else { |
6cb58d39 | 72 | $types[$sn_type['id']] = $sn_type['name']; |
dced83b4 | 73 | } |
6e32823c SJ |
74 | } |
75 | return $types; | |
76 | } | |
77 | ||
e8a7cf31 | 78 | function build_full_name(&$search_names, &$sn_types, $isFemale) |
6e32823c SJ |
79 | { |
80 | $name = ""; | |
6cb58d39 SJ |
81 | if (isset($search_names[$sn_types['lastname_ordinary']])) { |
82 | $name .= $search_names[$sn_types['lastname_ordinary']]['fullname'] . " (" | |
83 | . $search_names[$sn_types['lastname']]['fullname'] . ")"; | |
6e32823c | 84 | } else { |
6cb58d39 | 85 | $name .= $search_names[$sn_types['lastname']]['fullname']; |
6e32823c | 86 | } |
6cb58d39 SJ |
87 | if (isset($search_names[$sn_types['lastname_marital']]) |
88 | || isset($search_names[$sn_types['pseudonym']])) { | |
c4b45374 | 89 | $name .= " ("; |
6cb58d39 | 90 | if (isset($search_names[$sn_types['lastname_marital']])) { |
e8a7cf31 | 91 | if ($isFemale) { |
c4b45374 | 92 | $name .= "Mme "; |
6e32823c | 93 | } else { |
c4b45374 | 94 | $name .= "M "; |
6e32823c | 95 | } |
6cb58d39 SJ |
96 | $name .= $search_names[$sn_types['lastname_marital']]['fullname']; |
97 | if (isset($search_names[$sn_types['pseudonym']])) { | |
6e32823c SJ |
98 | $name .= ", "; |
99 | } | |
100 | } | |
6cb58d39 SJ |
101 | if (isset($search_names[$sn_types['pseudonym']])) { |
102 | $name .= $search_names[$sn_types['pseudonym']]['fullname']; | |
6e32823c SJ |
103 | } |
104 | $name .= ")"; | |
105 | } | |
106 | return $name; | |
107 | } | |
108 | ||
109 | function build_public_name(&$search_names, &$sn_types, $full_name) | |
110 | { | |
6cb58d39 | 111 | return $search_names[$sn_types['firstname']]['fullname'] . " " . $full_name; |
6e32823c SJ |
112 | } |
113 | ||
114 | function build_private_name(&$search_names, &$sn_types) | |
115 | { | |
116 | $name = ""; | |
6cb58d39 SJ |
117 | if (isset($search_names[$sn_types['nickname']]) |
118 | || (isset($search_names[$sn_types['name_other']]) | |
119 | || isset($search_names[$sn_types['name_other']]))) { | |
6e32823c | 120 | $name .= " ("; |
6cb58d39 SJ |
121 | if (isset($search_names[$sn_types['nickname']])) { |
122 | $name .= "alias " . $search_names[$sn_types['nickname']]['fullname']; | |
dced83b4 | 123 | $i = 0; |
6cb58d39 SJ |
124 | while (isset($search_names[$sn_types['nickname']][$i])) { |
125 | $name .= ", " . $search_names[$sn_types['nickname']][$i]; | |
6e32823c SJ |
126 | $i++; |
127 | } | |
6cb58d39 | 128 | if (isset($search_names[$sn_types['name_other']]) |
6115899b | 129 | || isset($search_names[$sn_types['firstname_other']])) { |
6e32823c SJ |
130 | $name .= ", "; |
131 | } | |
132 | } | |
6cb58d39 SJ |
133 | if (isset($search_names[$sn_types['firstname_other']])) { |
134 | $name .= "autres prénoms : " . $search_names[$sn_types['firstname_other']]['fullname']; | |
dced83b4 | 135 | $i = 0; |
6cb58d39 SJ |
136 | while (isset($search_names[$sn_types['firstname_other']][$i])) { |
137 | $name .= ", " . $search_names[$sn_types['firstname_other']][$i]; | |
6e32823c SJ |
138 | $i++; |
139 | } | |
6cb58d39 | 140 | if (isset($search_names[$sn_types['name_other']])) { |
6e32823c SJ |
141 | $name .= ", "; |
142 | } | |
143 | } | |
6cb58d39 SJ |
144 | if (isset($search_names[$sn_types['name_other']])) { |
145 | $name .= "autres noms : " . $search_names[$sn_types['name_other']]['fullname']; | |
dced83b4 | 146 | $i = 0; |
6cb58d39 SJ |
147 | while (isset($search_names[$sn_types['name_other']][$i])) { |
148 | $name .= ", " . $search_names[$sn_types['name_other']][$i]; | |
6e32823c SJ |
149 | $i++; |
150 | } | |
151 | } | |
152 | $name .= ")"; | |
153 | } | |
154 | return $name; | |
155 | } | |
156 | ||
157 | function build_directory_name(&$search_names, &$sn_types, $full_name) | |
158 | { | |
6cb58d39 | 159 | return $full_name . " " . $search_names[$sn_types['firstname']]['fullname']; |
6e32823c SJ |
160 | } |
161 | ||
dced83b4 | 162 | function build_short_name(&$search_names, &$sn_types, &$alias = null) |
6e32823c | 163 | { |
6cb58d39 SJ |
164 | if (isset($search_names[$sn_types['lastname_ordinary']])) { |
165 | $lastname = $search_names[$sn_types['lastname_ordinary']]['fullname']; | |
6e32823c | 166 | } else { |
6cb58d39 | 167 | $lastname = $search_names[$sn_types['lastname']]['fullname']; |
6e32823c | 168 | } |
6cb58d39 SJ |
169 | if (isset($search_names[$sn_types['firstname_ordinary']])) { |
170 | $firstname = $search_names[$sn_types['firstname_ordinary']]['fullname']; | |
6e32823c | 171 | } else { |
6cb58d39 | 172 | $firstname = $search_names[$sn_types['firstname']]['fullname']; |
6e32823c | 173 | } |
dced83b4 | 174 | if ($alias) { |
e788e5a2 | 175 | $alias = PlUser::makeUserName($firstname, $lastname); |
dced83b4 SJ |
176 | } |
177 | return $firstname . " " . $lastname; | |
6e32823c SJ |
178 | } |
179 | ||
dced83b4 | 180 | function build_sort_name(&$search_names, &$sn_types) |
6e32823c SJ |
181 | { |
182 | $name = ""; | |
6cb58d39 SJ |
183 | if (isset($search_names[$sn_types['lastname_ordinary']])) { |
184 | $name .= $search_names[$sn_types['lastname_ordinary']]['name']; | |
6e32823c | 185 | } else { |
6cb58d39 | 186 | $name .= $search_names[$sn_types['lastname']]['name']; |
6e32823c | 187 | } |
6cb58d39 | 188 | $name .= " " . $search_names[$sn_types['firstname']]['fullname']; |
6e32823c SJ |
189 | return $name; |
190 | } | |
191 | ||
e8a7cf31 | 192 | function set_profile_display(&$display_names, $pid) |
dced83b4 SJ |
193 | { |
194 | XDB::execute("UPDATE profile_display | |
195 | SET public_name = {?}, private_name = {?}, | |
196 | directory_name = {?}, short_name = {?}, sort_name = {?} | |
197 | WHERE pid = {?}", | |
198 | $display_names['public_name'], $display_names['private_name'], | |
199 | $display_names['directory_name'], $display_names['short_name'], | |
e8a7cf31 | 200 | $display_names['sort_name'], $pid); |
cb0af6e5 FB |
201 | |
202 | /* XXX: Inefficient, should directly take the profile as parameter */ | |
203 | $profile = Profile::get($pid); | |
204 | $owner = $profile->owner(); | |
205 | if ($owner) { | |
206 | XDB::execute('UPDATE accounts | |
207 | SET full_name = {?} | |
208 | WHERE uid = {?}', | |
209 | $display_names['public_name'], $owner->id()); | |
210 | } | |
dced83b4 SJ |
211 | } |
212 | ||
e8a7cf31 | 213 | function build_sn_pub($pid) |
dced83b4 SJ |
214 | { |
215 | $res = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS fullname, sn.typeid, | |
216 | sn.particle, sn.name, sn.id | |
97a98687 SJ |
217 | FROM profile_name AS sn |
218 | INNER JOIN profile_name_enum AS e ON (e.id = sn.typeid) | |
dced83b4 SJ |
219 | WHERE sn.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags) |
220 | AND FIND_IN_SET('public', e.flags) | |
221 | ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name", | |
e8a7cf31 | 222 | $pid); |
dced83b4 SJ |
223 | $sn_old = array(); |
224 | while ($old = $res->next()) { | |
225 | $sn_old[$old['typeid']] = array('fullname' => $old['fullname'], | |
226 | 'name' => $old['name'], | |
227 | 'particle' => $old['particle'], | |
228 | 'id' => $old['id']); | |
229 | } | |
230 | return $sn_old; | |
231 | } | |
232 | ||
ac40839f PC |
233 | /** Transform a name to its canonical value so it can be compared |
234 | * to another form (different case, with accents or with - instead | |
235 | * of blanks). | |
236 | * @see compare_basename to compare | |
237 | */ | |
238 | function name_to_basename($value) { | |
239 | $value = mb_strtoupper(replace_accent($value)); | |
240 | return preg_replace('/[^A-Z]/', ' ', $value); | |
241 | } | |
242 | ||
243 | /** Compares two strings and check if they are two forms of the | |
244 | * same name (different case, with accents or with - instead of | |
245 | * blanks). | |
246 | * @see name_to_basename to retreive the compared string | |
247 | */ | |
248 | function compare_basename($a, $b) { | |
249 | return name_to_basename($a) == name_to_basename($b); | |
250 | } | |
251 | ||
e8a7cf31 | 252 | function set_alias_names(&$sn_new, $sn_old, $pid, $uid, $update_new = false, $new_alias = null) |
dced83b4 SJ |
253 | { |
254 | $has_new = false; | |
255 | foreach ($sn_new as $typeid => $sn) { | |
256 | if (isset($sn['pub'])) { | |
257 | if (isset($sn_old[$typeid]) && ($sn_old[$typeid]['fullname'] == $sn['fullname'] && $update_new)) { | |
97a98687 | 258 | XDB::execute("UPDATE profile_name |
dced83b4 SJ |
259 | SET particle = {?}, name = {?}, typeid = {?} |
260 | WHERE id = {?} AND pid = {?}", | |
e8a7cf31 | 261 | $sn['particle'], $sn['name'], $typeid, $sn_old[$typeid]['id'], $pid); |
dced83b4 SJ |
262 | unset($sn_old[$typeid]); |
263 | } elseif ($update_new | |
ac40839f | 264 | || (isset($sn_old[$typeid]) && compare_basename($sn_old[$typeid]['fullname'], $sn['fullname']))) { |
97a98687 | 265 | XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) |
dced83b4 | 266 | VALUES ({?}, {?}, {?}, {?})", |
e8a7cf31 | 267 | $sn['particle'], $sn['name'], $typeid, $pid); |
dced83b4 SJ |
268 | unset($sn_old[$typeid]); |
269 | } else { | |
270 | $has_new = true; | |
271 | } | |
272 | } else { | |
273 | if ($sn['fullname'] != '') { | |
97a98687 | 274 | XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) |
dced83b4 | 275 | VALUES ('', {?}, {?}, {?})", |
e8a7cf31 | 276 | $sn['fullname'], $typeid, $pid); |
dced83b4 | 277 | } |
6cb58d39 SJ |
278 | $i = 0; |
279 | while (isset($sn[$i])) { | |
280 | XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) | |
281 | VALUES ('', {?}, {?}, {?})", | |
e8a7cf31 | 282 | $sn[$i], $typeid, $pid); |
6cb58d39 SJ |
283 | $i++; |
284 | } | |
dced83b4 SJ |
285 | } |
286 | } | |
287 | if (count($sn_old) > 0) { | |
288 | if (!$update_new) { | |
289 | $has_new = true; | |
290 | foreach ($sn_old as $typeid => $sn) { | |
97a98687 | 291 | XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) |
dced83b4 | 292 | VALUES ({?}, {?}, {?}, {?})", |
e8a7cf31 | 293 | $sn['particle'], $sn['name'], $typeid, $pid); |
dced83b4 SJ |
294 | } |
295 | } else { | |
296 | foreach ($sn_old as $typeid => $sn) { | |
97a98687 | 297 | XDB::execute("DELETE FROM profile_name |
dced83b4 | 298 | WHERE pid = {?} AND id = {?}", |
e8a7cf31 | 299 | $pid, $sn['id']); |
dced83b4 SJ |
300 | } |
301 | } | |
302 | } | |
303 | if ($update_new) { | |
304 | XDB::execute("DELETE FROM aliases | |
fe13bc1d | 305 | WHERE FIND_IN_SET('usage', flags) AND uid = {?}", |
e8a7cf31 | 306 | $uid); |
dced83b4 SJ |
307 | } |
308 | if ($new_alias) { | |
fe13bc1d | 309 | XDB::execute("INSERT INTO aliases (alias, type, flags, uid) |
dced83b4 | 310 | VALUES ({?}, 'alias', 'usage', {?})", |
e8a7cf31 | 311 | $new_alias, $uid); |
dced83b4 | 312 | } |
e8a7cf31 | 313 | Profile::rebuildSearchTokens($pid); |
dced83b4 SJ |
314 | return $has_new; |
315 | } | |
316 | ||
6e32823c SJ |
317 | // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: |
318 | ?> |