Passed
Push — master ( f437d8...92f70a )
by Julito
10:14
created

processUsers()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 45
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 34
nc 6
nop 2
dl 0
loc 45
rs 8.4426
c 0
b 0
f 0
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
use ChamiloSession as Session;
5
6
/**
7
 * This tool allows platform admins to add users by uploading a CSV or XML file.
8
 *
9
 * @package chamilo.admin
10
 */
11
$cidReset = true;
12
require_once __DIR__.'/../inc/global.inc.php';
13
14
// Set this option to true to enforce strict purification for usenames.
15
$purification_option_for_usernames = false;
16
$userId = api_get_user_id();
17
18
/**
19
 * @param array $users
20
 * @param bool  $checkUniqueEmail
21
 *
22
 * @return array
23
 */
24
function validate_data($users, $checkUniqueEmail = false)
25
{
26
    global $defined_auth_sources;
27
    $usernames = [];
28
29
    // 1. Check if mandatory fields are set.
30
    $mandatory_fields = ['LastName', 'FirstName'];
31
    if (api_get_setting('registration', 'email') == 'true' || $checkUniqueEmail) {
32
        $mandatory_fields[] = 'Email';
33
    }
34
35
    $classExistList = [];
36
    $usergroup = new UserGroup();
37
    foreach ($users as &$user) {
38
        $user['has_error'] = false;
39
        $user['message'] = '';
40
41
        foreach ($mandatory_fields as $field) {
42
            if (empty($user[$field])) {
43
                $user['message'] .= Display::return_message(get_lang($field.'Mandatory'), 'warning');
44
                $user['has_error'] = true;
45
            }
46
        }
47
48
        $username = isset($user['UserName']) ? $user['UserName'] : '';
49
        // 2. Check username, first, check whether it is empty.
50
        if (!UserManager::is_username_empty($username)) {
51
            // 2.1. Check whether username is too long.
52
            if (UserManager::is_username_too_long($username)) {
53
                $user['message'] .= Display::return_message(get_lang('UserNameTooLong'), 'warning');
54
                $user['has_error'] = true;
55
            }
56
            // 2.1.1
57
            $hasDash = strpos($username, '-');
58
            if ($hasDash !== false) {
59
                $user['message'] .= Display::return_message(get_lang('UserNameHasDash'), 'warning');
60
                $user['has_error'] = true;
61
            }
62
            // 2.2. Check whether the username was used twice in import file.
63
            if (isset($usernames[$username])) {
64
                $user['message'] .= Display::return_message(get_lang('UserNameUsedTwice'), 'warning');
65
                $user['has_error'] = true;
66
            }
67
            $usernames[$username] = 1;
68
            // 2.3. Check whether username is already occupied.
69
            if (!UserManager::is_username_available($username)) {
70
                $user['message'] .= Display::return_message(get_lang('UserNameNotAvailable'), 'warning');
71
                $user['has_error'] = true;
72
            }
73
        }
74
75
        if (isset($user['Email'])) {
76
            $result = api_valid_email($user['Email']);
77
            if ($result === false) {
78
                $user['message'] .= Display::return_message(get_lang('PleaseEnterValidEmail'), 'warning');
79
                $user['has_error'] = true;
80
            }
81
        }
82
83
        if ($checkUniqueEmail) {
84
            if (isset($user['Email'])) {
85
                $userFromEmail = api_get_user_info_from_email($user['Email']);
86
                if (!empty($userFromEmail)) {
87
                    $user['message'] .= Display::return_message(get_lang('EmailUsedTwice'), 'warning');
88
                    $user['has_error'] = true;
89
                }
90
            }
91
        }
92
93
        // 3. Check status.
94
        if (isset($user['Status']) && !api_status_exists($user['Status'])) {
95
            $user['message'] .= Display::return_message(get_lang('WrongStatus'), 'warning');
96
            $user['has_error'] = true;
97
        }
98
99
        // 4. Check ClassId
100
        if (!empty($user['ClassId'])) {
101
            $classId = explode('|', trim($user['ClassId']));
102
            foreach ($classId as $id) {
103
                if (in_array($id, $classExistList)) {
104
                    continue;
105
                }
106
                $info = $usergroup->get($id);
107
                if (empty($info)) {
108
                    $user['message'] .= Display::return_message(
109
                        sprintf(get_lang('ClassIdDoesntExists'), $id),
110
                        'warning'
111
                    );
112
                    $user['has_error'] = true;
113
                } else {
114
                    $classExistList[] = $info['id'];
115
                }
116
            }
117
        }
118
119
        // 5. Check authentication source
120
        if (!empty($user['AuthSource'])) {
121
            if (!in_array($user['AuthSource'], $defined_auth_sources)) {
122
                $user['message'] .= Display::return_message(get_lang('AuthSourceNotAvailable'), 'warning');
123
                $user['has_error'] = true;
124
            }
125
        }
126
    }
127
128
    return $users;
129
}
130
131
/**
132
 * Add missing user-information (which isn't required, like password, username etc).
133
 *
134
 * @param array $user
135
 */
