Completed
Push — master ( c9546d...95f607 )
by Julito
09:41
created

public/main/inc/ajax/skill.ajax.php (1 issue)

Labels
Severity
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
use Chamilo\CoreBundle\Entity\SkillRelCourse;
6
use Chamilo\CoreBundle\Entity\SkillRelItem;
7
8
/**
9
 * Responses to AJAX calls.
10
 */
11
require_once __DIR__.'/../global.inc.php';
12
13
$action = isset($_REQUEST['a']) ? $_REQUEST['a'] : null;
14
15
api_block_anonymous_users();
16
17
Skill::isAllowed(api_get_user_id());
18
19
$skill = new Skill();
20
$gradebook = new Gradebook();
21
$skillGradeBook = new SkillRelGradebook();
22
$userId = api_get_user_id();
23
24
switch ($action) {
25
    case 'add':
26
        if (api_is_platform_admin() || api_is_drh()) {
27
            if (isset($_REQUEST['id']) && !empty($_REQUEST['id'])) {
28
                $skillId = $skill->edit($_REQUEST);
29
            } else {
30
                $skillId = $skill->add($_REQUEST);
31
            }
32
        }
33
        echo $skillId;
34
        break;
35
    case 'delete_skill':
36
        if (api_is_platform_admin() || api_is_drh()) {
37
            echo $skill->delete($_REQUEST['skill_id']);
38
        }
39
        break;
40
    case 'find_skills':
41
        $returnSkills = [[
42
            'items' => [],
43
        ]];
44
45
        if (isset($_REQUEST['q']) && !empty($_REQUEST['q'])) {
46
            $skills = $skill->find('all', ['where' => ['name LIKE %?% ' => $_REQUEST['q']]]);
47
            foreach ($skills as $skill) {
48
                $returnSkills['items'][] = [
49
                    'id' => $skill['id'],
50
                    'text' => $skill['name'],
51
                ];
52
            }
53
        }
54
        header('Content-Type: application/json');
55
        echo json_encode($returnSkills);
56
        break;
57
    case 'get_gradebooks':
58
        $gradebooks = $gradebook_list = $gradebook->get_all();
59
        $gradebook_list = [];
60
        //Only course gradebook with certificate
61
        if (!empty($gradebooks)) {
62
            foreach ($gradebooks as $gradebook) {
63
                if (0 == $gradebook['parent_id'] &&
64
                    !empty($gradebook['certif_min_score']) &&
65
                    !empty($gradebook['document_id'])
66
                ) {
67
                    $gradebook_list[] = $gradebook;
68
                }
69
            }
70
        }
71
        echo json_encode($gradebook_list);
72
        break;
73
    case 'find_gradebooks':
74
        $return = [];
75
        if (isset($_REQUEST['tag']) && !empty($_REQUEST['tag'])) {
76
            $gradebooks = $gradebook->find('all', ['where' => ['name LIKE %?% ' => $_REQUEST['tag']]]);
77
            foreach ($gradebooks as $item) {
78
                $item['key'] = $item['name'];
79
                $item['value'] = $item['id'];
80
                $return[] = $item;
81
            }
82
        }
83
        echo json_encode($return);
84
        break;
85
    case 'get_course_info_popup':
86
        $courseInfo = api_get_course_info($_REQUEST['code']);
87
        $courses = CourseManager::processHotCourseItem(
88
            [
89
                ['c_id' => $courseInfo['real_id']],
90
            ]
91
        );
92
        Display::display_no_header();
93
        Display::$global_template->assign('hot_courses', $courses);
94
        $template = Display::$global_template->get_template('layout/hot_course_item_popup.tpl');
95
        echo Display::$global_template->fetch($template);
96
        break;
97
    case 'gradebook_exists':
98
        $data = $gradebook->get($_REQUEST['gradebook_id']);
99
        if (!empty($data)) {
100
            echo 1;
101
        } else {
102
            echo 0;
103
        }
104
        break;
105
    case 'get_skills_by_profile':
106
        $skillRelProfile = new SkillRelProfile();
107
        $profile_id = isset($_REQUEST['profile_id']) ? $_REQUEST['profile_id'] : null;
108
        $skills = $skillRelProfile->getSkillsByProfile($profile_id);
109
        echo json_encode($skills);
110
        break;
111
    case 'get_saved_profiles':
112
        $skillProfile = new SkillProfile();
113
        $profiles = $skillProfile->get_all();
114
        Display::display_no_header();
115
        Display::$global_template->assign('profiles', $profiles);
116
        $template = Display::$global_template->get_template('skill/profile_item.tpl');
117
        echo Display::$global_template->fetch($template);
118
        break;
119
    case 'get_skills':
120
        $loadUserData = isset($_REQUEST['load_user_data']) ? $_REQUEST['load_user_data'] : null;
121
        $id = intval($_REQUEST['id']);
122
        $skills = $skill->get_all($loadUserData, false, $id);
123
        echo json_encode($skills);
124
        break;
125
    case 'get_skill_info':
126
        $id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
127
        $skillInfo = $skill->getSkillInfo($id);
128
        echo json_encode($skillInfo);
129
        break;
130
    case 'get_skill_course_info':
131
        $id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
132
        $skillInfo = $skill->getSkillInfo($id);
133
        $courses = $skill->getCoursesBySkill($id);
134
        $sessions = $skill->getSessionsBySkill($id);
135
        $html = '';
136
        if (!empty($courses) || !empty($sessions)) {
137
            Display::display_no_header();
138
            Display::$global_template->assign('skill', $skillInfo);
139
            Display::$global_template->assign('courses', $courses);
140
            Display::$global_template->assign('sessions', $sessions);
141
            $template = Display::$global_template->get_template('skill/skill_info.tpl');
142
            $html = Display::$global_template->fetch($template);
143
        }
144
        echo $html;
145
        break;
146
    case 'get_skills_tree_json':
147
        header('Content-Type: application/json');
148
        $userId = isset($_REQUEST['load_user']) && 1 == $_REQUEST['load_user'] ? api_get_user_id() : 0;
149
        $skill_id = isset($_REQUEST['skill_id']) ? intval($_REQUEST['skill_id']) : 0;
150
        $depth = isset($_REQUEST['main_depth']) ? intval($_REQUEST['main_depth']) : 2;
151
        $all = $skill->getSkillsTreeToJson($userId, $skill_id, false, $depth);
152
        echo $all;
153
        break;
154
    case 'get_user_skill':
155
        $skillId = isset($_REQUEST['profile_id']) ? intval($_REQUEST['profile_id']) : 0;
156
        $skill = $skill->userHasSkill($userId, $skillId);
157
        if ($skill) {
158
            echo 1;
159
        } else {
160
            echo 0;
161
        }
162
        break;
163
    case 'get_all_user_skills':
164
        $skills = $skill->getUserSkills($userId, true);
165
        echo json_encode($skills);
166
        break;
167
    case 'get_user_skills':
168
        $skills = $skill->getUserSkills($userId, true);
169
        Display::display_no_header();
170
        Display::$global_template->assign('skills', $skills);
171
        $template = Display::$global_template->get_template('skill/user_skills.tpl');
172
        echo Display::$global_template->fetch($template);
173
        break;
174
    case 'get_gradebook_info':
175
        $id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : null;
176
        $info = $gradebook->get($id);
177
        echo json_encode($info);
178
        break;
179
    case 'load_children':
180
        $id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : null;
181
        $load_user_data = isset($_REQUEST['load_user_data']) ? $_REQUEST['load_user_data'] : null;
182
        $skills = $skill->getChildren($id, $load_user_data);
183
        $return = [];
184
        foreach ($skills as $skill) {
185
            if (isset($skill['data']) && !empty($skill['data'])) {
186
                $return[$skill['data']['id']] = [
187
                    'id' => $skill['data']['id'],
188
                    'name' => $skill['data']['name'],
189
                    'passed' => $skill['data']['passed'],
190
                ];
191
            }
192
        }
193
        $success = true;
194
        if (empty($return)) {
195
            $success = false;
196
        }
197
198
        $result = [
199
            'success' => $success,
200
            'data' => $return,
201
        ];
202
        echo json_encode($result);
203
        break;
204
    case 'load_direct_parents':
205
        $id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : null;
206
        $skills = $skill->getDirectParents($id);
207
        $return = [];
208
        foreach ($skills as $skill) {
209
            $return[$skill['data']['id']] = [
210
                'id' => $skill['data']['id'],
211
                'parent_id' => $skill['data']['parent_id'],
212
                'name' => $skill['data']['name'],
213
            ];
214
        }
215
        echo json_encode($return);
216
        break;
217
    case 'profile_matches':
218
        $skill_rel_user = new SkillRelUser();
219
        $skills = !empty($_REQUEST['skill_id']) ? $_REQUEST['skill_id'] : [];
220
        $total_skills_to_search = $skills;
221
        $users = $skill_rel_user->getUserBySkills($skills);
222
        $user_list = [];
223
        $count_skills = count($skills);
224
        $ordered_user_list = null;
225
226
        if (!empty($users)) {
227
            foreach ($users as $user) {
228
                $user_info = api_get_user_info($user['user_id']);
229
                $user_list[$user['user_id']]['user'] = $user_info;
230
                $my_user_skills = $skill_rel_user->getUserSkills($user['user_id']);
231
                $user_skill_list = [];
232
                foreach ($my_user_skills as $skill_item) {
233
                    $user_skill_list[] = $skill_item['skill_id'];
234
                }
235
236
                $user_skills = [];
237
                $found_counts = 0;
238
239
                foreach ($skills as $skill_id) {
240
                    $found = false;
241
                    if (in_array($skill_id, $user_skill_list)) {
242
                        $found = true;
243
                        $found_counts++;
244
                        $user_skills[$skill_id] = ['skill_id' => $skill_id, 'found' => $found];
245
                    }
246
                }
247
248
                foreach ($my_user_skills as $my_skill) {
249
                    if (!isset($user_skills[$my_skill['skill_id']])) {
250
                        $user_skills[$my_skill['skill_id']] = [
251
                            'skill_id' => $my_skill['skill_id'],
252
                            'found' => false,
253
                        ];
254
                    }
255
                    $total_skills_to_search[$my_skill['skill_id']] = $my_skill['skill_id'];
256
                }
257
                $user_list[$user['user_id']]['skills'] = $user_skills;
258
                $user_list[$user['user_id']]['total_found_skills'] = $found_counts;
259
            }
260
261
            foreach ($user_list as $user_id => $user_data) {
262
                $ordered_user_list[$user_data['total_found_skills']][] = $user_data;
263
            }
264
265
            if (!empty($ordered_user_list)) {
266
                krsort($ordered_user_list);
267
            }
268
        }
269
270
        Display::display_no_header();
271
        Display::$global_template->assign('order_user_list', $ordered_user_list);
272
        Display::$global_template->assign('total_search_skills', $count_skills);
273
274
        $skill_list = [];
275
        if (!empty($total_skills_to_search)) {
276
            $total_skills_to_search = $skill->getSkillsInfo($total_skills_to_search);
277
            foreach ($total_skills_to_search as $skill_info) {
278
                $skill_list[$skill_info['id']] = $skill_info;
279
            }
280
        }
281
282
        Display::$global_template->assign('skill_list', $skill_list);
283
        $template = Display::$global_template->get_template('skill/profile.tpl');
284
        echo Display::$global_template->fetch($template);
285
        break;
286
    case 'delete_gradebook_from_skill':
287
    case 'remove_skill':
288
        if (api_is_platform_admin() || api_is_drh()) {
289
            if (!empty($_REQUEST['skill_id']) && !empty($_REQUEST['gradebook_id'])) {
290
                $skill_item = $skillGradeBook->getSkillInfo(
291
                    $_REQUEST['skill_id'],
292
                    $_REQUEST['gradebook_id']
293
                );
294
                if (!empty($skill_item)) {
295
                    $skillGradeBook->delete($skill_item['id']);
296
                    echo 1;
297
                } else {
298
                    echo 0;
299
                }
300
            } else {
301
                echo 0;
302
            }
303
        }
304
        break;
305
    case 'get_profile':
306
        $skillRelProfile = new SkillRelProfile();
307
        $profileId = isset($_REQUEST['profile_id']) ? intval($_REQUEST['profile_id']) : null;
308
        $profile = $skillRelProfile->getProfileInfo($profileId);
309
        echo json_encode($profile);
310
        break;
311
    case 'save_profile':
312
        if (api_is_platform_admin() || api_is_drh()) {
313
            $skill_profile = new SkillProfile();
314
            $params = $_REQUEST;
315
            $params['skills'] = isset($params['skill_id']) ? $params['skill_id'] : null;
316
            $profileId = isset($_REQUEST['profile']) ? intval($_REQUEST['profile']) : null;
317
            if ($profileId > 0) {
318
                $skill_profile->updateProfileInfo(
319
                    $profileId,
320
                    $params['name'],
321
                    $params['description']
322
                );
323
                $skill_data = 1;
324
            } else {
325
                $skill_data = $skill_profile->save($params);
326
            }
327
            if (!empty($skill_data)) {
328
                echo 1;
329
            } else {
330
                echo 0;
331
            }
332
        }
333
        break;
334
    case 'delete_profile':
335
        if (api_is_platform_admin() || api_is_drh()) {
336
            $profileId = $_REQUEST['profile'];
337
            $skillProfile = new SkillProfile();
338
            $isDeleted = $skillProfile->delete($profileId);
339
340
            echo json_encode([
341
                'status' => $isDeleted,
342
            ]);
343
        }
344
        break;
345
    case 'skill_exists':
346
        $skill_data = $skill->get($_REQUEST['skill_id']);
347
        if (!empty($skill_data)) {
348
            echo 1;
349
        } else {
350
            echo 0;
351
        }
352
        break;
353
    case 'search_skills':
354
        $returnSkills = [];
355
        if (isset($_REQUEST['q']) && !empty($_REQUEST['q'])) {
356
            $skills = $skill->find(
357
                'all',
358
                [
359
                    'where' => ['name LIKE %?% ' => $_REQUEST['q']],
360
                ]
361
            );
362
            foreach ($skills as $skill) {
363
                $returnSkills[] = [
364
                    'id' => $skill['id'],
365
                    'text' => $skill['name'],
366
                ];
367
            }
368
        }
369
370
        echo json_encode(['items' => $returnSkills]);
371
        break;
372
    case 'search_skills_in_course':
373
        $courseId = isset($_REQUEST['course_id']) ? (int) $_REQUEST['course_id'] : 0;
374
        $sessionId = isset($_REQUEST['session_id']) ? (int) $_REQUEST['session_id'] : null;
375
376
        if (empty($courseId)) {
377
            exit;
378
        }
379
        $em = Database::getManager();
380
        $skills = $em->getRepository(SkillRelCourse::class)->findBy(
381
            ['course' => $courseId, 'session' => $sessionId]
382
        );
383
384
        $returnSkills = [];
385
        /** @var SkillRelCourse $skill */
386
        foreach ($skills as $skill) {
387
            $returnSkills[] = [
388
                'id' => $skill->getSkill()->getId(),
389
                'text' => $skill->getSkill()->getName(),
390
            ];
391
        }
392
        echo json_encode([
393
            'items' => $returnSkills,
394
        ]);
395
        break;
396
    case 'update_skill_rel_user':
397
        $allowSkillInTools = api_get_configuration_value('allow_skill_rel_items');
398
        if (empty($allowSkillInTools)) {
399
            exit;
400
        }
401
402
        if (!api_is_allowed_to_edit()) {
403
            exit;
404
        }
405
406
        $creatorId = api_get_user_id();
407
        $typeId = isset($_REQUEST['type_id']) ? (int) $_REQUEST['type_id'] : 0;
408
        $itemId = isset($_REQUEST['item_id']) ? (int) $_REQUEST['item_id'] : 0;
409
        $skillId = isset($_REQUEST['skill_id']) ? (int) $_REQUEST['skill_id'] : 0;
410
        $userId = isset($_REQUEST['user_id']) ? (int) $_REQUEST['user_id'] : 0;
411
        $courseId = isset($_REQUEST['course_id']) ? (int) $_REQUEST['course_id'] : 0;
412
        $sessionId = isset($_REQUEST['session_id']) ? (int) $_REQUEST['session_id'] : 0;
413
        $resultId = isset($_REQUEST['result_id']) ? (int) $_REQUEST['result_id'] : 0;
414
415
        if (!empty($typeId) && !empty($itemId) && !empty($skillId) && !empty($userId) && !empty($courseId)) {
416
            $em = Database::getManager();
417
            $user = api_get_user_entity($userId);
418
            $skill = $em->getRepository('ChamiloCoreBundle:Skill')->find($skillId);
419
            if (empty($user) || empty($skill)) {
420
                exit;
421
            }
422
            $course = api_get_course_entity($courseId);
423
            if (empty($course)) {
424
                exit;
425
            }
426
427
            $session = api_get_session_entity($sessionId);
428
            /** @var SkillRelItem $skillRelItem */
429
            $skillRelItem = $em->getRepository(SkillRelItem::class)->findOneBy(
430
                ['itemId' => $itemId, 'itemType' => $typeId, 'skill' => $skillId]
431
            );
432
433
            if ($skillRelItem) {
434
                $criteria = [
435
                    'user' => $userId,
436
                    'skillRelItem' => $skillRelItem,
437
                ];
438
                $skillRelItemRelUser = $em->getRepository('ChamiloCoreBundle:SkillRelItemRelUser')->findOneBy($criteria);
439
                if ($skillRelItemRelUser) {
440
                    $em->remove($skillRelItemRelUser);
441
                    $em->flush();
442
                    $skillRelItemRelUser = null;
443
                } else {
444
                    $skillRelItemRelUser = new Chamilo\CoreBundle\Entity\SkillRelItemRelUser();
445
                    $skillRelItemRelUser
446
                        ->setUser($user)
447
                        ->setSkillRelItem($skillRelItem)
0 ignored issues
show
It seems like setSkillRelItem() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

447
                        ->/** @scrutinizer ignore-call */ setSkillRelItem($skillRelItem)
Loading history...
448
                        ->setResultId($resultId)
449
                        ->setCreatedBy($creatorId)
450
                        ->setUpdatedBy($creatorId)
451
                    ;
452
                    $em->persist($skillRelItemRelUser);
453
                    $em->flush();
454
                }
455
            }
456
            echo Skill::getUserSkillStatusLabel($skillRelItem, $skillRelItemRelUser, false);
457
        }
458
        break;
459
    case 'assign_user_to_skill':
460
        $allowSkillInTools = api_get_configuration_value('allow_skill_rel_items');
461
        if (empty($allowSkillInTools)) {
462
            exit;
463
        }
464
465
        if (!api_is_allowed_to_edit()) {
466
            exit;
467
        }
468
469
        $skillId = isset($_REQUEST['skill_id']) ? (int) $_REQUEST['skill_id'] : 0;
470
        $userId = isset($_REQUEST['user_id']) ? (int) $_REQUEST['user_id'] : 0;
471
        $courseId = isset($_REQUEST['course_id']) ? (int) $_REQUEST['course_id'] : 0;
472
        $sessionId = isset($_REQUEST['session_id']) ? (int) $_REQUEST['session_id'] : null;
473
474
        if (empty($skillId) || empty($userId)) {
475
            exit;
476
        }
477
478
        $em = Database::getManager();
479
        $skillRepo = $em->getRepository('ChamiloCoreBundle:Skill');
480
        $skill = $skillRepo->find($skillId);
481
        $user = api_get_user_entity($userId);
482
483
        if (empty($skill) || empty($user)) {
484
            exit;
485
        }
486
487
        $skillUserRepo = $em->getRepository('ChamiloCoreBundle:SkillRelUser');
488
        $criteria = [
489
            'user' => $user,
490
            'skill' => $skill,
491
        ];
492
        $skillRelUsers = $skillUserRepo->findBy($criteria);
493
        if (empty($skillRelUsers)) {
494
            $skillUser = new \Chamilo\CoreBundle\Entity\SkillRelUser();
495
            $skillUser->setUser($user);
496
            $skillUser->setSkill($skill);
497
            /*if ($showLevels) {
498
                $level = $skillLevelRepo->find(intval($values['acquired_level']));
499
                $skillUser->setAcquiredLevel($level);
500
            }*/
501
502
            $course = api_get_course_entity($courseId);
503
            $skillUser->setCourse($course);
504
            if (!empty($sessionId)) {
505
                $session = $em->getRepository('ChamiloCoreBundle:Session')->find($sessionId);
506
                $skillUser->setSession($session);
507
            }
508
509
            $skillUser->setArgumentation('');
510
            $skillUser->setArgumentationAuthorId(api_get_user_id());
511
            $skillUser->setAcquiredSkillAt(new DateTime());
512
            $skillUser->setAssignedBy(0);
513
            $em->persist($skillUser);
514
            $em->flush();
515
            $result = 'success';
516
        } else {
517
            foreach ($skillRelUsers as $skillRelUser) {
518
                $em->remove($skillRelUser);
519
            }
520
            $em->flush();
521
            $result = 'danger';
522
        }
523
        echo $result;
524
        break;
525
    default:
526
        echo '';
527
}
528
exit;
529