issued.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. use Chamilo\CoreBundle\Entity\SkillRelUser;
  4. use Chamilo\CoreBundle\Entity\SkillRelUserComment;
  5. use SkillRelUser as SkillRelUserManager;
  6. /**
  7. * Show information about the issued badge.
  8. *
  9. * @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
  10. * @author José Loguercio Silva <jose.loguercio@beeznest.com>
  11. *
  12. * @package chamilo.badge
  13. */
  14. require_once __DIR__.'/../inc/global.inc.php';
  15. $issue = isset($_REQUEST['issue']) ? (int) $_REQUEST['issue'] : 0;
  16. $userId = isset($_REQUEST['user']) ? (int) $_REQUEST['user'] : 0;
  17. if (empty($issue)) {
  18. api_not_allowed(true);
  19. }
  20. $entityManager = Database::getManager();
  21. /** @var SkillRelUser $skillIssue */
  22. $skillIssue = $entityManager->find('ChamiloCoreBundle:SkillRelUser', $issue);
  23. if (!$skillIssue) {
  24. Display::addFlash(
  25. Display::return_message(
  26. get_lang('SkillNotFound'),
  27. 'warning'
  28. )
  29. );
  30. header('Location: '.api_get_path(WEB_PATH));
  31. exit;
  32. }
  33. $skillRepo = $entityManager->getRepository('ChamiloCoreBundle:Skill');
  34. $skillLevelRepo = $entityManager->getRepository('ChamiloSkillBundle:Level');
  35. $user = $skillIssue->getUser();
  36. $skill = $skillIssue->getSkill();
  37. if (!$user || !$skill) {
  38. Display::addFlash(
  39. Display::return_message(get_lang('NoResults'), 'warning')
  40. );
  41. header('Location: '.api_get_path(WEB_PATH));
  42. exit;
  43. }
  44. if (!Skill::isToolAvailable()) {
  45. api_not_allowed(true);
  46. }
  47. $showLevels = api_get_configuration_value('hide_skill_levels') === false;
  48. $skillInfo = [
  49. 'id' => $skill->getId(),
  50. 'name' => $skill->getName(),
  51. 'short_code' => $skill->getShortCode(),
  52. 'description' => $skill->getDescription(),
  53. 'criteria' => $skill->getCriteria(),
  54. 'badge_image' => Skill::getWebIconPath($skill),
  55. 'courses' => [],
  56. ];
  57. $titleContent = sprintf(get_lang('IHaveObtainedSkillXOnY'), $skillInfo['name'], api_get_setting('siteName'));
  58. // Open Graph Markup
  59. $htmlHeadXtra[] = "
  60. <meta property='og:type' content='article' />
  61. <meta property='og:title' content='".$titleContent."' />
  62. <meta property='og:url' content='".api_get_path(WEB_PATH)."badge/".$issue."' />
  63. <meta property='og:description' content='".$skillInfo['description']."' />
  64. <meta property='og:image' content='".$skillInfo['badge_image']."' />
  65. ";
  66. $currentUserId = api_get_user_id();
  67. $currentUser = api_get_user_entity($currentUserId);
  68. $allowExport = $currentUser ? $currentUser->getId() === $user->getId() : false;
  69. $allowComment = $currentUser ? Skill::userCanAddFeedbackToUser($currentUser, $user) : false;
  70. $skillIssueDate = api_get_local_time($skillIssue->getAcquiredSkillAt());
  71. $currentSkillLevel = get_lang('NoLevelAcquiredYet');
  72. if ($skillIssue->getAcquiredLevel()) {
  73. $currentSkillLevel = $skillLevelRepo->find(['id' => $skillIssue->getAcquiredLevel()])->getName();
  74. }
  75. $author = api_get_user_info($skillIssue->getArgumentationAuthorId());
  76. $skillIssueInfo = [
  77. 'id' => $skillIssue->getId(),
  78. 'datetime' => api_format_date($skillIssueDate, DATE_TIME_FORMAT_SHORT),
  79. 'acquired_level' => $currentSkillLevel,
  80. 'argumentation_author_id' => $skillIssue->getArgumentationAuthorId(),
  81. 'argumentation_author_name' => $author['complete_name'],
  82. 'argumentation' => $skillIssue->getArgumentation(),
  83. 'source_name' => $skillIssue->getSourceName(),
  84. 'user_id' => $skillIssue->getUser()->getId(),
  85. 'user_complete_name' => $skillIssue->getUser()->getCompleteName(),
  86. 'skill_id' => $skillIssue->getSkill()->getId(),
  87. 'skill_badge_image' => Skill::getWebIconPath($skillIssue->getSkill()),
  88. 'skill_name' => $skillIssue->getSkill()->getName(),
  89. 'skill_short_code' => $skillIssue->getSkill()->getShortCode(),
  90. 'skill_description' => $skillIssue->getSkill()->getDescription(),
  91. 'skill_criteria' => $skillIssue->getSkill()->getCriteria(),
  92. 'badge_assertion' => SkillRelUserManager::getAssertionUrl($skillIssue),
  93. 'comments' => [],
  94. 'feedback_average' => $skillIssue->getAverage(),
  95. ];
  96. $skillIssueComments = $skillIssue->getComments(true);
  97. $userId = $skillIssueInfo['user_id'];
  98. $skillId = $skillIssueInfo['skill_id'];
  99. /** @var SkillRelUserComment $comment */
  100. foreach ($skillIssueComments as $comment) {
  101. $commentDate = api_get_local_time($comment->getFeedbackDateTime());
  102. $skillIssueInfo['comments'][] = [
  103. 'text' => $comment->getFeedbackText(),
  104. 'value' => $comment->getFeedbackValue(),
  105. 'giver_complete_name' => $comment->getFeedbackGiver()->getCompleteName(),
  106. 'datetime' => api_format_date($commentDate, DATE_TIME_FORMAT_SHORT),
  107. ];
  108. }
  109. $acquiredLevel = [];
  110. $profile = $skillRepo->find($skillId)->getProfile();
  111. if (!$profile) {
  112. $skillRelSkill = new SkillRelSkill();
  113. $parents = $skillRelSkill->getSkillParents($skillId);
  114. krsort($parents);
  115. foreach ($parents as $parent) {
  116. $skillParentId = $parent['skill_id'];
  117. $profile = $skillRepo->find($skillParentId)->getProfile();
  118. if ($profile) {
  119. break;
  120. }
  121. if (!$profile && $parent['parent_id'] == 0) {
  122. $profile = $skillLevelRepo->findAll();
  123. if ($profile) {
  124. $profile = $profile[0];
  125. }
  126. }
  127. }
  128. }
  129. if ($profile) {
  130. $profileId = $profile->getId();
  131. $levels = $skillLevelRepo->findBy([
  132. 'profile' => $profileId,
  133. ]);
  134. $profileLevels = [];
  135. foreach ($levels as $level) {
  136. $profileLevels[$level->getPosition()][$level->getId()] = $level->getName();
  137. }
  138. ksort($profileLevels); // Sort the array by Position.
  139. foreach ($profileLevels as $profileLevel) {
  140. $profileId = key($profileLevel);
  141. $acquiredLevel[$profileId] = $profileLevel[$profileId];
  142. }
  143. }
  144. $allowToEdit = Skill::isAllowed($user->getId(), false);
  145. if ($showLevels && $allowToEdit) {
  146. $formAcquiredLevel = new FormValidator('acquired_level');
  147. $formAcquiredLevel->addSelect('acquired_level', get_lang('AcquiredLevel'), $acquiredLevel);
  148. $formAcquiredLevel->addHidden('user', $skillIssue->getUser()->getId());
  149. $formAcquiredLevel->addHidden('issue', $skillIssue->getId());
  150. $formAcquiredLevel->addButtonSave(get_lang('Save'));
  151. if ($formAcquiredLevel->validate() && $allowComment) {
  152. $values = $formAcquiredLevel->exportValues();
  153. $level = $skillLevelRepo->find(intval($values['acquired_level']));
  154. $skillIssue->setAcquiredLevel($level);
  155. $entityManager->persist($skillIssue);
  156. $entityManager->flush();
  157. Display::addFlash(Display::return_message(get_lang('Saved')));
  158. header('Location: '.SkillRelUserManager::getIssueUrl($skillIssue));
  159. exit;
  160. }
  161. }
  162. $form = new FormValidator('comment');
  163. $form->addTextarea('comment', get_lang('NewComment'), ['rows' => 4]);
  164. $form->applyFilter('comment', 'trim');
  165. $form->addRule('comment', get_lang('ThisFieldIsRequired'), 'required');
  166. $form->addSelect(
  167. 'value',
  168. [get_lang('Value'), get_lang('RateTheSkillInPractice')],
  169. ['-', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  170. );
  171. $form->addHidden('user', $skillIssue->getUser()->getId());
  172. $form->addHidden('issue', $skillIssue->getId());
  173. $form->addButtonSend(get_lang('Send'));
  174. if ($form->validate() && $allowComment && $allowToEdit) {
  175. $values = $form->exportValues();
  176. $skillUserComment = new SkillRelUserComment();
  177. $skillUserComment
  178. ->setFeedbackDateTime(new DateTime())
  179. ->setFeedbackGiver($currentUser)
  180. ->setFeedbackText($values['comment'])
  181. ->setFeedbackValue($values['value'] ? $values['value'] : null)
  182. ->setSkillRelUser($skillIssue)
  183. ;
  184. $entityManager->persist($skillUserComment);
  185. $entityManager->flush();
  186. Display::addFlash(Display::return_message(get_lang('Added')));
  187. header('Location: '.SkillRelUserManager::getIssueUrl($skillIssue));
  188. exit;
  189. }
  190. $badgeInfoError = '';
  191. $personalBadge = '';
  192. if ($allowExport) {
  193. $backpack = 'https://backpack.openbadges.org/';
  194. $configBackpack = api_get_setting('openbadges_backpack');
  195. if (strcmp($backpack, $configBackpack) !== 0) {
  196. $backpack = $configBackpack;
  197. }
  198. $htmlHeadXtra[] = '<script src="'.$backpack.'issuer.js"></script>';
  199. $objSkill = new Skill();
  200. $assertionUrl = $skillIssueInfo['badge_assertion'];
  201. $skills = $objSkill->get($skillId);
  202. $unbakedBadge = api_get_path(SYS_UPLOAD_PATH).'badges/'.$skills['icon'];
  203. if (!is_file($unbakedBadge)) {
  204. $unbakedBadge = api_get_path(SYS_CODE_PATH).'img/icons/128/badges-default.png';
  205. }
  206. $unbakedBadge = file_get_contents($unbakedBadge);
  207. $badgeInfoError = false;
  208. $personalBadge = '';
  209. $png = new PNGImageBaker($unbakedBadge);
  210. if ($png->checkChunks("tEXt", "openbadges")) {
  211. $bakedInfo = $png->addChunk("tEXt", "openbadges", $assertionUrl);
  212. $bakedBadge = UserManager::getUserPathById($userId, "system");
  213. $bakedBadge = $bakedBadge.'badges';
  214. if (!file_exists($bakedBadge)) {
  215. mkdir($bakedBadge, api_get_permissions_for_new_directories(), true);
  216. }
  217. $skillRelUserId = $skillIssueInfo['id'];
  218. if (!file_exists($bakedBadge."/badge_".$skillRelUserId)) {
  219. file_put_contents($bakedBadge."/badge_".$skillRelUserId.".png", $bakedInfo);
  220. }
  221. // Process to validate a baked badge
  222. $badgeContent = file_get_contents($bakedBadge."/badge_".$skillRelUserId.".png");
  223. $verifyBakedBadge = $png->extractBadgeInfo($badgeContent);
  224. if (!is_array($verifyBakedBadge)) {
  225. $badgeInfoError = true;
  226. }
  227. if (!$badgeInfoError) {
  228. $personalBadge = UserManager::getUserPathById($userId, 'web');
  229. $personalBadge = $personalBadge."badges/badge_".$skillRelUserId.".png";
  230. }
  231. }
  232. }
  233. $template = new Template(get_lang('IssuedBadgeInformation'));
  234. $template->assign('issue_info', $skillIssueInfo);
  235. $template->assign('allow_comment', $allowComment);
  236. $template->assign('allow_export', $allowExport);
  237. $commentForm = '';
  238. if ($allowComment && $allowToEdit) {
  239. $commentForm = $form->returnForm();
  240. }
  241. $template->assign('comment_form', $commentForm);
  242. $levelForm = '';
  243. if ($showLevels && $allowToEdit) {
  244. $levelForm = $formAcquiredLevel->returnForm();
  245. }
  246. $template->assign('acquired_level_form', $levelForm);
  247. $template->assign('badge_error', $badgeInfoError);
  248. $template->assign('personal_badge', $personalBadge);
  249. $template->assign('show_level', $showLevels);
  250. $content = $template->fetch($template->get_template('skill/issued.tpl'));
  251. $template->assign('header', get_lang('IssuedBadgeInformation'));
  252. $template->assign('content', $content);
  253. $template->display_one_col_template();