Merge branch 'master' into ui

pull/2715/head
Alex Aragón 7 years ago
commit f1c8ea7b37
  1. 119
      main/inc/introductionSection.inc.php
  2. 1
      main/inc/lib/display.lib.php
  3. 25
      main/template/default/auth/introduction_section.html.twig
  4. 0
      main/template/default/course_home/index.html.twig
  5. 76
      plugin/ims_lti/ImsLtiPlugin.php
  6. 68
      plugin/ims_lti/form.php

@ -169,9 +169,7 @@ if ($intro_cmdEdit || $intro_cmdAdd) {
if ($intro_dispForm) {
$default['intro_content'] = $intro_content;
$form->setDefaults($default);
$introduction_section .= '<div id="courseintro" style="width: 98%">';
$introduction_section .= $form->returnForm();
$introduction_section .= '</div>';
}
$thematic_description_html = '';
@ -288,55 +286,75 @@ if (!empty($thematic_advance_info)) {
$introduction_section .= $thematicProgress;
$introduction_section .= '</div>';
}
$editIconButton = '';
$toolbar = [];
if (api_is_allowed_to_edit() && empty($session_id)) {
$editIconButton = Display::url(
'<em class="fa fa-wrench"></em> ',
api_get_path(WEB_CODE_PATH).'course_info/tools.php?'.api_get_cidreq(),
['class' => 'btn btn-default', 'title' => get_lang('CustomizeIcons')]
);
$tool = [
'name' => get_lang('CustomizeIcons'),
'url' => api_get_path(WEB_CODE_PATH).'course_info/tools.php?'.api_get_cidreq(),
'icon' => 'fas fa-cog'
];
$toolbar[]= $tool;
}
$toolbar = '';
$textIntro = '';
if ($intro_dispCommand) {
if (empty($intro_content)) {
// Displays "Add intro" commands
$toolbar .= '<div class="toolbar-edit">';
$toolbar .= '<div class="btn-group pull-right" role="group">';
if (!empty($courseId)) {
$textIntro = '<a class="btn btn-default" title="'.addslashes(get_lang('AddIntro')).'" href="'.api_get_self().'?'.api_get_cidreq().$blogParam.'&intro_cmdAdd=1">';
$textIntro .= '<em class="fa fa-file-text"></em> ';
$textIntro .= "</a>";
$toolbar .= $textIntro.$editIconButton;
$tool = [
'name' => addslashes(get_lang('AddIntro')),
'url' => api_get_self().'?'.api_get_cidreq().$blogParam.'&intro_cmdAdd=1',
'icon' => 'fas fa-pencil-alt',
];
$toolbar[]= $tool;
} else {
$toolbar .= '<a class="btn btn-default" href="'.api_get_self().'?intro_cmdAdd=1">'.get_lang('AddIntro').'</a>';
$toolbar .= $editIconButton;
$tool = [
'name' => get_lang('AddIntro'),
'url' => api_get_self().'?intro_cmdAdd=1',
'icon' => 'fas fa-pencil-alt'
];
$toolbar[]= $tool;
}
$toolbar .= '</div></div>';
} else {
// Displays "edit intro && delete intro" commands
$toolbar .= '<div class="toolbar-edit">';
$toolbar .= '<div class="btn-group pull-right" rol="group">';
if (!empty($courseId)) {
$toolbar .=
'<a class="btn btn-default" href="'.api_get_self().'?'.api_get_cidreq().$blogParam.'&intro_cmdEdit=1" title="'.get_lang('Modify').'">
<em class="fa fa-pencil"></em></a>';
$toolbar .= $editIconButton;
$toolbar .= "<a class=\"btn btn-default\" href=\"".api_get_self()."?".api_get_cidreq().$blogParam."&intro_cmdDel=1\" onclick=\"javascript:
if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, $charset)).
"')) return false;\"><em class=\"fa fa-trash-o\"></em></a>";
$tool = [
'name' => get_lang('Modify'),
'url' => api_get_self().'?'.api_get_cidreq().$blogParam.'&intro_cmdEdit=1',
'icon' => 'fas fa-pencil-alt'
];
$toolbar[]= $tool;
$tool = [
'name' => get_lang('ConfirmYourChoice'),
'url' => api_get_self()."?".api_get_cidreq().$blogParam."&intro_cmdDel=1",
'onclick' => "javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, $charset)).
"')) return false",
'icon' => 'fas fa-trash-alt'
];
$toolbar[]= $tool;
} else {
$toolbar .=
'<a class="btn btn-default" href="'.api_get_self().'?intro_cmdEdit=1" title="'.get_lang('Modify').'">
<em class="fa fa-pencil"></em>
</a>"';
$toolbar .= $editIconButton;
$toolbar .= "<a class=\"btn btn-default\" href=\"".api_get_self()."?".api_get_cidreq()."&intro_cmdDel=1\" onclick=\"javascript:
if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, $charset)).
"')) return false;\"><em class=\"fa fa-trash-o\"></em></a>";
$tool=[
'name' => get_lang('Modify'),
'url' => api_get_self().'?intro_cmdEdit=1',
'icon' => 'fas fa-pencil-alt'
];
$toolbar[]= $tool;
$tool=[
'name' => get_lang('ConfirmYourChoice'),
'url' => api_get_self()."?".api_get_cidreq()."&intro_cmdDel=1",
'onclick' => "javascript:if(!confirm('".addslashes(api_htmlentities(get_ilang('ConfirmYourChoice'), ENT_QUOTES, $charset)).
"')) return false",
'icon' => 'fas fa-trash-alt'
];
$toolbar[]= $tool;
}
$toolbar .= "</div></div>";
// Fix for chrome XSS filter for videos in iframes - BT#7930
$browser = api_get_navigator();
if (strpos($introduction_section, '<iframe') !== false && $browser['name'] == 'Chrome') {
@ -350,23 +368,26 @@ if ($moduleId != 'course_homepage') {
$nameSection = get_lang('AddCustomToolsIntro');
}
$introduction_section .= '<div class="col-md-12">';
$textContent = [];
if ($intro_dispDefault) {
if (!empty($intro_content)) {
$introduction_section .= '<div class="page-course">';
$introduction_section .= $intro_content;
$introduction_section .= '</div>';
$textContent = [
'name' => 'introduction-course',
'help' => $nameSection,
'text' => $intro_content
];
} else {
if (api_is_allowed_to_edit()) {
$introduction_section .= '<div class="help-course">';
$introduction_section .= $nameSection.' '.$textIntro;
$introduction_section .= '</div>';
$textContent = [
'name' => 'introduction-section',
'help' => $nameSection,
'text' => $intro_content
];
}
}
}
$introduction_section .= $toolbar;
$introduction_section .= '</div>';
//$introduction_section .= $toolbar;
$introduction_section .= '</div>';
$browser = api_get_navigator();
@ -374,3 +395,9 @@ $browser = api_get_navigator();
if (strpos($introduction_section, '<iframe') !== false && $browser['name'] == 'Chrome') {
header("X-XSS-Protection: 0");
}
$data = null;
$tpl = new Template(null);
$tpl->assign('intro',$textContent);
$tpl->assign('toolbar',$toolbar);
$introduction_section .= $tpl->fetch($tpl->get_template('auth/introduction_section.html.twig'));

@ -202,7 +202,6 @@ class Display
if (api_get_setting('enable_tool_introduction') == 'true' || $tool == TOOL_COURSE_HOMEPAGE) {
$introduction_section = null;
require api_get_path(SYS_INC_PATH).'introductionSection.inc.php';
return $introduction_section;
}
}

