Passed
Push — 1.11.x ( d8730d...5bbfaa )
by Angel Fernando Quiroz
12:34
created

generateUnsubscribeForm()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 13
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 20
rs 9.8333
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
$cidReset = true; // Flag forcing the 'current course' reset
6
7
require_once __DIR__.'/../inc/global.inc.php';
8
9
api_block_anonymous_users();
10
11
$auth = new Auth();
12
$user_course_categories = CourseManager::get_user_course_categories(api_get_user_id());
13
$courses_in_category = $auth->getCoursesInCategory(false);
14
15
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
16
$currentUrl = api_get_self();
17
18
$interbreadcrumb[] = [
19
    'url' => api_get_self(),
20
    'name' => get_lang('SortMyCourses'),
21
];
22
23
// We are moving the course of the user to a different user defined course category (=Sort My Courses).
24
if (isset($_POST['submit_change_course_category'])) {
25
    $result = $auth->updateCourseCategory($_POST['course_2_edit_category'], $_POST['course_categories']);
26
    if ($result) {
27
        Display::addFlash(
28
            Display::return_message(get_lang('EditCourseCategorySucces'))
29
        );
30
    }
31
    header('Location: '.api_get_self());
32
    exit;
33
}
34
35
// We edit course category
36
if (isset($_POST['submit_edit_course_category']) &&
37
    isset($_POST['title_course_category'])
38
) {
39
    $result = $auth->store_edit_course_category($_POST['title_course_category'], $_POST['category_id']);
40
    if ($result) {
41
        Display::addFlash(
42
            Display::return_message(get_lang('CourseCategoryEditStored'))
43
        );
44
    }
45
46
    header('Location: '.api_get_self());
47
    exit;
48
}
49
50
// We are creating a new user defined course category (= Create Course Category).
51
if (isset($_POST['create_course_category']) &&
52
    isset($_POST['title_course_category']) &&
53
    strlen(trim($_POST['title_course_category'])) > 0
54
) {
55
    $result = $auth->store_course_category($_POST['title_course_category']);
56
    if ($result) {
57
        Display::addFlash(
58
            Display::return_message(get_lang('CourseCategoryStored'))
59
        );
60
    } else {
61
        Display::addFlash(
62
            Display::return_message(
63
                get_lang('ACourseCategoryWithThisNameAlreadyExists'),
64
                'error'
65
            )
66
        );
67
    }
68
    header('Location: '.api_get_self());
69
    exit;
70
}
71
72
// We are moving a course or category of the user up/down the list (=Sort My Courses).
73
if (isset($_GET['move'])) {
74
    if (isset($_GET['course'])) {
75
        $result = $auth->move_course($_GET['move'], $_GET['course'], $_GET['category']);
76
        if ($result) {
77
            Display::addFlash(
78
                Display::return_message(get_lang('CourseSortingDone'))
79
            );
80
        }
81
    }
82
    if (isset($_GET['category']) && !isset($_GET['course'])) {
83
        $result = $auth->move_category($_GET['move'], $_GET['category']);
84
        if ($result) {
85
            Display::addFlash(
86
                Display::return_message(get_lang('CategorySortingDone'))
87
            );
88
        }
89
    }
90
    header('Location: '.api_get_self());
91
    exit;
92
}
93
94
switch ($action) {
95
    case 'edit_category':
96
        $categoryId = isset($_GET['category_id']) ? (int) $_GET['category_id'] : 0;
97
        $categoryInfo = $auth->getUserCourseCategory($categoryId);
98
        if ($categoryInfo) {
99
            $categoryName = $categoryInfo['title'];
100
            $form = new FormValidator(
101
                'edit_course_category',
102
                'post',
103
                $currentUrl.'?action=edit_category'
104
            );
105
            $form->addText('title_course_category', get_lang('Name'));
106
            $form->addHidden('category_id', $categoryId);
107
            $form->addButtonSave(get_lang('Edit'), 'submit_edit_course_category');
108
            $form->setDefaults(['title_course_category' => $categoryName]);
109
            $form->display();
110
        }
111
        exit;
112
        break;
113
    case 'edit_course_category':
114
        $edit_course = (int) $_GET['course_id'];
115
        $defaultCategoryId = isset($_GET['category_id']) ? (int) $_GET['category_id'] : 0;
116
        $courseInfo = api_get_course_info_by_id($edit_course);
117
118
        if (empty($courseInfo)) {
119
            exit;
120
        }
121
122
        $form = new FormValidator(
123
            'edit_course_category',
124
            'post',
125
            $currentUrl.'?action=edit_course_category'
126
        );
127
128
        $form->addHeader($courseInfo['title']);
129
130
        $options = [];
131
        foreach ($user_course_categories as $row) {
132
            $options[$row['id']] = $row['title'];
133
        }
134
        asort($options);
135
136
        $form->addSelect(
137
            'course_categories',
138
            get_lang('Categories'),
139
            $options,
140
            ['disable_js' => true, 'placeholder' => get_lang('SelectAnOption')]
141
        );
142
        $form->addHidden('course_2_edit_category', $edit_course);
143
144
        if (!empty($defaultCategoryId)) {
145
            $form->setDefaults(['course_categories' => $defaultCategoryId]);
146
        }
147
        $form->addButtonSave(get_lang('Save'), 'submit_change_course_category');
148
        $form->display();
149
        exit;
150
        break;
151
    case 'deletecoursecategory':
152
        // we are deleting a course category
153
        if (isset($_GET['id'])) {
154
            if (Security::check_token('get')) {
155
                $result = $auth->delete_course_category($_GET['id']);
156
                if ($result) {
157
                    Display::addFlash(
158
                        Display::return_message(get_lang('CourseCategoryDeleted'))
159
                    );
160
                }
161
            }
162
        }
163
        header('Location: '.api_get_self());
164
        exit;
165
        break;
166
    case 'createcoursecategory':
167
        $form = new FormValidator(
168
            'create_course_category',
169
            'post',
170
            $currentUrl.'?action=createcoursecategory'
171
        );
172
        $form->addText('title_course_category', get_lang('Name'));
173
        $form->addButtonSave(get_lang('AddCategory'), 'create_course_category');
174
        $form->display();
175
        exit;
176
        break;
177
    case 'set_collapsable':
178
        if (!api_get_configuration_value('allow_user_course_category_collapsable')) {
179
            api_not_allowed(true);
180
        }
181
182
        $userId = api_get_user_id();
183
        $categoryId = isset($_REQUEST['categoryid']) ? (int) $_REQUEST['categoryid'] : 0;
184
        $option = isset($_REQUEST['option']) ? (int) $_REQUEST['option'] : 0;
185
        $redirect = isset($_REQUEST['redirect']) ? $_REQUEST['redirect'] : 0;
186
187
        if (empty($userId) || empty($categoryId)) {
188
            api_not_allowed(true);
189
        }
190
191
        $table = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
192
        $sql = "UPDATE $table
193
                SET collapsed = $option
194
                WHERE user_id = $userId AND id = $categoryId";
195
        Database::query($sql);
196
        Display::addFlash(Display::return_message(get_lang('Updated')));
197
198
        if ($redirect === 'home') {
199
            $url = api_get_path(WEB_PATH).'user_portal.php';
200
            header('Location: '.$url);
201
            exit;
202
        }
203
204
        $url = api_get_self();
205
        header('Location: '.$url);
206
        exit;
207
        break;
208
}
209
210
function generateUnsubscribeForm(string $courseCode, string $secToken): string
211
{
212
    $alertMessage = api_htmlentities(get_lang("ConfirmUnsubscribeFromCourse"), ENT_QUOTES);
213
214
    $form = new FormValidator(
215
        'frm_unsubscribe',
216
        'get',
217
        api_get_path(WEB_CODE_PATH).'auth/courses.php',
218
        '',
219
        [
220
            'onsubmit' => 'javascript: if (!confirm(\''.addslashes($alertMessage).'\')) return false;',
221
        ],
222
        FormValidator::LAYOUT_INLINE
223
    );
224
    $form->addHidden('action', 'unsubscribe');
225
    $form->addHidden('sec_token', $secToken);
226
    $form->addHidden('unsubscribe', $courseCode);
227
    $form->addButton('unsub', get_lang('Unsubscribe'));
228
229
    return $form->returnForm();
230
}
231
232
Display::display_header();
233
234
$stok = Security::get_token();
235
$courses_without_category = isset($courses_in_category[0]) ? $courses_in_category[0] : null;
236
echo '<div id="actions" class="actions">';
237
if ($action != 'createcoursecategory') {
238
    echo '<a class="ajax" href="'.$currentUrl.'?action=createcoursecategory">';
239
    echo Display::return_icon('new_folder.png', get_lang('CreateCourseCategory'), '', '32');
240
    echo '</a>';
241
}
242
echo '</div>';
243
244
if (!empty($message)) {
245
    echo Display::return_message($message, 'confirm', false);
246
}
247
248
$allowCollapsable = api_get_configuration_value('allow_user_course_category_collapsable');
249
$teachersIcon = Display::return_icon('teacher.png', get_lang('Teachers'), null, ICON_SIZE_TINY);
250
251
// COURSES WITH CATEGORIES
252
if (!empty($user_course_categories)) {
253
    $counter = 0;
254
    $last = end($user_course_categories);
255
    foreach ($user_course_categories as $row) {
256
        echo Display::page_subheader($row['title']);
257
        echo '<a name="category'.$row['id'].'"></a>';
258
        $url = $currentUrl.'?categoryid='.$row['id'].'&sec_token='.$stok;
259
        if ($allowCollapsable) {
260
            if (isset($row['collapsed']) && $row['collapsed'] == 0) {
261
                echo Display::url(
262
                    '<i class="fa fa-folder-open"></i>',
263
                    $url.'&action=set_collapsable&option=1'
264
                );
265
            } else {
266
                echo Display::url(
267
                    '<i class="fa fa-folder"></i>',
268
                    $url.'&action=set_collapsable&option=0'
269
                );
270
            }
271
        }
272
273
        echo Display::url(
274
            Display::return_icon('edit.png', get_lang('Edit'), '', 22),
275
            $currentUrl.'?action=edit_category&category_id='.$row['id'].'&sec_token='.$stok,
276
            ['class' => 'ajax']
277
        );
278
279
        if (0 != $counter) {
280
            echo Display::url(
281
                Display::return_icon('up.png', get_lang('Up'), '', 22),
282
                $currentUrl.'?move=up&category='.$row['id'].'&sec_token='.$stok
283
            );
284
        } else {
285
            echo Display::return_icon('up_na.png', get_lang('Up'), '', 22);
286
        }
287
        if ($row['id'] != $last['id']) {
288
            echo Display::url(
289
                Display::return_icon('down.png', get_lang('Down'), '', 22),
290
                $currentUrl.'?move=down&category='.$row['id'].'&sec_token='.$stok
291
            );
292
        } else {
293
            echo Display::return_icon('down_na.png', get_lang('Down'), '', 22);
294
        }
295
296
        echo Display::url(
297
            Display::return_icon(
298
                'delete.png',
299
                get_lang('Delete'),
300
                [
301
                    'onclick' => "javascript: if (!confirm('".addslashes(
302
                            api_htmlentities(
303
                                get_lang('CourseCategoryAbout2bedeleted'),
304
                                ENT_QUOTES,
305
                                api_get_system_encoding()
306
                            )
307
                        )."')) return false;",
308
                ],
309
                22
310
            ),
311
            $currentUrl.'?action=deletecoursecategory&id='.$row['id'].'&sec_token='.$stok
312
        );
313
314
        $counter++;
315
        echo '<br /><br />';
316
        // Show the courses inside this category
317
        echo '<table class="table table-hover table-striped data_table">';
318
        $number_of_courses = isset($courses_in_category[$row['id']]) ? count($courses_in_category[$row['id']]) : 0;
319
        $key = 0;
320
        if (!empty($courses_in_category[$row['id']])) {
321
            foreach ($courses_in_category[$row['id']] as $course) {
322
                echo '<tr><td>';
323
                echo '<a name="course'.$course['code'].'"></a>';
324
                echo '<strong>'.$course['title'].'</strong>';
325
                echo ' ('.$course['visual_code'].')';
326
                echo '<br />';
327
                echo $teachersIcon;
328
                echo '&nbsp;';
329
                echo CourseManager::getTeacherListFromCourseCodeToString($course['code']);
330
                echo '<br />';
331
                if (api_get_setting('display_teacher_in_courselist') === 'true') {
332
                    echo $course['tutor'];
333
                }
334
                echo '</td><td class="text-right">';
335
                if (api_get_setting('show_courses_descriptions_in_catalog') === 'true') {
336
                    $icon_title = get_lang('CourseDetails').' - '.$course['title'];
337
                    $url = api_get_path(
338
                            WEB_CODE_PATH
339
                        ).'inc/ajax/course_home.ajax.php?a=show_course_information&code='.$course['code'];
340
                    echo Security::remove_XSS(
341
                        Display::url(
342
                            Display::return_icon('info.png', $icon_title, '', '22'),
343
                            $url,
344
                            ['class' => 'ajax', 'data-title' => $icon_title, 'title' => $icon_title]
345
                        )
346
                    );
347
                    echo Display::url(
348
                        Display::return_icon('edit.png', get_lang('Edit'), '', 22),
349
                        $currentUrl.'?action=edit_course_category&category_id='.$row['id'].'&course_id='.$course['real_id'].'&sec_token='.$stok,
350
                        ['class' => 'ajax']
351
                    );
352
                }
353
                if ($key > 0) {
354
                    ?>
355
                    <a href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=up&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
356
                    <?php echo Display::display_icon('up.png', get_lang('Up'), '', 22); ?>
357
                    </a>
358
                <?php
359
                } else {
360
                    echo Display::display_icon('up_na.png', get_lang('Up'), '', 22);
361
                }
362
                if ($key < $number_of_courses - 1) {
363
                    ?>
364
                    <a href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=down&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
365
                    <?php echo Display::return_icon('down.png', get_lang('Down'), '', 22); ?>
366
                    </a>
367
                <?php
368
                } else {
369
                    echo Display::return_icon('down_na.png', get_lang('Down'), '', 22);
370
                }
371
                if ($course['status'] != 1 && $course['unsubscr'] == 1) {
372
                    echo generateUnsubscribeForm($course['code'], $stok);
373
                }
374
                $key++;
375
                echo '</td></tr>';
376
            }
377
            echo '</table>';
378
        }
379
    }
380
}
381
382
echo Display::page_subheader(get_lang('NoCourseCategory'));
383
echo '<table class="table table-hover table-striped data_table">';
384
// COURSES WITHOUT CATEGORY
385
if (!empty($courses_without_category)) {
386
    $number_of_courses = count($courses_without_category);
387
    $key = 0;
388
    foreach ($courses_without_category as $course) {
389
        echo '<tr><td>';
390
        echo '<a name="course'.$course['code'].'"></a>';
391
        echo '<strong>'.$course['title'].'</strong>';
392
        echo ' ('.$course['visual_code'].')';
393
        echo '<br />';
394
        echo $teachersIcon;
395
        echo '&nbsp;';
396
        echo CourseManager::getTeacherListFromCourseCodeToString($course['code']);
397
        echo '<br />';
398
399
        if (api_get_setting('display_teacher_in_courselist') === 'true') {
400
            echo $course['tutor'];
401
        }
402
        echo '</td><td class="text-right">';
403
        if (api_get_setting('show_courses_descriptions_in_catalog') === 'true') {
404
            $icon_title = get_lang('CourseDetails').' - '.$course['title'];
405
            $url = api_get_path(WEB_CODE_PATH).'inc/ajax/course_home.ajax.php?a=show_course_information&code='.$course['code'];
406
            echo Security::remove_XSS(
407
                Display::url(
408
                    Display::return_icon('info.png', $icon_title, '', '22'),
409
                    $url,
410
                    ['class' => 'ajax', 'data-title' => $icon_title, 'title' => $icon_title]
411
                )
412
            );
413
        }
414
        echo '';
415
        if (isset($_GET['edit']) && $course['code'] == $_GET['edit']) {
416
            echo Display::return_icon('edit_na.png', get_lang('Edit'), '', 22);
417
        } else {
418
            echo Display::url(
419
                Display::return_icon('edit.png', get_lang('Edit'), '', 22),
420
                $currentUrl.'?action=edit_course_category&course_id='.$course['real_id'].'&'.$stok,
421
                ['class' => 'ajax']
422
            );
423
        }
424
        if ($key > 0) {
425
            ?>
426
                <a
427
                    href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=up&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
428
                <?php echo Display::display_icon('up.png', get_lang('Up'), '', 22); ?>
429
                </a>
430
            <?php
431
        } else {
432
            echo Display::return_icon('up_na.png', get_lang('Up'), '', 22);
433
        }
434
        if ($key < $number_of_courses - 1) {
435
            ?>
436
                <a
437
                    href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=down&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
438
                <?php echo Display::display_icon('down.png', get_lang('Down'), '', 22); ?>
439
                </a>
440
            <?php
441
        } else {
442
            echo Display::return_icon('down_na.png', get_lang('Down'), '', 22);
443
        }
444
        if ($course['status'] != 1) {
445
            if ($course['unsubscr'] == 1) {
446
                echo generateUnsubscribeForm($course['code'], $stok);
447
            }
448
        }
449
        echo '</td></tr>';
450
451
        $key++;
452
    }
453
}
454
?>
455
</table>
456
<?php
457
Display::display_footer();
458