Fixes small issue in name.func.inc.php.
[platal.git] / include / name.func.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2009 Polytechnique.org *
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
22 function build_javascript_names($data)
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]);
29 if (isset($search_names[$searchname[0]])) {
30 $search_names[$searchname[0]][] = $searchname[1];
31 } else {
32 $search_names[$searchname[0]] = array('fullname' => $searchname[1]);
33 }
34 }
35
36 $sn_types_public = build_types('public');
37 $sn_types_private = build_types('private');
38 $full_name = build_full_name($search_names, $sn_types_public);
39 return build_public_name($search_names, $sn_types_public, $full_name) . ';' .
40 build_private_name($search_names, $sn_types_private);
41 }
42
43 function build_display_names(&$display_names, $search_names, $private_name_end = null, &$alias = null)
44 {
45 $sn_types_public = build_types('public');
46 $full_name = build_full_name($search_names, $sn_types_public);
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);
52 }
53
54 function build_types($pub = null)
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 }
63 $sql = "SELECT id, type, name
64 FROM profile_name_enum
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()) {
69 if ($pub) {
70 $types[$sn_type['type']] = $sn_type['id'];
71 } else {
72 $types[$sn_type['id']] = $sn_type['name'];
73 }
74 }
75 return $types;
76 }
77
78 function build_full_name(&$search_names, &$sn_types)
79 {
80 $name = "";
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'] . ")";
84 } else {
85 $name .= $search_names[$sn_types['lastname']]['fullname'];
86 }
87 if (isset($search_names[$sn_types['lastname_marital']])
88 || isset($search_names[$sn_types['pseudonym']])) {
89 $name .= " (";
90 if (isset($search_names[$sn_types['lastname_marital']])) {
91 $user = S::user();
92 if ($user->isFemale()) {
93 $name .= "Mme ";
94 } else {
95 $name .= "M ";
96 }
97 $name .= $search_names[$sn_types['lastname_marital']]['fullname'];
98 if (isset($search_names[$sn_types['pseudonym']])) {
99 $name .= ", ";
100 }
101 }
102 if (isset($search_names[$sn_types['pseudonym']])) {
103 $name .= $search_names[$sn_types['pseudonym']]['fullname'];
104 }
105 $name .= ")";
106 }
107 return $name;
108 }
109
110 function build_public_name(&$search_names, &$sn_types, $full_name)
111 {
112 return $search_names[$sn_types['firstname']]['fullname'] . " " . $full_name;
113 }
114
115 function build_private_name(&$search_names, &$sn_types)
116 {
117 $name = "";
118 if (isset($search_names[$sn_types['nickname']])
119 || (isset($search_names[$sn_types['name_other']])
120 || isset($search_names[$sn_types['name_other']]))) {
121 $name .= " (";
122 if (isset($search_names[$sn_types['nickname']])) {
123 $name .= "alias " . $search_names[$sn_types['nickname']]['fullname'];
124 $i = 0;
125 while (isset($search_names[$sn_types['nickname']][$i])) {
126 $name .= ", " . $search_names[$sn_types['nickname']][$i];
127 $i++;
128 }
129 if (isset($search_names[$sn_types['name_other']])
130 || isset($search_names[$sn_types['name_other']])) {
131 $name .= ", ";
132 }
133 }
134 if (isset($search_names[$sn_types['firstname_other']])) {
135 $name .= "autres prénoms : " . $search_names[$sn_types['firstname_other']]['fullname'];
136 $i = 0;
137 while (isset($search_names[$sn_types['firstname_other']][$i])) {
138 $name .= ", " . $search_names[$sn_types['firstname_other']][$i];
139 $i++;
140 }
141 if (isset($search_names[$sn_types['name_other']])) {
142 $name .= ", ";
143 }
144 }
145 if (isset($search_names[$sn_types['name_other']])) {
146 $name .= "autres noms : " . $search_names[$sn_types['name_other']]['fullname'];
147 $i = 0;
148 while (isset($search_names[$sn_types['name_other']][$i])) {
149 $name .= ", " . $search_names[$sn_types['name_other']][$i];
150 $i++;
151 }
152 }
153 $name .= ")";
154 }
155 return $name;
156 }
157
158 function build_directory_name(&$search_names, &$sn_types, $full_name)
159 {
160 return $full_name . " " . $search_names[$sn_types['firstname']]['fullname'];
161 }
162
163 function build_short_name(&$search_names, &$sn_types, &$alias = null)
164 {
165 if (isset($search_names[$sn_types['lastname_ordinary']])) {
166 $lastname = $search_names[$sn_types['lastname_ordinary']]['fullname'];
167 } else {
168 $lastname = $search_names[$sn_types['lastname']]['fullname'];
169 }
170 if (isset($search_names[$sn_types['firstname_ordinary']])) {
171 $firstname = $search_names[$sn_types['firstname_ordinary']]['fullname'];
172 } else {
173 $firstname = $search_names[$sn_types['firstname']]['fullname'];
174 }
175 if ($alias) {
176 $alias = make_username($firstname, $lastname);
177 }
178 return $firstname . " " . $lastname;
179 }
180
181 function build_sort_name(&$search_names, &$sn_types)
182 {
183 $name = "";
184 if (isset($search_names[$sn_types['lastname_ordinary']])) {
185 $name .= $search_names[$sn_types['lastname_ordinary']]['name'];
186 } else {
187 $name .= $search_names[$sn_types['lastname']]['name'];
188 }
189 $name .= " " . $search_names[$sn_types['firstname']]['fullname'];
190 return $name;
191 }
192
193 function set_profile_display(&$display_names)
194 {
195 XDB::execute("UPDATE profile_display
196 SET public_name = {?}, private_name = {?},
197 directory_name = {?}, short_name = {?}, sort_name = {?}
198 WHERE pid = {?}",
199 $display_names['public_name'], $display_names['private_name'],
200 $display_names['directory_name'], $display_names['short_name'],
201 $display_names['sort_name'], S::v('uid'));
202 }
203
204 function build_sn_pub()
205 {
206 $res = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS fullname, sn.typeid,
207 sn.particle, sn.name, sn.id
208 FROM profile_name AS sn
209 INNER JOIN profile_name_enum AS e ON (e.id = sn.typeid)
210 WHERE sn.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags)
211 AND FIND_IN_SET('public', e.flags)
212 ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name",
213 S::i('uid'));
214 $sn_old = array();
215 while ($old = $res->next()) {
216 $sn_old[$old['typeid']] = array('fullname' => $old['fullname'],
217 'name' => $old['name'],
218 'particle' => $old['particle'],
219 'id' => $old['id']);
220 }
221 return $sn_old;
222 }
223
224 function set_alias_names(&$sn_new, $sn_old, $update_new = false, $new_alias = null)
225 {
226 $has_new = false;
227 foreach ($sn_new as $typeid => $sn) {
228 if (isset($sn['pub'])) {
229 if (isset($sn_old[$typeid]) && ($sn_old[$typeid]['fullname'] == $sn['fullname'] && $update_new)) {
230 XDB::execute("UPDATE profile_name
231 SET particle = {?}, name = {?}, typeid = {?}
232 WHERE id = {?} AND pid = {?}",
233 $sn['particle'], $sn['name'], $typeid, $sn_old[$typeid]['id'], S::i('uid'));
234 unset($sn_old[$typeid]);
235 } elseif ($update_new
236 || (isset($sn_old[$typeid]) && $sn_old[$typeid]['fullname'] == $sn['fullname'])) {
237 XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
238 VALUES ({?}, {?}, {?}, {?})",
239 $sn['particle'], $sn['name'], $typeid, S::i('uid'));
240 unset($sn_old[$typeid]);
241 } else {
242 $has_new = true;
243 }
244 } else {
245 if ($sn['fullname'] != '') {
246 XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
247 VALUES ('', {?}, {?}, {?})",
248 $sn['fullname'], $typeid, S::i('uid'));
249 }
250 $i = 0;
251 while (isset($sn[$i])) {
252 XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
253 VALUES ('', {?}, {?}, {?})",
254 $sn[$i], $typeid, S::i('uid'));
255 $i++;
256 }
257 }
258 }
259 if (count($sn_old) > 0) {
260 if (!$update_new) {
261 $has_new = true;
262 foreach ($sn_old as $typeid => $sn) {
263 XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
264 VALUES ({?}, {?}, {?}, {?})",
265 $sn['particle'], $sn['name'], $typeid, S::i('uid'));
266 }
267 } else {
268 foreach ($sn_old as $typeid => $sn) {
269 XDB::execute("DELETE FROM profile_name
270 WHERE pid = {?} AND id = {?}",
271 S::i('uid'), $sn['id']);
272 }
273 }
274 }
275 if ($update_new) {
276 XDB::execute("DELETE FROM aliases
277 WHERE FIND_IN_SET('usage', flags) AND id = {?}",
278 S::i('uid'));
279 }
280 if ($new_alias) {
281 XDB::execute("INSERT INTO aliases (alias, type, flags, id)
282 VALUES ({?}, 'alias', 'usage', {?})",
283 $new_alias, S::i('uid'));
284 }
285 require_once('user.func.inc.php');
286 user_reindex(S::i('uid'));
287 return $has_new;
288 }
289
290 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
291 ?>