@ -0,0 +1,25 @@
{% autoescape false %}
<div class="card">
<div class="card-body p-3">
<section id="section-intro">
<div id="{{ intro.name }}" class="section-intro-content">
{% if intro.text !='' %}
{{ intro.text }}
{% else %}
{{ intro.help }}
{% endif %}
</div>
<div class="section-intro-toolbar float-right">
<div class="btn-group btn-group-sm" role="group" aria-label="">
{% for item in toolbar %}
<a href="{{ item.url }}" onclick="{{ (item.onclick!='')? item.onclick : '' }}"
title="{{ item.name }}" class="btn btn-light">
<i class="{{ item.icon }}"></i>
</a>
{% endfor %}
</div>
</div>
</section>
</div>
</div>
{% endautoescape %}

@ -1,8 +1,12 @@
<?php
/* For license terms, see /license.txt */
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
use Chamilo\CourseBundle\Entity\CTool;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\UserBundle\Entity\User;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\DBALException;
@ -180,8 +184,8 @@ class ImsLtiPlugin extends Plugin
$this->course_settings = [
[
'name' => $this->get_lang('ImsLtiDescription').$button.'<hr>',
'type' => 'html'
]
'type' => 'html',
],
];
}
@ -238,4 +242,72 @@ class ImsLtiPlugin extends Plugin
{
return api_get_path(SYS_PATH).'src/Chamilo/PluginBundle/Entity/'.$this->getCamelCaseName();
}
public static function isInstructor()
{
api_is_allowed_to_edit(false, true);
}
/**
* @param User $user
*
* @return string
*/
public static function getUserRoles(User $user)
{
if ($user->getStatus() === INVITEE) {
return 'Learner/GuestLearner';
}
if (!api_is_allowed_to_edit(false, true)) {
return 'Learner/Learner';
}
$roles = ['Instructor'];
if (api_is_platform_admin_by_id($user->getId())) {
$roles[] = 'Administrator/SystemAdministrator';
}
return implode(',', $roles);
}
/**
* @param int $userId
*
* @return string
*/
public static function generateToolUserId($userId)
{
$siteName = api_get_setting('siteName');
$institution = api_get_setting('Institution');
$toolUserId = "$siteName - $institution - $userId";
$toolUserId = api_replace_dangerous_char($toolUserId);
return $toolUserId;
}
/**
* @param Course $course
* @param Session|null $session
*
* @return string
*/
public static function getRoleScopeMentor(Course $course, Session $session = null)
{
$scope = [];
if ($session) {
$students = $session->getUserCourseSubscriptionsByStatus($course, Session::STUDENT);
} else {
$students = $course->getStudents();
}
/** @var SessionRelCourseRelUser|CourseRelUser $subscription */
foreach ($students as $subscription) {
$scope[] = self::generateToolUserId($subscription->getUser()->getId());
}
return implode(',', $scope);
}
}