136
function complete_missing_data($user)
137
{
138
    global $purification_option_for_usernames;
139
140
    $username = isset($user['UserName']) ? $user['UserName'] : '';
141
142
    // 1. Create a username if necessary.
143
    if (UserManager::is_username_empty($username)) {
144
        $user['UserName'] = UserManager::create_unique_username(
145
            $user['FirstName'],
146
            $user['LastName']
147
        );
148
    } else {
149
        $user['UserName'] = UserManager::purify_username(
150
            $user['UserName'],
151
            $purification_option_for_usernames
152
        );
153
    }
154
155
    // 2. Generate a password if necessary.
156
    if (empty($user['Password'])) {
157
        $user['Password'] = api_generate_password();
158
    }
159
    // 3. Set status if not allready set.
160
    if (empty($user['Status'])) {
161
        $user['Status'] = 'user';
162
    }
163
    // 4. Set authsource if not allready set.
164
    if (empty($user['AuthSource'])) {
165
        $user['AuthSource'] = PLATFORM_AUTH_SOURCE;
166
    }
167
168
    if (empty($user['ExpiryDate'])) {
169
        $user['ExpiryDate'] = '';
170
    }
171
172
    if (!isset($user['OfficialCode'])) {
173
        $user['OfficialCode'] = '';
174
    }
175
176
    if (!isset($user['language'])) {
177
        $user['language'] = '';
178
    }
179
180
    if (!isset($user['PhoneNumber'])) {
181
        $user['PhoneNumber'] = '';
182
    }
183
184
    if (!isset($user['OfficialCode'])) {
185
        $user['OfficialCode'] = '';
186
    }
187
188
    return $user;
189
}
190
191
/**
192
 * Save the imported data.
193
 *
194
 * @param array $users    List of users
195
 * @param bool  $sendMail
196
 *
197
 * @uses \global variable $inserted_in_course, which returns the list of
198
 * courses the user was inserted in
199
 */
