Passed
Push — 1.11.x ( bce6cd...c146d9 )
by Angel Fernando Quiroz
12:25
created

main/badge/issued_all.php (1 issue)

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
use Chamilo\CoreBundle\Entity\SkillRelUser;
5
use Chamilo\CoreBundle\Entity\SkillRelUserComment;
6
use SkillRelUser as SkillRelUserManager;
7
8
/**
9
 * Show information about all issued badges with same skill by user.
10
 *
11
 * @author José Loguercio Silva <[email protected]>
12
 */
13
require_once __DIR__.'/../inc/global.inc.php';
14
15
$userId = isset($_GET['user']) ? (int) $_GET['user'] : 0;
16
$skillId = isset($_GET['skill']) ? (int) $_GET['skill'] : 0;
17
18
if (!$userId || !$skillId) {
19
    api_not_allowed(true);
20
}
21
22
Skill::isAllowed($userId);
23
24
$em = Database::getManager();
25
$user = api_get_user_entity($userId);
26
$skill = $em->find('ChamiloCoreBundle:Skill', $skillId);
27
$currentUserId = api_get_user_id();
28
29
if (!$user || !$skill) {
0 ignored issues
show
$user is of type Chamilo\UserBundle\Entity\User, thus it always evaluated to true.
Loading history...
30
    Display::addFlash(
31
        Display::return_message(get_lang('NoResults'), 'error')
32
    );
33
34
    header('Location: '.api_get_path(WEB_PATH));
35
    exit;
36
}
37
38
$skillRepo = $em->getRepository('ChamiloCoreBundle:Skill');
39
$skillUserRepo = $em->getRepository('ChamiloCoreBundle:SkillRelUser');
40
$skillLevelRepo = $em->getRepository('ChamiloSkillBundle:Level');
41
42
$userSkills = $skillUserRepo->findBy([
43
    'user' => $user,
44
    'skill' => $skill,
45
]);
46
47
$userInfo = [
48
    'id' => $user->getId(),
49
    'complete_name' => UserManager::formatUserFullName($user),
50
];
51
52
$skillInfo = [
53
    'id' => $skill->getId(),
54
    'name' => $skill->getName(),
55
    'short_code' => $skill->getShortCode(),
56
    'description' => $skill->getDescription(),
57
    'criteria' => $skill->getCriteria(),
58
    'badge_image' => Skill::getWebIconPath($skill),
59
    'courses' => [],
60
];
61
62
$allUserBadges = [];
63
/** @var SkillRelUser $skillIssue */
64
foreach ($userSkills as $index => $skillIssue) {
65
    $currentUser = api_get_user_entity($currentUserId);
66
    $allowDownloadExport = $currentUser ? $currentUser->getId() === $user->getId() : false;
67
    $allowComment = $currentUser ? Skill::userCanAddFeedbackToUser($currentUser, $user) : false;
68
    $skillIssueDate = api_get_local_time($skillIssue->getAcquiredSkillAt());
69
    $currentSkillLevel = get_lang('NoLevelAcquiredYet');
70
    if ($skillIssue->getAcquiredLevel()) {
71
        $currentSkillLevel = $skillLevelRepo->find(['id' => $skillIssue->getAcquiredLevel()])->getName();
72
    }
73
    $argumentationAuthor = api_get_user_info($skillIssue->getArgumentationAuthorId());
74
75
    $tempDate = DateTime::createFromFormat('Y-m-d H:i:s', $skillIssueDate);
76
    $linkedinOrganizationId = api_get_configuration_value('linkedin_organization_id');
77
    if (($linkedinOrganizationId === false)) {
78
        $linkedinOrganizationId = null;
79
    }
80
81
    $skillIssueInfo = [
82
        'id' => $skillIssue->getId(),
83
        'datetime' => api_format_date($skillIssueDate, DATE_TIME_FORMAT_SHORT),
84
        'year' => $tempDate->format('Y'),
85
        'month' => $tempDate->format('m'),
86
        'linkedin_organization_id' => $linkedinOrganizationId,
87
        'acquired_level' => $currentSkillLevel,
88
        'argumentation_author_id' => $skillIssue->getArgumentationAuthorId(),
89
        'argumentation_author_name' => api_get_person_name(
90
            $argumentationAuthor['firstname'],
91
            $argumentationAuthor['lastname']
92
        ),
93
        'argumentation' => $skillIssue->getArgumentation(),
94
        'source_name' => $skillIssue->getSourceName(),
95
        'user_id' => $skillIssue->getUser()->getId(),
96
        'user_complete_name' => UserManager::formatUserFullName($skillIssue->getUser()),
97
        'skill_id' => $skillIssue->getSkill()->getId(),
98
        'skill_badge_image' => Skill::getWebIconPath($skillIssue->getSkill()),
99
        'skill_name' => $skillIssue->getSkill()->getName(),
100
        'skill_short_code' => $skillIssue->getSkill()->getShortCode(),
101
        'skill_description' => $skillIssue->getSkill()->getDescription(),
102
        'skill_criteria' => $skillIssue->getSkill()->getCriteria(),
103
        'badge_assertion' => SkillRelUserManager::getAssertionUrl($skillIssue),
104
        'comments' => [],
105
        'feedback_average' => $skillIssue->getAverage(),
106
    ];
107
108
    $skillIssueComments = $skillIssue->getComments(true);
109
110
    $userId = $skillIssueInfo['user_id'];
111
    $skillId = $skillIssueInfo['skill_id'];
112
113
    foreach ($skillIssueComments as $comment) {
114
        $commentDate = api_get_local_time($comment->getFeedbackDateTime());
115
        $skillIssueInfo['comments'][] = [
116
            'text' => $comment->getFeedbackText(),
117
            'value' => $comment->getFeedbackValue(),
118
            'giver_complete_name' => UserManager::formatUserFullName($comment->getFeedbackGiver()),
119
            'datetime' => api_format_date($commentDate, DATE_TIME_FORMAT_SHORT),
120
        ];
121
    }
122
123
    $acquiredLevel = [];
124
    $profile = $skillRepo->find($skillId)->getProfile();
125
126
    if (!$profile) {
127
        $skillRelSkill = new SkillRelSkill();
128
        $parents = $skillRelSkill->getSkillParents($skillId);
129
130
        krsort($parents);
131
132
        foreach ($parents as $parent) {
133
            $skillParentId = $parent['skill_id'];
134
            $profile = $skillRepo->find($skillParentId)->getProfile();
135
136
            if ($profile) {
137
                break;
138
            }
139
140
            if (!$profile && $parent['parent_id'] == 0) {
141
                $profile = $skillLevelRepo->findAll();
142
                $profile = !empty($profile) ? $profile[0] : [];
143
            }
144
        }
145
    }
146
147
    if ($profile) {
148
        $profileId = $profile->getId();
149
        $levels = $skillLevelRepo->findBy([
150
            'profile' => $profileId,
151
        ]);
152
153
        foreach ($levels as $level) {
154
            $profileLevels[$level->getPosition()][$level->getId()] = $level->getName();
155
        }
156
157
        ksort($profileLevels); // Sort the array by Position.
158
159
        foreach ($profileLevels as $profileLevel) {
160
            $profileId = key($profileLevel);
161
            $acquiredLevel[$profileId] = $profileLevel[$profileId];
162
        }
163
    }
164
165
    $formAcquiredLevel = new FormValidator(
166
        'acquired_level'.$skillIssue->getId(),
167
        'post',
168
        SkillRelUserManager::getIssueUrlAll($skillIssue)
169
    );
170
    $formAcquiredLevel->addSelect('acquired_level', get_lang('AcquiredLevel'), $acquiredLevel);
171
    $formAcquiredLevel->addHidden('user', $skillIssue->getUser()->getId());
172
    $formAcquiredLevel->addHidden('issue', $skillIssue->getId());
173
    $formAcquiredLevel->addButtonSend(get_lang('Save'));
174
175
    if ($formAcquiredLevel->validate() && $allowComment) {
176
        $values = $formAcquiredLevel->exportValues();
177
178
        $level = $skillLevelRepo->find($values['acquired_level']);
179
        $skillIssue->setAcquiredLevel($level);
180
181
        $em->persist($skillIssue);
182
        $em->flush();
183
184
        header('Location: '.SkillRelUserManager::getIssueUrlAll($skillIssue));
185
        exit;
186
    }
187
188
    $form = new FormValidator(
189
        'comment'.$skillIssue->getId(),
190
        'post',
191
        SkillRelUserManager::getIssueUrlAll($skillIssue)
192
    );
193
    $form->addTextarea('comment', get_lang('NewComment'), ['rows' => 4]);
194
    $form->applyFilter('comment', 'trim');
195
    $form->addRule('comment', get_lang('ThisFieldIsRequired'), 'required');
196
    $form->addSelect(
197
        'value',
198
        [get_lang('Value'), get_lang('RateTheSkillInPractice')],
199
        ['-', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
200
    );
201
    $form->addHidden('user', $skillIssue->getUser()->getId());
202
    $form->addHidden('issue', $skillIssue->getId());
203
    $form->addButtonSend(get_lang('Send'));
204
205
    if ($form->validate() && $allowComment) {
206
        $values = $form->exportValues();
207
208
        $skillUserComment = new SkillRelUserComment();
209
        $skillUserComment
210
            ->setFeedbackDateTime(new DateTime())
211
            ->setFeedbackGiver($currentUser)
212
            ->setFeedbackText($values['comment'])
213
            ->setFeedbackValue($values['value'] ? $values['value'] : null)
214
            ->setSkillRelUser($skillIssue);
215
216
        $em->persist($skillUserComment);
217
        $em->flush();
218
219
        header('Location: '.SkillRelUserManager::getIssueUrlAll($skillIssue));
220
        exit;
221
    }
222
223
    $badgeInfoError = '';
224
    $personalBadge = '';
225
226
    if ($allowDownloadExport) {
227
        $backpack = 'https://backpack.openbadges.org/';
228
        $configBackpack = api_get_setting('openbadges_backpack');
229
230
        if (0 !== strcmp($backpack, $configBackpack)) {
231
            $backpack = $configBackpack;
232
            if (substr($backpack, -1) !== '/') {
233
                $backpack .= '/';
234
            }
235
        }
236
237
        $htmlHeadXtra[] = '<script src="'.$backpack.'issuer.js"></script>';
238
        $objSkill = new Skill();
239
        $assertionUrl = $skillIssueInfo['badge_assertion'];
240
        $skills = $objSkill->get($skillId);
241
        $unbakedBadge = api_get_path(SYS_UPLOAD_PATH)."badges/".$skills['icon'];
242
        if (!is_file($unbakedBadge)) {
243
            $unbakedBadge = api_get_path(WEB_CODE_PATH).'img/icons/128/badges-default.png';
244
        }
245
246
        $unbakedBadge = file_get_contents($unbakedBadge);
247
        $badgeInfoError = false;
248
        $personalBadge = "";
249
        $png = new PNGImageBaker($unbakedBadge);
250
251
        if ($png->checkChunks("tEXt", "openbadges")) {
252
            $bakedInfo = $png->addChunk("tEXt", "openbadges", $assertionUrl);
253
            $bakedBadge = UserManager::getUserPathById($userId, "system");
254
            $bakedBadge = $bakedBadge.'badges';
255
            if (!file_exists($bakedBadge)) {
256
                mkdir($bakedBadge, api_get_permissions_for_new_directories(), true);
257
            }
258
            $skillRelUserId = $skillIssueInfo['id'];
259
            if (!file_exists($bakedBadge."/badge_".$skillRelUserId)) {
260
                file_put_contents($bakedBadge."/badge_".$skillRelUserId.".png", $bakedInfo);
261
            }
262
263
            //Process to validate a baked badge
264
            $badgeContent = file_get_contents($bakedBadge."/badge_".$skillRelUserId.".png");
265
            $verifyBakedBadge = $png->extractBadgeInfo($badgeContent);
266
            if (!is_array($verifyBakedBadge)) {
267
                $badgeInfoError = true;
268
            }
269
270
            if (!$badgeInfoError) {
271
                $personalBadge = UserManager::getUserPathById($userId, "web");
272
                $personalBadge = $personalBadge."badges/badge_".$skillRelUserId.".png";
273
            }
274
        }
275
    }
276
277
    $allUserBadges[$index]['issue_info'] = $skillIssueInfo;
278
    $allUserBadges[$index]['allow_comment'] = $allowComment;
279
    $allUserBadges[$index]['allow_download_export'] = $allowDownloadExport;
280
    $allUserBadges[$index]['comment_form'] = $form->returnForm();
281
    $allUserBadges[$index]['acquired_level_form'] = $formAcquiredLevel->returnForm();
282
    $allUserBadges[$index]['badge_error'] = $badgeInfoError;
283
    $allUserBadges[$index]['personal_badge'] = $personalBadge;
284
}
285
286
$template = new Template(get_lang('IssuedBadgeInformation'));
287
$template->assign('user_badges', $allUserBadges);
288
$template->assign('show_level', api_get_configuration_value('hide_skill_levels') == false);
289
290
$content = $template->fetch(
291
    $template->get_template('skill/issued_all.tpl')
292
);
293
294
$template->assign('header', get_lang('IssuedBadgeInformation'));
295
$template->assign('content', $content);
296
$template->display_one_col_template();
297