@ -1,6 +1,7 @@
<?php
/* For license terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\UserBundle\Entity\User;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\PluginBundle\Entity\ImsLti\ImsLtiTool;
@ -21,47 +22,46 @@ if (!$tool) {
/** @var ImsLtiPlugin $imsLtiPlugin */
$imsLtiPlugin = ImsLtiPlugin::create();
/** @var Session $session */
$session = $em->find('ChamiloCoreBundle:Session', api_get_session_id());
/** @var Course $course */
$course = $em->find('ChamiloCoreBundle:Course', api_get_course_int_id());
/** @var User $user */
$user = $em->find('ChamiloUserBundle:User', api_get_user_id());
$siteName = api_get_setting('siteName');
$institution = api_get_setting('Institution');
$toolUserId = "$siteName - $institution - {$user->getId()}";
$toolUserId = api_replace_dangerous_char($toolUserId);
$params = [
'lti_message_type' => 'basic-lti-launch-request',
'lti_version' => 'LTI-1p0',
'resource_link_id' => $tool->getId(),
'resource_link_title' => $tool->getName(),
'resource_link_description' => $tool->getDescription(),
'user_id' => $toolUserId,
'roles' => api_is_teacher() ? 'Instructor' : 'Student',
'lis_person_name_given' => $user->getFirstname(),
'lis_person_name_family' => $user->getLastname(),
'lis_person_name_full' => UserManager::formatUserFullName($user),
'lis_person_contact_email_primary' => $user->getEmail(),
'context_id' => $course->getId(),
'context_label' => $course->getCode(),
'context_title' => $course->getTitle(),
'launch_presentation_locale' => api_get_language_isocode(),
'launch_presentation_document_target' => 'embed',
$toolUserId = ImsLtiPlugin::generateToolUserId($user);
$params = [];
$params['lti_message_type'] = 'basic-lti-launch-request';
$params['lti_version'] = 'LTI-1p0';
$params['resource_link_id'] = $tool->getId();
$params['resource_link_title'] = $tool->getName();
$params['resource_link_description'] = $tool->getDescription();
$params['user_id'] = ImsLtiPlugin::generateToolUserId($user->getId());
$params['user_image'] = UserManager::getUserPicture($user->getId());
$params['roles'] = ImsLtiPlugin::getUserRoles($user);
$params['lis_person_name_given'] = $user->getFirstname();
$params['lis_person_name_family'] = $user->getLastname();
$params['lis_person_name_full'] = $user->getCompleteName();
$params['lis_person_contact_email_primary'] = $user->getEmail();
if (api_is_allowed_to_edit(false, true)) {
$params['role_scope_mentor'] = ImsLtiPlugin::getRoleScopeMentor($course, $session);
}
'tool_consumer_info_product_family_code' => 'Chamilo LMS',
'tool_consumer_info_version' => api_get_version(),
'tool_consumer_instance_guid' => api_get_setting('InstitutionUrl'),
'tool_consumer_instance_name' => $siteName,
'tool_consumer_instance_url' => api_get_path(WEB_PATH),
'tool_consumer_instance_contact_email' => api_get_setting('emailAdministrator'),
];
$params['context_id'] = $course->getId();
$params['context_type'] = 'CourseSection';
$params['context_label'] = $course->getCode();
$params['context_title'] = $course->getTitle();
$params['launch_presentation_locale'] = api_get_language_isocode();
$params['launch_presentation_document_target'] = 'iframe';
$params['tool_consumer_info_product_family_code'] = 'Chamilo LMS';
$params['tool_consumer_info_version'] = api_get_version();
$params['tool_consumer_instance_guid'] = str_replace(['https://', 'http://'], '', api_get_setting('InstitutionUrl'));
$params['tool_consumer_instance_name'] = $siteName;
$params['tool_consumer_instance_url'] = api_get_path(WEB_PATH);
$params['tool_consumer_instance_contact_email'] = api_get_setting('emailAdministrator');
$oauth = new OAuthSimple(
$tool->getConsumerKey(),

Loading…
Cancel
Save