200
function save_data($users, $sendMail = false)
201
{
202
    global $inserted_in_course;
203
    // Not all scripts declare the $inserted_in_course array (although they should).
204
    if (!isset($inserted_in_course)) {
205
        $inserted_in_course = [];
206
    }
207
208
    $usergroup = new UserGroup();
209
    if (is_array($users)) {
210
        foreach ($users as &$user) {
211
            if ($user['has_error']) {
212
                continue;
213
            }
214
215
            $user = complete_missing_data($user);
216
            $user['Status'] = api_status_key($user['Status']);
217
            $user_id = UserManager::create_user(
218
                $user['FirstName'],
219
                $user['LastName'],
220
                $user['Status'],
221
                $user['Email'],
222
                $user['UserName'],
223
                $user['Password'],
224
                $user['OfficialCode'],
225
                $user['language'],
226
                $user['PhoneNumber'],
227
                '',
228
                $user['AuthSource'],
229
                $user['ExpiryDate'],
230
                1,
231
                0,
232
                null,
233
                null,
234
                $sendMail
235
            );
236
237
            if ($user_id) {
238
                $returnMessage = Display::return_message(get_lang('UserAdded'), 'success');
239
240
                if (isset($user['Courses']) && is_array($user['Courses'])) {
241
                    foreach ($user['Courses'] as $course) {
242
                        if (CourseManager::course_exists($course)) {
243
                            $result = CourseManager::subscribeUser($user_id, $course, $user['Status']);
244
                            if ($result) {
245
                                $course_info = api_get_course_info($course);
246
                                $inserted_in_course[$course] = $course_info['title'];
247
                            }
248
                        }
249
                    }
250
                }
251
252
                if (isset($user['Sessions']) && is_array($user['Sessions'])) {
253
                    foreach ($user['Sessions'] as $sessionId) {
254
                        $sessionInfo = api_get_session_info($sessionId);
255
                        if (!empty($sessionInfo)) {
256
                            SessionManager::subscribeUsersToSession(
257
                                $sessionId,
258
                                [$user_id],
259
                                SESSION_VISIBLE_READ_ONLY,
260
                                false
261
                            );
262
                        }
263
                    }
264
                }
265
266
                if (!empty($user['ClassId'])) {
267
                    $classId = explode('|', trim($user['ClassId']));
268
                    foreach ($classId as $id) {
269
                        $usergroup->subscribe_users_to_usergroup($id, [$user_id], false);
270
                    }
271
                }
272
273
                // Saving extra fields.
274
                global $extra_fields;
275
                // We are sure that the extra field exists.
276
                foreach ($extra_fields as $extras) {
277
                    if (isset($user[$extras[1]])) {
278
                        $key = $extras[1];
279
                        $value = $user[$extras[1]];
280
                        UserManager::update_extra_field_value($user_id, $key, $value);
281
                    }
282
                }
283
            } else {
284
                $returnMessage = Display::return_message(get_lang('Error'), 'warning');
285
            }
286
            $user['message'] = $returnMessage;
287
        }
288
    }
289
290
    return $users;
291
}
292
293
/**
294
 * @param array  $users
295
 * @param string $fileName
296
 * @param int    $sendEmail
297
 * @param bool   $checkUniqueEmail
298
 * @param bool   $resumeImport
299
 *
300
 * @return array
301
 */
302
function parse_csv_data($users, $fileName, $sendEmail = 0, $checkUniqueEmail = true, $resumeImport = false)
303
{
304
    $usersFromOrigin = $users;
305
    $allowRandom = api_get_configuration_value('generate_random_login');
306
    if ($allowRandom) {
307
        $factory = new RandomLib\Factory();
308
        $generator = $factory->getLowStrengthGenerator();
309
        $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
310
    }
311
312
    $readMax = 50;
313
    $userId = api_get_user_id();
314
    $logMessages = '';
315
    $importData = Session::read('user_import_data_'.$userId);
316
    if (!empty($importData)) {
317
        $counter = $importData['counter'];
318
        $users = $importData['complete_list'];
319
        $users = array_splice($users, $counter, $readMax);
320
        $logMessages = $importData['log_messages'];
321
    } else {
322
        $users = array_splice($users, 0, $readMax);
323
    }
324
325
    if ($resumeImport === false) {
326
        $users = $usersFromOrigin;
327
    }
328
329
    $counter = 0;
330
    foreach ($users as $index => $user) {
331
        if ($resumeImport) {
332
            if ($counter >= $readMax) {
333
                $users = array_splice($users, $counter, $readMax);
334
                break;
335
            }
336
        }
337
        $counter++;
338
        if (empty($user['UserName'])) {
339
            if ($allowRandom) {
340
                $username = $generator->generateString(10, $chars);
341
                $user['UserName'] = $username;
342
            }
343
        }
344
        if (isset($user['Courses'])) {
345
            $user['Courses'] = explode('|', trim($user['Courses']));
346
        }
347
348
        if (isset($user['Sessions'])) {
349
            $user['Sessions'] = explode('|', trim($user['Sessions']));
350
        }
351
352
        // Lastname is needed.
353
        if (!isset($user['LastName']) || (isset($user['LastName']) && empty($user['LastName']))) {
354
            unset($users[$index]);
355
            continue;
356
        }
357
358
        // FirstName is needed.
359
        if (!isset($user['FirstName']) || (isset($user['FirstName']) && empty($user['FirstName']))) {
360
            unset($users[$index]);
361
            continue;
362
        }
363
364
        $users[$index] = $user;
365
    }
366
367
    $globalCounter = $counter;
368
    if (!empty($importData)) {
369
        $globalCounter = $importData['counter'] + $counter;
370
    }
371
372
    $importData = [
373
        'complete_list' => $usersFromOrigin,
374
        'filename' => $fileName,
375
        'counter' => $globalCounter,
376
        'check_unique_email' => $checkUniqueEmail,
377
        'send_email' => $sendEmail,
378
        'date' => api_get_utc_datetime(),
379
        'log_messages' => $logMessages,
380
        'resume' => $resumeImport,
381
    ];
382
383
    Session::write('user_import_data_'.$userId, $importData);
384
385
    return $users;
386
}
387
388
/**
389
 * Read the XML-file.
390
 *
391
 * @param string $file Path to the XML-file
392
 *
393
 * @return array All user information read from the file
394
 */
