parent
e2a2145dad
commit
d1503a94ec
@ -0,0 +1,277 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
/** |
||||||
|
* Show information about all issued badges with same skill by user |
||||||
|
* |
||||||
|
* @author José Loguercio Silva <jose.loguercio@beeznest.com> |
||||||
|
* @package chamilo.badge |
||||||
|
*/ |
||||||
|
require_once '../inc/global.inc.php'; |
||||||
|
require_once '../inc/lib/baker.lib.php'; |
||||||
|
|
||||||
|
$userId = isset($_GET['user']) ? intval($_GET['user']) : 0; |
||||||
|
$skillId = isset($_GET['skill']) ? intval($_GET['skill']) : 0; |
||||||
|
|
||||||
|
if (!$userId || !$skillId) { |
||||||
|
header('Location: ' . api_get_path(WEB_PATH)); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$entityManager = Database::getManager(); |
||||||
|
$user = $entityManager->find('ChamiloUserBundle:User', $userId); |
||||||
|
$skill = $entityManager->find('ChamiloCoreBundle:Skill', $skillId); |
||||||
|
$skillRepo = $entityManager->getRepository('ChamiloCoreBundle:Skill'); |
||||||
|
$skillUserRepo = $entityManager->getRepository('ChamiloCoreBundle:SkillRelUser'); |
||||||
|
$skillLevelRepo = $entityManager->getRepository('ChamiloSkillBundle:Level'); |
||||||
|
|
||||||
|
$currentUserId = api_get_user_id(); |
||||||
|
|
||||||
|
if (!$user || !$skill) { |
||||||
|
Display::addFlash( |
||||||
|
Display::return_message(get_lang('NoResults'), 'error') |
||||||
|
); |
||||||
|
|
||||||
|
header('Location: ' . api_get_path(WEB_PATH)); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$userSkills = $skillUserRepo->findBy([ |
||||||
|
'userId' => $user->getId(), |
||||||
|
'skillId' => $skill->getId() |
||||||
|
]); |
||||||
|
|
||||||
|
$userInfo = [ |
||||||
|
'id' => $user->getId(), |
||||||
|
'complete_name' => $user->getCompleteName() |
||||||
|
]; |
||||||
|
|
||||||
|
$skillInfo = [ |
||||||
|
'id' => $skill->getId(), |
||||||
|
'name' => $skill->getName(), |
||||||
|
'short_code' => $skill->getShortCode(), |
||||||
|
'description' => $skill->getDescription(), |
||||||
|
'criteria' => $skill->getCriteria(), |
||||||
|
'badge_image' => $skill->getWebIconPath(), |
||||||
|
'courses' => [] |
||||||
|
]; |
||||||
|
|
||||||
|
$allUserBadges = []; |
||||||
|
|
||||||
|
foreach ($userSkills as $index => $skillIssue) { |
||||||
|
$currentUser = $entityManager->find('ChamiloUserBundle:User', $currentUserId); |
||||||
|
$allowDownloadExport = $currentUser ? $currentUser->getId() === $user->getId() : false; |
||||||
|
$allowComment = $currentUser ? Skill::userCanAddFeedbackToUser($currentUser, $user) : false; |
||||||
|
$skillIssueDate = api_get_local_time($skillIssue->getAcquiredSkillAt()); |
||||||
|
$currentSkillLevel = get_lang('NoLevelAcquiredYet'); |
||||||
|
if ($skillIssue->getAcquiredLevel()) { |
||||||
|
$currentSkillLevel = $skillLevelRepo->find(['id' => $skillIssue->getAcquiredLevel()])->getName(); |
||||||
|
} |
||||||
|
$argumentationAuthor = api_get_user_info($skillIssue->getArgumentationAuthorId()); |
||||||
|
|
||||||
|
$skillIssueInfo = [ |
||||||
|
'id' => $skillIssue->getId(), |
||||||
|
'datetime' => api_format_date($skillIssueDate, DATE_TIME_FORMAT_SHORT), |
||||||
|
'acquired_level' => $currentSkillLevel, |
||||||
|
'argumentation_author_id' => $skillIssue->getArgumentationAuthorId(), |
||||||
|
'argumentation_author_name' => api_get_person_name($argumentationAuthor['firstname'], $argumentationAuthor['lastname']), |
||||||
|
'argumentation' => $skillIssue->getArgumentation(), |
||||||
|
'source_name' => $skillIssue->getSourceName(), |
||||||
|
'user_id' => $skillIssue->getUser()->getId(), |
||||||
|
'user_complete_name' => $skillIssue->getUser()->getCompleteName(), |
||||||
|
'skill_id' => $skillIssue->getSkill()->getId(), |
||||||
|
'skill_badge_image' => $skillIssue->getSkill()->getWebIconPath(), |
||||||
|
'skill_name' => $skillIssue->getSkill()->getName(), |
||||||
|
'skill_short_code' => $skillIssue->getSkill()->getShortCode(), |
||||||
|
'skill_description' => $skillIssue->getSkill()->getDescription(), |
||||||
|
'skill_criteria' => $skillIssue->getSkill()->getCriteria(), |
||||||
|
'badge_assertion' => $skillIssue->getAssertionUrl(), |
||||||
|
'comments' => [], |
||||||
|
'feedback_average' => $skillIssue->getAverage() |
||||||
|
]; |
||||||
|
|
||||||
|
$skillIssueComments = $skillIssue->getComments(true); |
||||||
|
|
||||||
|
$userId = $skillIssueInfo['user_id']; |
||||||
|
$skillId = $skillIssueInfo['skill_id']; |
||||||
|
|
||||||
|
foreach ($skillIssueComments as $comment) { |
||||||
|
$commentDate = api_get_local_time($comment->getFeedbackDateTime()); |
||||||
|
|
||||||
|
$skillIssueInfo['comments'][] = [ |
||||||
|
'text' => $comment->getFeedbackText(), |
||||||
|
'value' => $comment->getFeedbackValue(), |
||||||
|
'giver_complete_name' => $comment->getFeedbackGiver()->getCompleteName(), |
||||||
|
'datetime' => api_format_date($commentDate, DATE_TIME_FORMAT_SHORT) |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
$acquiredLevel = []; |
||||||
|
|
||||||
|
$profile = $skillRepo->find($skillId)->getProfile(); |
||||||
|
|
||||||
|
if (!$profile) { |
||||||
|
|
||||||
|
$skillRelSkill = new SkillRelSkill(); |
||||||
|
$parents = $skillRelSkill->get_skill_parents($skillId); |
||||||
|
|
||||||
|
krsort($parents); |
||||||
|
|
||||||
|
foreach ($parents as $parent) { |
||||||
|
$skillParentId = $parent['skill_id']; |
||||||
|
$profile = $skillRepo->find($skillParentId)->getProfile(); |
||||||
|
|
||||||
|
if ($profile) { |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
if (!$profile && $parent['parent_id'] == 0) { |
||||||
|
$profile = $skillLevelRepo->findAll(); |
||||||
|
$profile = $profile[0]; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($profile) { |
||||||
|
|
||||||
|
$profileId = $profile->getId(); |
||||||
|
|
||||||
|
$levels = $skillLevelRepo->findBy([ |
||||||
|
'profile' => $profileId |
||||||
|
]); |
||||||
|
|
||||||
|
foreach ($levels as $level) { |
||||||
|
$profileLevels[$level->getPosition()][$level->getId()] = $level->getName(); |
||||||
|
} |
||||||
|
|
||||||
|
ksort($profileLevels); // Sort the array by Position. |
||||||
|
|
||||||
|
foreach ($profileLevels as $profileLevel) { |
||||||
|
$profileId = key($profileLevel); |
||||||
|
$acquiredLevel[$profileId] = $profileLevel[$profileId]; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
$formAcquiredLevel = new FormValidator('acquired_level'.$skillIssue->getId(), 'post', $skillIssue->getIssueUrlAll()); |
||||||
|
$formAcquiredLevel->addSelect('acquired_level', get_lang('AcquiredLevel'), $acquiredLevel); |
||||||
|
$formAcquiredLevel->addHidden('user', $skillIssue->getUser()->getId()); |
||||||
|
$formAcquiredLevel->addHidden('issue', $skillIssue->getId()); |
||||||
|
$formAcquiredLevel->addButtonSend(get_lang('Save')); |
||||||
|
|
||||||
|
if ($formAcquiredLevel->validate() && $allowComment) { |
||||||
|
$values = $formAcquiredLevel->exportValues(); |
||||||
|
|
||||||
|
$level = $skillLevelRepo->find(intval($values['acquired_level'])); |
||||||
|
$skillIssue->setAcquiredLevel($level); |
||||||
|
|
||||||
|
$entityManager->persist($skillIssue); |
||||||
|
$entityManager->flush(); |
||||||
|
|
||||||
|
header("Location: " . $skillIssue->getIssueUrlAll()); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$form = new FormValidator('comment'.$skillIssue->getId(), 'post', $skillIssue->getIssueUrlAll()); |
||||||
|
$form->addTextarea('comment', get_lang('NewComment'), ['rows' => 4]); |
||||||
|
$form->applyFilter('comment', 'trim'); |
||||||
|
$form->addRule('comment', get_lang('ThisFieldIsRequired'), 'required'); |
||||||
|
$form->addSelect( |
||||||
|
'value', |
||||||
|
[get_lang('Value'), get_lang('RateTheSkillInPractice')], |
||||||
|
['-', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |
||||||
|
); |
||||||
|
$form->addHidden('user', $skillIssue->getUser()->getId()); |
||||||
|
$form->addHidden('issue', $skillIssue->getId()); |
||||||
|
$form->addButtonSend(get_lang('Send')); |
||||||
|
|
||||||
|
if ($form->validate() && $allowComment) { |
||||||
|
$values = $form->exportValues(); |
||||||
|
|
||||||
|
$skillUserComment = new Chamilo\CoreBundle\Entity\SkillRelUserComment(); |
||||||
|
$skillUserComment |
||||||
|
->setFeedbackDateTime(new DateTime) |
||||||
|
->setFeedbackGiver($currentUser) |
||||||
|
->setFeedbackText($values['comment']) |
||||||
|
->setFeedbackValue($values['value'] ? $values['value'] : null) |
||||||
|
->setSkillRelUser($skillIssue); |
||||||
|
|
||||||
|
$entityManager->persist($skillUserComment); |
||||||
|
$entityManager->flush(); |
||||||
|
|
||||||
|
header("Location: " . $skillIssue->getIssueUrlAll()); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$badgeInfoError = ""; |
||||||
|
$personalBadge = ""; |
||||||
|
|
||||||
|
if ($allowDownloadExport) { |
||||||
|
$backpack = 'https://backpack.openbadges.org/'; |
||||||
|
|
||||||
|
$configBackpack = api_get_setting('openbadges_backpack'); |
||||||
|
|
||||||
|
if (strcmp($backpack, $configBackpack) !== 0) { |
||||||
|
$backpack = $configBackpack; |
||||||
|
} |
||||||
|
|
||||||
|
$htmlHeadXtra[] = '<script src="' . $backpack . 'issuer.js"></script>'; |
||||||
|
$objSkill = new Skill(); |
||||||
|
$assertionUrl = $skillIssueInfo['badge_assertion']; |
||||||
|
$skills = $objSkill->get($skillId); |
||||||
|
$unbakedBadge = api_get_path(SYS_UPLOAD_PATH) . "badges/".$skills['icon']; |
||||||
|
if (!is_file($unbakedBadge)) { |
||||||
|
$unbakedBadge = api_get_path(WEB_CODE_PATH).'img/icons/128/badges-default.png'; |
||||||
|
} |
||||||
|
|
||||||
|
$unbakedBadge = file_get_contents($unbakedBadge); |
||||||
|
$badgeInfoError = false; |
||||||
|
$personalBadge = ""; |
||||||
|
$png = new PNGImageBaker($unbakedBadge); |
||||||
|
|
||||||
|
if ($png->checkChunks("tEXt", "openbadges")) { |
||||||
|
$bakedInfo = $png->addChunk("tEXt", "openbadges", $assertionUrl); |
||||||
|
$bakedBadge = UserManager::getUserPathById($userId, "system"); |
||||||
|
$bakedBadge = $bakedBadge.'badges'; |
||||||
|
if (!file_exists($bakedBadge)) { |
||||||
|
mkdir($bakedBadge, api_get_permissions_for_new_directories(), true); |
||||||
|
} |
||||||
|
$skillRelUserId = $skillIssueInfo['id']; |
||||||
|
if (!file_exists($bakedBadge . "/badge_" . $skillRelUserId)) { |
||||||
|
file_put_contents($bakedBadge . "/badge_" . $skillRelUserId . ".png", $bakedInfo); |
||||||
|
} |
||||||
|
|
||||||
|
//Process to validate a baked badge |
||||||
|
$badgeContent = file_get_contents($bakedBadge . "/badge_" . $skillRelUserId . ".png"); |
||||||
|
$verifyBakedBadge = $png->extractBadgeInfo($badgeContent); |
||||||
|
if (!is_array($verifyBakedBadge)) { |
||||||
|
$badgeInfoError = true; |
||||||
|
} |
||||||
|
|
||||||
|
if (!$badgeInfoError) { |
||||||
|
$personalBadge = UserManager::getUserPathById($userId, "web"); |
||||||
|
$personalBadge = $personalBadge."badges/badge_" . $skillRelUserId . ".png"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$allUserBadges[$index]['issue_info'] = $skillIssueInfo; |
||||||
|
$allUserBadges[$index]['allow_comment'] = $allowComment; |
||||||
|
$allUserBadges[$index]['allow_download_export'] = $allowDownloadExport; |
||||||
|
$allUserBadges[$index]['comment_form'] = $form->returnForm(); |
||||||
|
$allUserBadges[$index]['acquired_level_form'] = $formAcquiredLevel->returnForm(); |
||||||
|
$allUserBadges[$index]['badge_error'] = $badgeInfoError; |
||||||
|
$allUserBadges[$index]['personal_badge'] = $personalBadge; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
$template = new Template(get_lang('IssuedBadgeInformation')); |
||||||
|
$template->assign('user_badges', $allUserBadges); |
||||||
|
|
||||||
|
|
||||||
|
$content = $template->fetch( |
||||||
|
$template->get_template('skill/issued_all.tpl') |
||||||
|
); |
||||||
|
|
||||||
|
$template->assign('header', get_lang('IssuedBadgeInformation')); |
||||||
|
$template->assign('content', $content); |
||||||
|
$template->display_one_col_template(); |
@ -0,0 +1,142 @@ |
|||||||
|
{% for badge in user_badges %} |
||||||
|
<div class="row issued"> |
||||||
|
<div class="col-md-5"> |
||||||
|
<div class="thumbnail"> |
||||||
|
<figure class="text-center"> |
||||||
|
<img class="img-responsive center-block" src="{{ badge.issue_info.skill_badge_image }}" alt="{{ badge.issue_info.skill_name }}"> |
||||||
|
<figcaption> |
||||||
|
<p class="lead">{{ badge.issue_info.skill_name }}</p> |
||||||
|
{% if badge.issue_info.skill_short_code %} |
||||||
|
<p>{{ badge.issue_info.skill_short_code }}</p> |
||||||
|
{% endif %} |
||||||
|
</figcaption> |
||||||
|
</figure> |
||||||
|
<div class="caption"> |
||||||
|
{% if badge.issue_info.skill_description %} |
||||||
|
<p>{{ badge.issue_info.skill_description }}</p> |
||||||
|
{% endif %} |
||||||
|
{% if badge.issue_info.skill_criteria %} |
||||||
|
<h3>{{ 'CriteriaToEarnTheBadge'|get_lang }}</h3> |
||||||
|
<p>{{ badge.issue_info.skill_criteria }}</p> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% if badge.allow_download_export %} |
||||||
|
{% if badge.badge_error %} |
||||||
|
<hr> |
||||||
|
<div class="alert alert-danger"> {{ 'BakedBadgeProblem'|get_lang }}</div> |
||||||
|
{% else %} |
||||||
|
<p class="text-center"> |
||||||
|
<a href="{{ badge.personal_badge }}" class="btn btn-primary" target="_new" download="badge"> |
||||||
|
<em class="fa fa-download fa-fw"></em> {{ 'DownloadBadge'|get_lang }} |
||||||
|
</a> |
||||||
|
</p> |
||||||
|
{% endif %} |
||||||
|
<hr> |
||||||
|
<p class="text-center"> |
||||||
|
<a href="#" class="btn btn-success" id="badge-export-button-{{ badge.issue_info.id }}"> |
||||||
|
<em class="fa fa-external-link-square fa-fw"></em> {{ 'ExportBadge'|get_lang }} |
||||||
|
</a> |
||||||
|
</p> |
||||||
|
<div class='col-md-12 text-center'> |
||||||
|
<h5><b> {{ 'ShareWithYourFriends' | get_lang }} </b></h5> |
||||||
|
<a href='http://www.facebook.com/sharer.php?u={{ _p.web }}badge/{{ badge.issue_info.id }}' target='_new'> |
||||||
|
<em class='fa fa-facebook-square fa-3x text-info' aria-hidden='true'></em> |
||||||
|
</a> |
||||||
|
<a href='https://twitter.com/home?status={{ 'IHaveObtainedSkillXOnY' | get_lang |format(skill_info.name, _s.site_name)}} - {{ _p.web }}badge/{{ badge.issue_info.id }}' target='_new'> |
||||||
|
<em class='fa fa-twitter-square fa-3x text-light' aria-hidden='true'></em> |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
<div class="col-md-7"> |
||||||
|
<h3>{{ 'RecipientDetails'|get_lang }}</h3> |
||||||
|
<p class="lead">{{ badge.issue_info.user_complete_name }}</p> |
||||||
|
<h4>{{ 'SkillAcquiredAt'|get_lang }}</h4> |
||||||
|
<ul class="fa-ul"> |
||||||
|
<li> |
||||||
|
{% if badge.issue_info.source_name %} |
||||||
|
<em class="fa-li fa fa-clock-o fa-fw"></em> {{ 'TimeXThroughCourseY'|get_lang|format(badge.issue_info.datetime, badge.issue_info.source_name) }} |
||||||
|
{% else %} |
||||||
|
<em class="fa-li fa fa-clock-o fa-fw"></em> {{ badge.issue_info.datetime }} |
||||||
|
{% endif %} |
||||||
|
{% if badge.issue_info.argumentation %} |
||||||
|
{% if badge.issue_info.argumentation %} |
||||||
|
<b><p style="font-style: italic;">{{ 'UserXIndicated'|get_lang|format(badge.issue_info.argumentation_author_name) }} </p></b> |
||||||
|
{% endif %} |
||||||
|
<p>{{ badge.issue_info.argumentation }}</p> |
||||||
|
{% endif %} |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
<h4>{{ 'AcquiredLevel'|get_lang }}</h4> |
||||||
|
<ul class="fa-ul"> |
||||||
|
<li> |
||||||
|
<em class="fa-li fa fa-check-circle-o fa-fw"></em> {{ badge.issue_info.acquired_level }} |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
|
||||||
|
{% if badge.allow_comment %} |
||||||
|
<hr> |
||||||
|
<div class="panel panel-info"> |
||||||
|
<div class="panel-heading"> |
||||||
|
<em class="fa fa-check-circle-o fa-fw" aria-hidden="true"></em> {{ 'ChangeAcquiredLevel'|get_lang }} |
||||||
|
</div> |
||||||
|
<div class="panel-body"> |
||||||
|
{{ badge.acquired_level_form }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<hr> |
||||||
|
<div class="panel panel-info"> |
||||||
|
<div class="panel-heading"> |
||||||
|
<em class="fa fa-comment-o fa-fw" aria-hidden="true"></em> {{ 'XComments'|get_lang|format(badge.issue_info.comments|length) }} |
||||||
|
/ |
||||||
|
<em class="fa fa-thumbs-o-up fa-fw" aria-hidden="true"></em> {{ 'AverageRatingX'|get_lang|format(badge.issue_info.feedback_average) }} |
||||||
|
</div> |
||||||
|
<div class="panel-body"> |
||||||
|
{{ badge.comment_form }} |
||||||
|
<hr> |
||||||
|
{% for comment in badge.issue_info.comments %} |
||||||
|
<article class="media"> |
||||||
|
<div class="media-body"> |
||||||
|
<h4 class="media-heading">{{ comment.giver_complete_name }}</h4> |
||||||
|
<p><small>{{ comment.datetime }}</small></p> |
||||||
|
<p>{{ comment.text }}</p> |
||||||
|
</div> |
||||||
|
<div class="media-right text-right"> |
||||||
|
<div style="width: 80px;"> |
||||||
|
{% if comment.value %} |
||||||
|
<em class="fa fa-certificate fa-fw" aria-label="{{ 'AverageRating' }}"></em> |
||||||
|
<span class="sr-only">{{ 'AverageRating' }}</span> {{ comment.value }} |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</article> |
||||||
|
{% else %} |
||||||
|
<p>{{ 'WithoutComment'|get_lang }}</p> |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% else %} |
||||||
|
<hr> |
||||||
|
<p class="lead"> |
||||||
|
<em class="fa fa-comment-o fa-fw" aria-hidden="true"></em> {{ 'XComments'|get_lang|format(badge.issue_info.comments|length) }} |
||||||
|
/ |
||||||
|
<em class="fa fa-thumbs-o-up fa-fw" aria-hidden="true"></em> {{ 'AverageRatingX'|get_lang|format(badge.issue_info.feedback_average) }} |
||||||
|
</p> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% if badge.allow_download_export %} |
||||||
|
<script> |
||||||
|
$(document).on('ready', function () { |
||||||
|
$('#badge-export-button-{{ badge.issue_info.id }}').on('click', function (e) { |
||||||
|
e.preventDefault(); |
||||||
|
|
||||||
|
OpenBadges.issue({{ badge.issue_info.badge_assertion|json_encode() }}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
{% endif %} |
||||||
|
<br /> |
||||||
|
<br /> |
||||||
|
{% endfor %} |
Loading…
Reference in new issue