Page 1 of 1

Intercettare l'evento di fine corso

Posted: Tue Feb 12, 2019 3:22 pm
by lgreco82
E' possibile intercettare l'evento di fine corso per poter eseguire del codice custom?

Grazie,
Luca

Re: Intercettare l'evento di fine corso

Posted: Tue Feb 12, 2019 4:49 pm
by lgreco82
Una soluzione da poter integrare nella nuova versione potrebbe essere la seguente?

Nel file /appLms/lib/lib.stats.php:

......
296: //increment coursecompleted if this course is in a coursepath
297: require_once(_lms_.'/lib/lib.coursepath.php');
298: $cpmodel = new CoursePath_Manager();
299: $cpmodel->assignComplete($idCourse, $idUser);
300:
301: courseCompletedEvent($idUser, $idCourse, date("Y-m-d H:i:s",time()));

302: }
303: return true;
304:}
305:
306:function courseCompletedEvent($idUser, $idCourse, $completeDate) {
307:
308: require_once(_lms_.'/lib/lib.course.php');
309: require_once(_base_.'/lib/lib.eventmanager.php');
310:
311: $event =& DoceboEventManager::newEvent('UserCourseCompleted', 'status', 'completed', '1', 'Course Completed');
312:
313: $event->deleteOldProperty();
314: $event->setProperty('idUser', $idUser);
315: $event->setProperty('idCourse', $idCourse);
316: $event->setProperty('completeDate', $completeDate);
317:
318: DoceboEventManager::dispatch($event);
319:}

320:
321:?>


Creazione del nuovo file /appCore/lib/lib.coursecompletednotifier.php che fondamentalmente non fa niente ma così si può fare l'override da customscripts:

<?php defined("IN_FORMA") or die('Direct access is forbidden.');

require_once(_base_.'/lib/lib.event.php' );

/**
* This is the class for ClassEvents in Docebo
*
* @package admin-core
* @subpackage event
* @version $Id: lib.coursecompletednotifier.php 2019-02-12 15:44:42Z luca $
*/
class DoceboCourseCompletedNotifier extends DoceboEventConsumer {

function _getConsumerName() {
return "DoceboCourseCompletedNotifier";
}

function actionEvent( &$event ) {

/*require_once(_lms_.'/lib/lib.course.php');
require_once($GLOBALS['where_lms'].'/lib/lib.subscribe.php');

parent::actionEvent($event);

$idUser = $event->getProperty('idUser');
$idCourse = $event->getProperty('idCourse');
$completeDate = $event->getProperty('completeDate');

$course = new DoceboCourse($idCourse);
$acl_man =& Docebo::user()->getACLManager();*/

return true;
}
}

?>


Su MySql sarebbero da aggiungere i seguenti record:

In core_event_class: INSERT INTO core_event_class (idClass, class, platform, description) VALUES (44, 'UserCourseCompleted', 'lms-a', '');
In core_event_consumer: INSERT INTO core_event_consumer (idConsumer, consumer_class, consumer_file) VALUES (6, 'DoceboCourseCompletedNotifier', '/lib/lib.coursecompletednotifier.php');
In core_event_consumer_class: INSERT INTO core_event_consumer (idConsumer, idClass) VALUES (6, 44);

Sarebbe possibile sapere se risulta essere una soluzione percorribile e soprattutto performante e se fosse possibile integrarla nelle prossime release così da non dover effettuare customizzazioni al codice core?

Grazie,
Luca

Re: Intercettare l'evento di fine corso

Posted: Wed Feb 13, 2019 2:38 pm
by canelli
Ciao Luca

la tua proposta è interessante .

ti segnalo che con la 2.0 è già stato introdotto un gestore di eventi / hook e sono stati inseriti diversi eventi nel sistema a cui funzioni esterne possono attaccarsi per eseguire codice custom .
con la 2.2 il sistema viene ulteriormente potenziato, sono meglio definiti gli standard degli eventi sollevati , gil numero di eventi segnalati aumenta

Claudio

Re: Intercettare l'evento di fine corso

Posted: Wed Feb 13, 2019 2:49 pm
by lgreco82
Ciao Claudio,
purtroppo posso solo scaricare la 2.0 e in quella guardando il codice ho visto che ci sono degli Events nello specifico quelli in appLms/Events/Lms ma non ho trovato nulla che si riferisse alla conclusione del corso.
Inoltre sarebbe possibile avere qualche delucidazione su come intercettarli per poter eseguire codice custom magari con un esempio?

Grazie,
Luca