395
function parse_xml_data($file)
396
{
397
    $crawler = new \Symfony\Component\DomCrawler\Crawler();
398
    $crawler->addXmlContent(file_get_contents($file));
399
    $crawler = $crawler->filter('Contacts > Contact ');
400
    $array = [];
401
    foreach ($crawler as $domElement) {
402
        $row = [];
403
        foreach ($domElement->childNodes as $node) {
404
            if ($node->nodeName != '#text') {
405
                $row[$node->nodeName] = $node->nodeValue;
406
            }
407
        }
408
        if (!empty($row)) {
409
            $array[] = $row;
410
        }
411
    }
412
413
    return $array;
414
}
415
416
/**
417
 * @param array $users
418
 * @param bool  $sendMail
419
 */
420
function processUsers(&$users, $sendMail)
421
{
422
    $users = save_data($users, $sendMail);
423
424
    $warningMessage = '';
425
    if (!empty($users)) {
426
        $table = new HTML_Table(['class' => 'table table-responsive']);
427
        $headers = [
428
            get_lang('User'),
429
            get_lang('Status'),
430
        ];
431
        $row = 0;
432
        $column = 0;
433
        foreach ($headers as $header) {
434
            $table->setHeaderContents($row, $column, $header);
435
            $column++;
436
        }
437
        $row++;
438
        foreach ($users as $user) {
439
            $column = 0;
440
            $email = isset($user['Email']) ? ' - '.$user['Email'] : null;
441
            $userData =
442
                '<strong>'.$user['UserName'].'</strong> - '.
443
                api_get_person_name(
444
                    $user['FirstName'],
445
                    $user['LastName']
446
                ).' '.$email;
447
            $table->setCellContents($row, $column, $userData);
448
            $table->setCellContents($row, ++$column, $user['message']);
449
            $row++;
450
        }
451
        $warningMessage = $table->toHtml();
452
    }
453
454
    // if the warning message is too long then we display the warning message trough a session
455
    Display::addFlash(Display::return_message(get_lang('FileImported'), 'confirmation', false));
456
457
    $importData = Session::read('user_import_data_'.api_get_user_id());
458
    if (!empty($importData)) {
459
        if (isset($importData['log_messages'])) {
460
            $importData['log_messages'] .= $warningMessage;
461
        } else {
462
            $importData['log_messages'] = $warningMessage;
463
        }
464
        Session::write('user_import_data_'.api_get_user_id(), $importData);
465
    }
466
}
467
468
$this_section = SECTION_PLATFORM_ADMIN;
469
api_protect_admin_script(true, null);
470
api_protect_limit_for_session_admin();
471
set_time_limit(0);
472
473
$defined_auth_sources[] = PLATFORM_AUTH_SOURCE;
474
475
if (isset($extAuthSource) && is_array($extAuthSource)) {
476
    $defined_auth_sources = array_merge($defined_auth_sources, array_keys($extAuthSource));
477
}
478
479
$tool_name = get_lang('ImportUserListXMLCSV');
480
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
481
$reloadImport = (isset($_REQUEST['reload_import']) && (int) $_REQUEST['reload_import'] === 1);
482
483
$extra_fields = UserManager::get_extra_fields(0, 0, 5, 'ASC', true);
484
485
if (isset($_POST['formSent']) && $_POST['formSent'] && $_FILES['import_file']['size'] !== 0) {
486
    $file_type = $_POST['file_type'];
487
    Security::clear_token();
488
    $tok = Security::get_token();
489
    $allowed_file_mimetype = ['csv', 'xml'];
490
    $error_kind_file = true;
491
492
    $checkUniqueEmail = isset($_POST['check_unique_email']) ? $_POST['check_unique_email'] : null;
493
    $sendMail = $_POST['sendMail'] ? true : false;
494
    $resume = isset($_POST['resume_import']) ? true : false;
495
    $uploadInfo = pathinfo($_FILES['import_file']['name']);
496
    $ext_import_file = $uploadInfo['extension'];
497
498
    $users = [];
499
    if (in_array($ext_import_file, $allowed_file_mimetype)) {
500
        if (strcmp($file_type, 'csv') === 0 &&
501
            $ext_import_file == $allowed_file_mimetype[0]
502
        ) {
503
            Session::erase('user_import_data_'.$userId);
504
            $users = Import::csvToArray($_FILES['import_file']['tmp_name']);
505
            $users = parse_csv_data(
506
                $users,
507
                $_FILES['import_file']['name'],
508
                $sendMail,
509
                $checkUniqueEmail,
510
                $resume
511
            );
512
            $users = validate_data($users, $checkUniqueEmail);
513
            $error_kind_file = false;
514
        } elseif (strcmp($file_type, 'xml') === 0 && $ext_import_file == $allowed_file_mimetype[1]) {
515
            $users = parse_xml_data($_FILES['import_file']['tmp_name']);
516
            $users = validate_data($users, $checkUniqueEmail);
517
            $error_kind_file = false;
518
        }
519
520
        processUsers($users, $sendMail);
521
522
        if ($error_kind_file) {
523
            Display::addFlash(
524
                Display::return_message(
525
                    get_lang('YouMustImportAFileAccordingToSelectedOption'),
526
                    'error',
527
                    false
528
                )
529
            );
530
        } else {
531
            $reload = '';
532
            if ($resume) {
533
                $reload = '?reload_import=1';
534
            }
535
            header('Location: '.api_get_self().$reload);
536
            exit;
537
        }
538
    } else {
539
        Display::addFlash(
540
            Display::return_message(
541
                get_lang('YouMustImportAFileAccordingToSelectedOption'),
542
                'error',
543
                false
544
            )
545
        );
546
        //header('Location: '.api_get_path(WEB_CODE_PATH).'admin/user_list.php?sec_token='.$tok);
547
        header('Location: '.api_get_self());
548
        exit;
549
    }
550
}
551
552
$importData = Session::read('user_import_data_'.$userId);
553
554
$formContinue = false;
555
$resumeStop = true;
556
if (!empty($importData)) {
557
    $isResume = $importData['resume'];
558
559
    $formContinue = new FormValidator('user_import_continue', 'post', api_get_self());
560
    $label = get_lang('Results');
561
    if ($isResume) {
562
        $label = get_lang('ContinueLastImport');
563
    }
564
    $formContinue->addHeader($label);
565
    $formContinue->addLabel(get_lang('File'), $importData['filename']);
566
567
    $resumeStop = true;
568
    if ($isResume) {
569
        $totalUsers = isset($importData['complete_list']) ? count($importData['complete_list']) : 0;
570
        $counter = isset($importData['counter']) ? $importData['counter'] : 0;
571
        $bar = '';
572
        if (!empty($totalUsers)) {
573
            $bar = Display::bar_progress($counter / $totalUsers * 100);
574
        }
575
        $formContinue->addLabel(get_lang('Status'), $bar);
576
        $formContinue->addLabel(
577
            get_lang('UsersAdded'),
578
            $importData['counter'].' / '.count($importData['complete_list'])
579
        );
580
    } else {
581
        $formContinue->addLabel(
582
            get_lang('Users'),
583
            count($importData['complete_list'])
584
        );
585
    }
586
587
    $formContinue->addLabel(
588
        get_lang('CheckUniqueEmail'),
589
        $importData['check_unique_email'] ? get_lang('Yes') : get_lang('No')
590
    );
591
    $formContinue->addLabel(get_lang('SendMailToUsers'), $importData['send_email'] ? get_lang('Yes') : get_lang('No'));
592
    $formContinue->addLabel(get_lang('Date'), Display::dateToStringAgoAndLongDate($importData['date']));
593
594
    if ($isResume) {
595
        $resumeStop = $importData['counter'] >= count($importData['complete_list']);
596
        if ($resumeStop == false) {
597
            $formContinue->addButtonImport(get_lang('ContinueImport'), 'import_continue');
598
        }
599
    }
600
601
    $formContinue->addHtml(get_lang('Results').'<br />'.$importData['log_messages']);
602
603
    if ($formContinue->validate()) {
604
        $users = parse_csv_data(
605
            $importData['complete_list'],
606
            $importData['filename'],
607
            $importData['send_email'],
608
            $importData['check_unique_email'],
609
            true
610
        );
611
        $users = validate_data($users, $importData['check_unique_email']);
612
613
        processUsers($users, $importData['send_email']);
614
615
        $reload = '';
616
        if ($isResume && $resumeStop === false) {
617
            $reload = '?reload_import=1';
618
        }
619
620
        header('Location: '.api_get_self().$reload);
621
        exit;
622
    }
623
}
624
625
Display::display_header($tool_name);
626
627
$form = new FormValidator('user_import', 'post', api_get_self());
628
$form->addHeader($tool_name);
629
$form->addElement('hidden', 'formSent');
630
$form->addElement('file', 'import_file', get_lang('ImportFileLocation'));
631
$group = [
632
    $form->createElement(
633
        'radio',
634
        'file_type',
635
        '',
636
        'CSV (<a href="example.csv" target="_blank" download>'.get_lang('ExampleCSVFile').'</a>)',
637
        'csv'
638
    ),
639
    $form->createElement(
640
        'radio',
641
        'file_type',
642
        null,
643
        'XML (<a href="example.xml" target="_blank" download>'.get_lang('ExampleXMLFile').'</a>)',
644
        'xml'
645
    ),
646
];
647
648
$form->addGroup($group, '', get_lang('FileType'));
649
650
$group = [
651
    $form->createElement('radio', 'sendMail', '', get_lang('Yes'), 1),
652
    $form->createElement('radio', 'sendMail', null, get_lang('No'), 0),
653
];
654
$form->addGroup($group, '', get_lang('SendMailToUsers'));
655
656
$form->addElement(
657
    'checkbox',
658
    'check_unique_email',
659
    '',
660
    get_lang('CheckUniqueEmail')
661
);
662
663
$form->addElement(
664
    'checkbox',
665
    'resume_import',
666
    '',
667
    get_lang('ResumeImport')
668
);
669
670
$form->addButtonImport(get_lang('Import'));
671
672
$defaults['formSent'] = 1;
673
$defaults['sendMail'] = 0;
674
$defaults['file_type'] = 'csv';
675
676
$extraSettings = api_get_configuration_value('user_import_settings');
677
if (!empty($extraSettings) && isset($extraSettings['options']) &&
678
    isset($extraSettings['options']['send_mail_default_option'])
679
) {
680
    $defaults['sendMail'] = $extraSettings['options']['send_mail_default_option'];
681
}
682
683
$form->setDefaults($defaults);
684
$form->display();
685
686
if ($formContinue) {
687
    $formContinue->display();
688
}
689
690
if ($reloadImport) {
691
    echo '<script>
692
        
693
        $(function() {
694
            function reload() {
695
                $("#user_import_continue").submit();                
696
            }
697
            setTimeout(reload, 3000);
698
        });        
699
    </script>';
700
}
701
702
$list = [];
703
$list_reponse = [];
704
$result_xml = '';
705
$i = 0;
706
$count_fields = count($extra_fields);
707
if ($count_fields > 0) {
708
    foreach ($extra_fields as $extra) {
709
        $list[] = $extra[1];
710
        $list_reponse[] = 'xxx';
711
        $spaces = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
712
        $result_xml .= $spaces.'&lt;'.$extra[1].'&gt;xxx&lt;/'.$extra[1].'&gt;';
713
        if ($i != $count_fields - 1) {
714
            $result_xml .= '<br/>';
715
        }
716
        $i++;
717
    }
718
}
719
?>
720
<p><?php echo get_lang('CSVMustLookLike').' ('.get_lang('MandatoryFields').')'; ?> :</p>
721
<blockquote>
722
<pre>
723
<b>LastName</b>;<b>FirstName</b>;<b>Email</b>;UserName;Password;AuthSource;OfficialCode;PhoneNumber;Status;ExpiryDate;<span style="color:red;"><?php if (count($list) > 0) {
724
    echo implode(';', $list).';';
725
} ?></span>Courses;Sessions;ClassId;
726
<b>xxx</b>;<b>xxx</b>;<b>xxx</b>;xxx;xxx;<?php echo implode('/', $defined_auth_sources); ?>;xxx;xxx;user/teacher/drh;0000-00-00 00:00:00;<span style="color:red;"><?php if (count($list_reponse) > 0) {
727
    echo implode(';', $list_reponse).';';
728
} ?></span>xxx1|xxx2|xxx3;sessionId|sessionId|sessionId;1;<br />
729
</pre>
730
</blockquote>
731
<p><?php echo get_lang('XMLMustLookLike').' ('.get_lang('MandatoryFields').')'; ?> :</p>
732
<blockquote>
733
<pre>
734
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
735
&lt;Contacts&gt;
736
    &lt;Contact&gt;
