parent
b0e0e49a59
commit
7f8a7f9ae0
@ -0,0 +1,167 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
use Chamilo\PluginBundle\Entity\XApi\ToolLaunch; |
||||||
|
use Symfony\Component\HttpFoundation\Request as HttpRequest; |
||||||
|
|
||||||
|
require_once __DIR__.'/../../../main/inc/global.inc.php'; |
||||||
|
|
||||||
|
api_protect_course_script(true); |
||||||
|
api_protect_teacher_script(); |
||||||
|
|
||||||
|
$request = HttpRequest::createFromGlobals(); |
||||||
|
|
||||||
|
$em = Database::getManager(); |
||||||
|
|
||||||
|
$toolLaunch = $em->find( |
||||||
|
ToolLaunch::class, |
||||||
|
$request->query->getInt('id') |
||||||
|
); |
||||||
|
|
||||||
|
if (null === $toolLaunch) { |
||||||
|
header('Location: '.api_get_course_url()); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$course = api_get_course_entity(); |
||||||
|
$session = api_get_session_entity(); |
||||||
|
|
||||||
|
$cidReq = api_get_cidreq(); |
||||||
|
|
||||||
|
$plugin = XApiPlugin::create(); |
||||||
|
|
||||||
|
$table = new SortableTable( |
||||||
|
'tbl_xapi', |
||||||
|
function () use ($course, $session) { |
||||||
|
if ($session) { |
||||||
|
return CourseManager::get_student_list_from_course_code( |
||||||
|
$course->getCode(), |
||||||
|
true, |
||||||
|
$session->getId(), |
||||||
|
null, |
||||||
|
null, |
||||||
|
true, |
||||||
|
0, |
||||||
|
true |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return CourseManager::get_student_list_from_course_code( |
||||||
|
$course->getCode(), |
||||||
|
false, |
||||||
|
0, |
||||||
|
null, |
||||||
|
null, |
||||||
|
true, |
||||||
|
0, |
||||||
|
true |
||||||
|
); |
||||||
|
}, |
||||||
|
function ($start, $limit, $orderBy, $orderDir) use ($course, $session) { |
||||||
|
if ($session) { |
||||||
|
$students = CourseManager::get_student_list_from_course_code( |
||||||
|
$course->getCode(), |
||||||
|
true, |
||||||
|
$session->getId(), |
||||||
|
null, |
||||||
|
null, |
||||||
|
true, |
||||||
|
0, |
||||||
|
false, |
||||||
|
$start, |
||||||
|
$limit |
||||||
|
); |
||||||
|
} else { |
||||||
|
$students = CourseManager::get_student_list_from_course_code( |
||||||
|
$course->getCode(), |
||||||
|
false, |
||||||
|
0, |
||||||
|
null, |
||||||
|
null, |
||||||
|
true, |
||||||
|
0, |
||||||
|
false, |
||||||
|
$start, |
||||||
|
$limit |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return array_map( |
||||||
|
function (array $studentInfo) { |
||||||
|
return [ |
||||||
|
$studentInfo['firstname'], |
||||||
|
$studentInfo['lastname'], |
||||||
|
$studentInfo['id'], |
||||||
|
]; |
||||||
|
}, |
||||||
|
$students |
||||||
|
); |
||||||
|
} |
||||||
|
); |
||||||
|
$table->set_header(0, get_lang('FirstName'), false); |
||||||
|
$table->set_header(1, get_lang('LastName'), false); |
||||||
|
$table->set_header(2, get_lang('Attempts'), false, [], ['style' => 'width: 65%;']); |
||||||
|
$table->set_column_filter( |
||||||
|
2, |
||||||
|
function ($id) use ($toolLaunch) { |
||||||
|
return Display::button( |
||||||
|
"xapi_state_$id", |
||||||
|
get_lang('ShowAllAttempts'), |
||||||
|
[ |
||||||
|
'class' => 'btn btn-default btn_xapi_attempts', |
||||||
|
'data-student' => $id, |
||||||
|
'data-tool' => $toolLaunch->getId(), |
||||||
|
] |
||||||
|
); |
||||||
|
} |
||||||
|
); |
||||||
|
$table->set_additional_parameters( |
||||||
|
[ |
||||||
|
'id' => $toolLaunch->getId(), |
||||||
|
'cidReq' => $course->getCode(), |
||||||
|
'id_session' => $session ? $session->getId() : 0, |
||||||
|
] |
||||||
|
); |
||||||
|
|
||||||
|
// View |
||||||
|
$interbreadcrumb[] = [ |
||||||
|
'name' => $plugin->get_title(), |
||||||
|
'url' => 'list.php', |
||||||
|
]; |
||||||
|
|
||||||
|
$htmlHeadXtra[] = "<script> |
||||||
|
$(function () { |
||||||
|
$('.btn_xapi_attempts').on('click', function () { |
||||||
|
var \$self = $(this); |
||||||
|
|
||||||
|
\$self |
||||||
|
.prop('disabled', true) |
||||||
|
.html('<em class=\"fa fa-spinner fa-pulse\"></em> ".get_lang('Loading')."'); |
||||||
|
|
||||||
|
$.post( |
||||||
|
'stats_attempts.ajax.php?' + _p.web_cid_query, |
||||||
|
\$self.data(), |
||||||
|
function (response) { |
||||||
|
\$self.parent().html(response); |
||||||
|
} |
||||||
|
); |
||||||
|
}); |
||||||
|
}) |
||||||
|
</script>"; |
||||||
|
|
||||||
|
$actions = Display::url( |
||||||
|
Display::return_icon('back.png', get_lang('Back'), [], ICON_SIZE_MEDIUM), |
||||||
|
"list.php?$cidReq" |
||||||
|
); |
||||||
|
|
||||||
|
$view = new Template($toolLaunch->getTitle()); |
||||||
|
$view->assign( |
||||||
|
'actions', |
||||||
|
Display::toolbarAction('xapi_actions', [$actions]) |
||||||
|
); |
||||||
|
$view->assign('header', $toolLaunch->getTitle()); |
||||||
|
$view->assign( |
||||||
|
'content', |
||||||
|
Display::page_subheader(get_lang('Reporting'), null, 'h4').PHP_EOL.$table->return_table() |
||||||
|
); |
||||||
|
$view->display_one_col_template(); |
||||||
@ -0,0 +1,118 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
use Chamilo\PluginBundle\Entity\XApi\ToolLaunch; |
||||||
|
use Symfony\Component\HttpFoundation\Request as HttpRequest; |
||||||
|
use Xabbuh\XApi\Common\Exception\NotFoundException; |
||||||
|
use Xabbuh\XApi\Common\Exception\XApiException; |
||||||
|
use Xabbuh\XApi\Model\Activity; |
||||||
|
use Xabbuh\XApi\Model\Agent; |
||||||
|
use Xabbuh\XApi\Model\InverseFunctionalIdentifier; |
||||||
|
use Xabbuh\XApi\Model\IRI; |
||||||
|
use Xabbuh\XApi\Model\State; |
||||||
|
|
||||||
|
require_once __DIR__.'/../../../main/inc/global.inc.php'; |
||||||
|
|
||||||
|
$request = HttpRequest::createFromGlobals(); |
||||||
|
|
||||||
|
$course = api_get_course_entity(); |
||||||
|
$session = api_get_session_entity(); |
||||||
|
|
||||||
|
if (!$request->isXmlHttpRequest() |
||||||
|
|| !api_is_allowed_to_edit() |
||||||
|
|| !$course |
||||||
|
) { |
||||||
|
echo Display::return_message(get_lang('NotAllowed'), 'error'); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$plugin = XApiPlugin::create(); |
||||||
|
$em = Database::getManager(); |
||||||
|
|
||||||
|
$toolLaunch = $em->find( |
||||||
|
ToolLaunch::class, |
||||||
|
$request->request->getInt('tool') |
||||||
|
); |
||||||
|
|
||||||
|
$student = api_get_user_entity($request->request->getInt('student')); |
||||||
|
|
||||||
|
if (!$toolLaunch || !$student) { |
||||||
|
echo Display::return_message(get_lang('NoResults'), 'error'); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$userIsSubscribedToCourse = CourseManager::is_user_subscribed_in_course( |
||||||
|
$student->getId(), |
||||||
|
$course->getCode(), |
||||||
|
!!$session, |
||||||
|
$session ? $session->getId() : 0 |
||||||
|
); |
||||||
|
|
||||||
|
if (!$userIsSubscribedToCourse) { |
||||||
|
echo Display::return_message(get_lang('NotAllowed'), 'error'); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$cidReq = api_get_cidreq(); |
||||||
|
|
||||||
|
$xApiStateClient = $plugin->getXApiStateClient( |
||||||
|
$toolLaunch->getLrsUrl(), |
||||||
|
$toolLaunch->getLrsAuthUsername(), |
||||||
|
$toolLaunch->getLrsAuthPassword() |
||||||
|
); |
||||||
|
|
||||||
|
$activity = new Activity( |
||||||
|
IRI::fromString($toolLaunch->getActivityId()) |
||||||
|
); |
||||||
|
|
||||||
|
$actor = new Agent( |
||||||
|
InverseFunctionalIdentifier::withMbox( |
||||||
|
IRI::fromString('mailto:'.$student->getEmail()) |
||||||
|
), |
||||||
|
$student->getCompleteName() |
||||||
|
); |
||||||
|
|
||||||
|
try { |
||||||
|
$stateDocument = $xApiStateClient->getDocument( |
||||||
|
new State( |
||||||
|
$activity, |
||||||
|
$actor, |
||||||
|
$plugin->generateIri('tool-'.$toolLaunch->getId(), 'state')->getValue() |
||||||
|
) |
||||||
|
); |
||||||
|
} catch (NotFoundException $notFoundException) { |
||||||
|
echo Display::return_message($notFoundException->getMessage(), 'error'); |
||||||
|
exit; |
||||||
|
} catch (XApiException $exception) { |
||||||
|
echo Display::return_message($exception->getMessage(), 'error'); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
if ($stateDocument) { |
||||||
|
$table = new HTML_Table(['class' => 'data_table table table-bordered']); |
||||||
|
$table->setHeaderContents(0, 0, $plugin->get_lang('ActivityFirstLaunch')); |
||||||
|
$table->setHeaderContents(0, 1, $plugin->get_lang('ActivityLastLaunch')); |
||||||
|
|
||||||
|
$i = 1; |
||||||
|
|
||||||
|
foreach ($stateDocument->getData()->getData() as $attempt) { |
||||||
|
$firstLaunch = api_convert_and_format_date( |
||||||
|
$attempt[XApiPlugin::STATE_FIRST_LAUNCH], |
||||||
|
DATE_TIME_FORMAT_LONG |
||||||
|
); |
||||||
|
$lastLaunch = api_convert_and_format_date( |
||||||
|
$attempt[XApiPlugin::STATE_LAST_LAUNCH], |
||||||
|
DATE_TIME_FORMAT_LONG |
||||||
|
); |
||||||
|
|
||||||
|
$table->setCellContents($i, 0, $firstLaunch); |
||||||
|
$table->setCellContents($i, 1, $lastLaunch); |
||||||
|
|
||||||
|
$i++; |
||||||
|
} |
||||||
|
|
||||||
|
$table->updateColAttributes(0, ['class' => 'text-center']); |
||||||
|
$table->updateColAttributes(1, ['class' => 'text-center']); |
||||||
|
|
||||||
|
$table->display(); |
||||||
|
} |
||||||
Loading…
Reference in new issue