XAPI: Add list by attempt in tincan launch - refs BT#16742

pull/3680/head
Angel Fernando Quiroz Campos 5 years ago
parent 9f74129d8b
commit 462c472e01
  1. 163
      plugin/xapi/launch/stats.php
  2. 36
      plugin/xapi/launch/stats_attempts.ajax.php
  3. 107
      plugin/xapi/launch/stats_statements.ajax.php
  4. 29
      plugin/xapi/src/XApiPlugin.php

@ -30,70 +30,78 @@ $cidReq = api_get_cidreq();
$plugin = XApiPlugin::create();
$table = new SortableTable(
'tbl_xapi',
function () use ($course, $session) {
return CourseManager::get_student_list_from_course_code(
$course->getCode(),
!!$session,
$session ? $session->getId() : 0,
null,
null,
true,
0,
true
);
},
function ($start, $limit, $orderBy, $orderDir) use ($course, $session) {
$students = CourseManager::get_student_list_from_course_code(
$course->getCode(),
!!$session,
$session ? $session->getId() : 0,
null,
null,
true,
0,
false,
$start,
$limit
);
return array_map(
function (array $studentInfo) {
return [
$studentInfo['firstname'],
$studentInfo['lastname'],
$studentInfo['id'],
];
},
$students
);
}
$length = 20;
$page = $request->query->getInt('page', 1);
$start = ($page - 1) * $length;
$countStudentList = CourseManager::get_student_list_from_course_code(
$course->getCode(),
!!$session,
$session ? $session->getId() : 0,
null,
null,
true,
0,
true
);
$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(),
]
);
$statsUrl = api_get_self().'?'.api_get_cidreq().'&id='.$toolLaunch->getId();
$paginator = new \Knp\Component\Pager\Paginator();
$pagination = $paginator->paginate([]);
$pagination->setTotalItemCount($countStudentList);
$pagination->setItemNumberPerPage($length);
$pagination->setCurrentPageNumber($page);
$pagination->renderer = function ($data) use ($statsUrl) {
$render = '';
if ($data['pageCount'] > 1) {
$render = '<ul class="pagination">';
for ($i = 1; $i <= $data['pageCount']; $i++) {
$pageContent = '<li><a href="'.$statsUrl.'&page='.$i.'">'.$i.'</a></li>';
if ($data['current'] == $i) {
$pageContent = '<li class="active"><a href="#" >'.$i.'</a></li>';
}
$render .= $pageContent;
}
$render .= '</ul>';
}
return $render;
};
$students = CourseManager::get_student_list_from_course_code(
$course->getCode(),
!!$session,
$session ? $session->getId() : 0,
null,
null,
true,
0,
false,
$start,
$length
);
$table->set_additional_parameters(
[
'id' => $toolLaunch->getId(),
'cidReq' => $course->getCode(),
'id_session' => $session ? $session->getId() : 0,
]
);
$content = '';
$content .= '<div class="xapi-students">';
foreach ($students as $studentInfo) {
$content .= Display::panelCollapse(
api_get_person_name($studentInfo['firstname'], $studentInfo['lastname']),
'',
"pnl-student-{$studentInfo['id']}",
[
'class' => 'pnl-student',
'data-student' => $studentInfo['id'],
'data-tool' => $toolLaunch->getId(),
],
"pnl-student-{$studentInfo['id']}-accordion",
"pnl-student-{$studentInfo['id']}-collapse",
false
);
}
$content .= '</div>';
$content .= $pagination;
// View
$interbreadcrumb[] = [
@ -103,18 +111,34 @@ $interbreadcrumb[] = [
$htmlHeadXtra[] = "<script>
$(function () {
$('.btn_xapi_attempts').on('click', function () {
var \$self = $(this);
$('.pnl-student').on('show.bs.collapse', function (e) {
var \$self = \$(this);
var \$body = \$self.find('.panel-body');
if (!\$self.data('loaded')) {
$.post(
'stats_attempts.ajax.php?' + _p.web_cid_query,
\$self.data(),
function (response) {
\$self.data('loaded', true);
\$body.html(response);
}
);
}
});
$('.xapi-students').on('click', '.btn_xapi_attempt_detail', function (e) {
e.preventDefault();
\$self
.prop('disabled', true)
var \$self = \$(this)
.addClass('disabled')
.html('<em class=\"fa fa-spinner fa-pulse\"></em> ".get_lang('Loading')."');
$.post(
'stats_attempts.ajax.php?' + _p.web_cid_query,
'stats_statements.ajax.php?' + _p.web_cid_query,
\$self.data(),
function (response) {
\$self.parent().html(response);
\$self.replaceWith(response);
}
);
});
@ -132,8 +156,5 @@ $view->assign(
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->assign('content', $content);
$view->display_one_col_template();

@ -88,14 +88,12 @@ try {
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'));
$content = '';
if ($stateDocument) {
$i = 1;
foreach ($stateDocument->getData()->getData() as $attempt) {
foreach ($stateDocument->getData()->getData() as $attemptId => $attempt) {
$firstLaunch = api_convert_and_format_date(
$attempt[XApiPlugin::STATE_FIRST_LAUNCH],
DATE_TIME_FORMAT_LONG
@ -105,14 +103,28 @@ if ($stateDocument) {
DATE_TIME_FORMAT_LONG
);
$table->setCellContents($i, 0, $firstLaunch);
$table->setCellContents($i, 1, $lastLaunch);
$content .= '<dl class="dl-horizontal">'
.'<dt>'.$plugin->get_lang('ActivityFirstLaunch').'</dt>'
.'<dd>'.$firstLaunch.'</dd>'
.'<dt>'.$plugin->get_lang('ActivityLastLaunch').'</dt>'
.'<dd>'.$lastLaunch.'</dd>'
.'</dl>'
.Display::toolbarButton(
get_lang('ShowAllAttempts'),
'#',
'th-list',
'default',
[
'class' => 'btn_xapi_attempt_detail',
'data-attempt' => $attemptId,
'data-tool' => $toolLaunch->getId(),
'style' => 'margin-bottom: 20px; margin-left: 180px;',
'role' => 'button',
]
);
$i++;
}
$table->updateColAttributes(0, ['class' => 'text-center']);
$table->updateColAttributes(1, ['class' => 'text-center']);
$table->display();
}
echo $content;

@ -0,0 +1,107 @@
<?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\XApiException;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\StatementsFilter;
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')
);
$attempt = $request->request->get('attempt');
if (!$toolLaunch || !$attempt) {
echo Display::return_message(get_lang('NoResults'), 'error');
exit;
}
$cidReq = api_get_cidreq();
$xapiStatementClient = $plugin->getXApiStatementClient();
$activity = new Activity(
IRI::fromString($toolLaunch->getActivityId())
);
$filter = new StatementsFilter();
$filter
->byRegistration($attempt);
try {
$result = $xapiStatementClient->getStatements($filter);
} catch (XApiException $xApiException) {
echo Display::return_message($xApiException->getMessage(), 'error');
exit;
} catch (Exception $exception) {
echo Display::return_message($exception->getMessage(), 'error');
exit;
}
$statements = $result->getStatements();
if (count($statements) <= 0) {
echo Display::return_message(get_lang('NoResults'), 'warning');
exit;
}
$table = new HTML_Table(['class' => 'table table-condensed table-bordered table-striped table-hover']);
$table->setHeaderContents(0, 0, get_lang('CreatedAt'));
$table->setHeaderContents(0, 1, $plugin->get_lang('Actor'));
$table->setHeaderContents(0, 2, $plugin->get_lang('Verb'));
$table->setHeaderContents(0, 3, $plugin->get_lang('ActivityId'));
$i = 1;
foreach ($statements as $statement) {
$timestampStored = $statement->getCreated() ? api_convert_and_format_date($statement->getCreated()) : '-';
$actor = $statement->getActor()->getName();
$verb = XApiPlugin::extractVerbInLanguage($statement->getVerb()->getDisplay(), 'es');
$activity = '';
$statementObject = $statement->getObject();
if ($statementObject instanceof Activity) {
if (null !== $statementObject->getDefinition()) {
$definition = $statementObject->getDefinition();
if (null !== $definition->getName()) {
$activity = XApiPlugin::extractVerbInLanguage($definition->getName(), 'es')
.'<br>';
}
}
$activity .= "<small>{$statementObject->getId()->getValue()}</small>";
}
$table->setCellContents($i, 0, $timestampStored);
$table->setCellContents($i, 1, $actor);
$table->setCellContents($i, 2, $verb);
$table->setCellContents($i, 3, $activity);
$i++;
}
$table->display();

@ -418,4 +418,33 @@ class XApiPlugin extends Plugin implements HookPluginInterface
return $tool;
}
/**
* @param \Xabbuh\XApi\Model\LanguageMap $languageMap
* @param string $language
*
* @return mixed|string
*/
public static function extractVerbInLanguage(\Xabbuh\XApi\Model\LanguageMap $languageMap, $language)
{
if (isset($languageMap[$language])) {
return $languageMap[$language];
}
$parts = explode('-', $language, 2);
if (count($parts) > 0) {
foreach ($languageMap->languageTags() as $languageTag) {
if (false !== strpos($languageTag, $parts[0])) {
return $languageMap[$languageTag];
}
}
}
if (isset($languageMap['und'])) {
return $languageMap['und'];
}
return array_pop($languageMap);
}
}

Loading…
Cancel
Save