737
        <b>&lt;LastName&gt;xxx&lt;/LastName&gt;</b>
738
        <b>&lt;FirstName&gt;xxx&lt;/FirstName&gt;</b>
739
        &lt;UserName&gt;xxx&lt;/UserName&gt;
740
        &lt;Password&gt;xxx&lt;/Password&gt;
741
        &lt;AuthSource&gt;<?php echo implode('/', $defined_auth_sources); ?>&lt;/AuthSource&gt;
742
        <b>&lt;Email&gt;xxx&lt;/Email&gt;</b>
743
        &lt;OfficialCode&gt;xxx&lt;/OfficialCode&gt;
744
        &lt;PhoneNumber&gt;xxx&lt;/PhoneNumber&gt;
745
        &lt;Status&gt;user/teacher/drh<?php if ($result_xml != '') {
746
    echo '<br /><span style="color:red;">', $result_xml;
747
    echo '</span>';
748
} ?>&lt;/Status&gt;
749
        &lt;Courses&gt;xxx1|xxx2|xxx3&lt;/Courses&gt;
750
        &lt;Sessions&gt;sessionId|sessionId|sessionId&lt;/Sessions&gt;
751
        &lt;ClassId&gt;1&lt;/ClassId&gt;
752
        &lt;/Contact&gt;
753
&lt;/Contacts&gt;
754
</pre>
755
    </blockquote>
756
<?php
757
Display :: display_footer();
758