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