ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilUserDataSet.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
24use ILIAS\User\Profile\Fields\Field as ProfileField;
27
32{
36 protected array $temp_picture_dirs = []; // Missing array type.
37 public array $multi = []; // Missing array type.
38 protected array $users; // Missing array type.
39
40 public function __construct()
41 {
42 global $DIC;
43 $this->current_user = $DIC['ilUser'];
44
46
47 $this->user_profile = LocalDIC::dic()[Profile::class];
48 }
49
50 public function initByExporter(ilXmlExporter $xml_exporter): void
51 {
52 parent::initByExporter($xml_exporter);
54 $config = $this->export->getExportConfigs()->getElementByClassName('ilUserExportConfig');
55 $this->export_config = $config;
56 }
57
58 public function getSupportedVersions(): array // Missing array type.
59 {
60 return ["4.3.0", "4.5.0", "5.1.0", "5.2.0", "5.3.0"];
61 }
62
63 protected function getXmlNamespace(string $a_entity, string $a_schema_version): string
64 {
65 return "https://www.ilias.de/xml/Services/User/" . $a_entity;
66 }
67
68 protected function getTypes(string $a_entity, string $a_version): array // Missing array type.
69 {
70 // user profile type
71 if ($a_entity == "usr_profile") {
72 switch ($a_version) {
73 case "4.3.0":
74 case "4.5.0":
75 case "5.1.0":
76 case "5.2.0":
77 case "5.3.0":
78 return [
79 "Id" => "integer",
80 "Username" => "text",
81 "Firstname" => "text",
82 "Lastname" => "text",
83 "Title" => "text",
84 "Birthday" => "text",
85 "Gender" => "text",
86 "Institution" => "text",
87 "Department" => "text",
88 "Street" => "text",
89 "Zipcode" => "text",
90 "City" => "text",
91 "Country" => "text",
92 "PhoneOffice" => "text",
93 "PhoneHome" => "text",
94 "PhoneMobile" => "text",
95 "Fax" => "text",
96 "Email" => "text",
97 "SecondEmail" => "text",
98 "Hobby" => "text",
99 "ReferralComment" => "text",
100 "Matriculation" => "text",
101 "Latitude" => "text",
102 "Longitude" => "text",
103 "LocZoom" => "text",
104 "Picture" => "directory"
105 ];
106 }
107 }
108
109 if ($a_entity == "usr_setting") {
110 switch ($a_version) {
111 case "4.3.0":
112 case "4.5.0":
113 case "5.1.0":
114 case "5.2.0":
115 case "5.3.0":
116 return [
117 "UserId" => "integer",
118 "Keyword" => "text",
119 "Value" => "text"
120 ];
121 }
122 }
123
124 if ($this->export_config->getExportType() == "personal_data") {
125 switch ($a_version) {
126 case "4.3.0":
127 case "4.5.0":
128 case "5.1.0":
129 case "5.2.0":
130 case "5.3.0":
131 return [
132 "Id" => "integer"
133 ];
134 }
135 }
136
137 if ($a_entity == "usr_multi") {
138 switch ($a_version) {
139 case "4.5.0":
140 case "5.1.0":
141 case "5.2.0":
142 case "5.3.0":
143 return [
144 "UserId" => "integer",
145 "FieldId" => "text",
146 "Value" => "text"
147 ];
148 }
149 }
150 return [];
151 }
152
153 public function getXmlRecord(string $a_entity, string $a_version, array $a_set): array // Missing array type.
154 {
155 if ($a_entity == "usr_profile") {
156 $tmp_dir = ilFileUtils::ilTempnam();
157 ilFileUtils::makeDir($tmp_dir);
158
160 $a_set["Id"],
161 "small",
162 true,
163 true
164 );
165
166 if ($im != "") {
167 ilObjUser::copyProfilePicturesToDirectory($a_set["Id"], $tmp_dir);
168 }
169
170 $this->temp_picture_dirs[$a_set["Id"]] = $tmp_dir;
171
172 $a_set["Picture"] = $tmp_dir;
173 }
174
175 return $a_set;
176 }
177
178 public function afterXmlRecordWriting(string $a_entity, string $a_version, array $a_set): void // Missing array type.
179 {
180 if ($a_entity == "usr_profile") {
181 // cleanup temp dirs for pictures
182 $tmp_dir = $this->temp_picture_dirs[$a_set["Id"]];
183 if ($tmp_dir != "" && is_dir($tmp_dir)) {
184 ilFileUtils::delDir($tmp_dir);
185 }
186 }
187 }
188
189 public function readData(string $a_entity, string $a_version, array $a_ids): void // Missing array type.
190 {
191 if (!is_array($a_ids)) {
192 $a_ids = [$a_ids];
193 }
194
195 if ($this->export_config->getExportType() == "personal_data") {
196 switch ($a_version) {
197 case "4.3.0":
198 case "4.5.0":
199 case "5.1.0":
200 case "5.2.0":
201 case "5.3.0":
202 $this->data = [];
203 foreach ($a_ids as $id) {
204 $this->data[] = ["Id" => $id];
205 }
206 break;
207 }
208 }
209
210 if ($a_entity == "usr_profile") {
211 switch ($a_version) {
212 case "4.3.0":
213 case "4.5.0":
214 case "5.1.0":
215 $this->getDirectDataFromQuery("SELECT usr_id id, login username, firstname, lastname, " .
216 " title, birthday, gender, institution, department, street, city, zipcode, country, " .
217 " phone_office, phone_home, phone_mobile, fax, email, hobby, referral_comment, matriculation, " .
218 " delicious, latitude, longitude, loc_zoom" .
219 " FROM usr_data u " .
220 "WHERE " .
221 $this->db->in("u.usr_id", $a_ids, false, "integer"));
222 break;
223
224 case "5.2.0":
225 $this->getDirectDataFromQuery("SELECT usr_id id, login username, firstname, lastname, " .
226 " title, birthday, gender, institution, department, street, city, zipcode, country, " .
227 " phone_office, phone_home, phone_mobile, fax, email, hobby, referral_comment, matriculation, " .
228 " latitude, longitude, loc_zoom" .
229 " FROM usr_data u " .
230 "WHERE " .
231 $this->db->in("u.usr_id", $a_ids, false, "integer"));
232 break;
233 case "5.3.0":
234 $this->getDirectDataFromQuery("SELECT usr_id id, login username, firstname, lastname, " .
235 " title, birthday, gender, institution, department, street, city, zipcode, country, " .
236 " phone_office, phone_home, phone_mobile, fax, email, second_email, hobby, referral_comment, matriculation, " .
237 " latitude, longitude, loc_zoom" .
238 " FROM usr_data u " .
239 "WHERE " .
240 $this->db->in("u.usr_id", $a_ids, false, "integer"));
241 break;
242 }
243 }
244
245 if ($a_entity == "usr_setting") {
246 switch ($a_version) {
247 case "4.3.0":
248 case "4.5.0":
249 case "5.1.0":
250 case "5.2.0":
251 case "5.3.0":
252 // for all user ids get data from usr_pref and mail options, create records user_id/name/value
253 $prefs = ["date_format", "day_end", "day_start", "bs_allow_to_contact_me", "chat_osc_accept_msg", "hide_own_online_status", "language",
254 "public_birthday", "puplic_city", "public_country", "public_delicious", "public_department", "public_email", "public_second_email",
255 "public_fax", "public_gender", "public_hobby", "public_im_aim", "public_im_icq", "public_im_jabber",
256 "public_im_msn", "public_im_skype", "public_im_voip", "public_im_yahoo", "public_institution", "public_location",
257 "public_matriculation", "public_phone_home", "public_phone_mobile", "public_phone_office",
258 "public_profile", "public_sel_country", "public_street", "public_title", "public_upload", "public_zipcode",
259 "screen_reader_optimization", "show_users_online",
260 "store_last_visited", "time_format", "user_tz", "weekstart",
261 "session_reminder_lead_time", "usr_starting_point",
262 "chat_broadcast_typing"];
263
264 if (version_compare($a_version, '5.2.0', '>=')) {
265 unset(
266 $prefs['public_im_aim'], $prefs['public_im_icq'], $prefs['public_im_jabber'],
267 $prefs['public_im_msn'], $prefs['public_im_skype'], $prefs['public_im_voip'],
268 $prefs['public_im_yahoo'], $prefs['public_delicious']
269 );
270 }
271
272 $this->data = [];
273 $set = $this->db->query("SELECT * FROM usr_pref " .
274 " WHERE " . $this->db->in("keyword", $prefs, false, "text") .
275 " AND " . $this->db->in("usr_id", $a_ids, false, "integer"));
276 while ($rec = $this->db->fetchAssoc($set)) {
277 $this->data[] = ["UserId" => $rec["usr_id"], "Keyword" => $rec["keyword"], "Value" => $rec["value"]];
278 }
279 break;
280 }
281 }
282
283 if ($a_entity == "usr_multi") {
284 switch ($a_version) {
285 case "4.5.0":
286 case "5.1.0":
287 case "5.2.0":
288 case "5.3.0":
289 $this->data = [];
290 $set = $this->db->query("SELECT * FROM usr_profile_data" .
291 " WHERE " . $this->db->in("usr_id", $a_ids, false, "integer"));
292 while ($rec = $this->db->fetchAssoc($set)) {
293 $this->data[] = ["UserId" => $rec["usr_id"], "FieldId" => $rec["field_id"], "Value" => $rec["value"]];
294 }
295 break;
296 }
297 }
298 }
299
300 public function importRecord(
301 string $a_entity,
302 array $a_types,
303 array $a_rec,
304 ilImportMapping $a_mapping,
305 string $a_schema_version
306 ): void {
307 switch ($a_entity) {
308 case "usr":
309 // only users themselves import their profiles!
310 // thus we can map the import id of the dataset to the current user
311 $a_mapping->addMapping('components/ILIAS/User', 'usr', $a_rec['Id'], $this->current_user->getId());
312 break;
313
314 case "usr_profile":
315 $usr_id = $a_mapping->getMapping("components/ILIAS/User", "usr", $a_rec["Id"]);
316 if ($usr_id > 0 && ilObject::_lookupType($usr_id) == "usr") {
317 if (!isset($this->users[$usr_id])) {
318 $this->users[$usr_id] = new ilObjUser($usr_id);
319 }
320 $user = array_reduce(
321 $fields = $this->user_profile->getFields([], [Alias::class, Roles::class]),
322 function (\ilObjUser $c, ProfileField $v) use ($a_rec): \ilObjUser {
323 $up_k = $this->convertToLeadingUpper($k);
324 if (!$this->user_profile->userFieldVisibleToUser($k)
325 || !isset($a_rec[$up_k])) {
326 return $c;
327 }
328 return $v->addValueToUserObject($c, Context::UserAdministration, ilUtil::secureString($a_rec[$up_k]));
329 },
330 $this->users[$usr_id]
331 );
332
333 $user->setLatitude($a_rec["Latitude"] ?? null);
334 $user->setLongitude($a_rec["Longitude"] ?? null);
335 $zoom = isset($a_rec["LocZoom"]) ? (int) $a_rec["LocZoom"] : null;
336 $user->setLocationZoom($zoom);
337
338 $user->update();
339
340 // personal picture
341 $pic_dir = $this->getImportDirectory() . "/" . str_replace("..", "", $a_rec["Picture"]);
342 if ($pic_dir != "" && is_dir($pic_dir)) {
343 $upload_file = $pic_dir . "/usr_" . $a_rec["Id"] . ".jpg";
344 if (!is_file($upload_file)) {
345 $upload_file = $pic_dir . "/upload_" . $a_rec["Id"] . "pic";
346 }
347 if (is_file($upload_file)) {
348 $user->uploadPersonalPicture($upload_file);
349 }
350 }
351 }
352 break;
353
354 case "usr_setting":
355 $usr_id = $a_mapping->getMapping("components/ILIAS/User", "usr", $a_rec["UserId"]);
356 if ($usr_id > 0 && ilObject::_lookupType($usr_id) == "usr") {
357 if (!isset($this->users[$usr_id])) {
358 $this->users[$usr_id] = new ilObjUser($usr_id);
359 }
360 $user = $this->users[$usr_id];
361 $user->writePref($a_rec["Keyword"], ilUtil::secureString($a_rec["Value"]));
362 }
363 break;
364
365 case "usr_multi":
366 $usr_id = $a_mapping->getMapping("components/ILIAS/User", "usr", $a_rec["UserId"]);
367 if ($usr_id > 0 && ilObject::_lookupType($usr_id) == "usr") {
368 $this->multi[$usr_id][$a_rec["FieldId"]][] = ilUtil::secureString($a_rec["Value"]);
369 }
370 break;
371 }
372 }
373}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
A dataset contains in data in a common structure that can be shared and transformed for different pur...
convertToLeadingUpper(string $a_str)
Make xyz_abc a XyzAbc string.
getDirectDataFromQuery(string $a_query, bool $a_convert_to_leading_upper=true, bool $a_set=true)
Get data from query.This is a standard procedure, all db field names are directly mapped to abstract ...
initByExporter(ilXmlExporter $xml_exporter)
static makeDir(string $a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
static ilTempnam(?string $a_temp_path=null)
Returns a unique and non existing Path for e temporary file or directory.
static delDir(string $a_dir, bool $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
addMapping(string $a_comp, string $a_entity, string $a_old_id, string $a_new_id)
getMapping(string $a_comp, string $a_entity, string $a_old_id)
User class.
static _getPersonalPicturePath(int $a_usr_id, string $a_size='small', bool $a_force_pic=false)
static copyProfilePicturesToDirectory(int $a_user_id, string $a_dir)
static _lookupType(int $id, bool $reference=false)
ilUserExportConfig $export_config
getXmlNamespace(string $a_entity, string $a_schema_version)
afterXmlRecordWriting(string $a_entity, string $a_version, array $a_set)
getXmlRecord(string $a_entity, string $a_version, array $a_set)
Get xml record for version.
getTypes(string $a_entity, string $a_version)
Get (abstract) types for (abstract) field names.
importRecord(string $a_entity, array $a_types, array $a_rec, ilImportMapping $a_mapping, string $a_schema_version)
Needs to be overwritten for import use case.
readData(string $a_entity, string $a_version, array $a_ids)
Read data from DB.
static secureString(string $a_str, bool $a_strip_html=true, string $a_allow="")
Xml Exporter class.
$c
Definition: deliver.php:25
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26