You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
9.2 KiB
307 lines
9.2 KiB
<?php
|
|
/* For licensing terms, see /license.txt */
|
|
|
|
use Chamilo\PluginBundle\Entity\H5pImport\H5pImport;
|
|
use Chamilo\PluginBundle\Entity\H5pImport\H5pImportLibrary;
|
|
use Chamilo\PluginBundle\Entity\H5pImport\H5pImportResults;
|
|
use Doctrine\ORM\Tools\SchemaTool;
|
|
use Doctrine\ORM\Tools\ToolsException;
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
|
|
/**
|
|
* Define the H5pImportPlugin class as an extension of Plugin
|
|
* install/uninstall the plugin.
|
|
*/
|
|
class H5pImportPlugin extends Plugin
|
|
{
|
|
public const TBL_H5P_IMPORT = 'plugin_h5p_import';
|
|
public const TBL_H5P_IMPORT_LIBRARY = 'plugin_h5p_import_library';
|
|
public const TBL_H5P_IMPORT_RESULTS = 'plugin_h5p_import_results';
|
|
|
|
protected function __construct()
|
|
{
|
|
$settings = [
|
|
'tool_enable' => 'boolean',
|
|
'frame' => 'boolean',
|
|
'embed' => 'boolean',
|
|
'copyright' => 'boolean',
|
|
'icon' => 'boolean',
|
|
];
|
|
|
|
parent::__construct(
|
|
'0.1',
|
|
'Borja Sanchez',
|
|
$settings
|
|
);
|
|
}
|
|
|
|
public static function create(): ?H5pImportPlugin
|
|
{
|
|
static $result = null;
|
|
|
|
return $result ? $result : $result = new self();
|
|
}
|
|
|
|
/**
|
|
* Updates and returns the total duration in the view of an H5P learning path item in a course.
|
|
*
|
|
* @param int $lpItemId The ID of the learning path item
|
|
* @param int $userId The user ID
|
|
*
|
|
* @return int The updated total duration in the learning path item view
|
|
*/
|
|
public static function fixTotalTimeInLpItemView(
|
|
int $lpItemId,
|
|
int $userId
|
|
): int {
|
|
$lpItemViewTable = Database::get_course_table(TABLE_LP_ITEM_VIEW);
|
|
|
|
$sql = "SELECT iid, score
|
|
FROM $lpItemViewTable
|
|
WHERE
|
|
iid = $lpItemId
|
|
ORDER BY view_count DESC
|
|
LIMIT 1";
|
|
$responseItemView = Database::query($sql);
|
|
$lpItemView = Database::fetch_array($responseItemView);
|
|
|
|
// Get the total execution duration of the user in the learning path item view
|
|
$sql = 'SELECT SUM(total_time) AS exe_duration
|
|
FROM plugin_h5p_import_results
|
|
WHERE
|
|
user_id = '.$userId.' AND
|
|
c_lp_item_view_id = '.$lpItemView['iid'].
|
|
' ORDER BY total_time DESC';
|
|
$sumScoreResult = Database::query($sql);
|
|
$durationRow = Database::fetch_array($sumScoreResult, 'ASSOC');
|
|
|
|
if (!empty($durationRow['exe_duration'])) {
|
|
// Update the total duration in the learning path item view
|
|
$sqlUpdate = 'UPDATE '.$lpItemViewTable.'
|
|
SET total_time = '.$durationRow['exe_duration'].'
|
|
WHERE iid = '.$lpItemView['iid'];
|
|
Database::query($sqlUpdate);
|
|
|
|
return (int) $durationRow['exe_duration'];
|
|
} else {
|
|
// Update c_lp_item_view status
|
|
$sqlUpdate = 'UPDATE '.$lpItemViewTable.'
|
|
SET status = "not attempted",
|
|
total_time = 0
|
|
WHERE iid = '.$lpItemView['iid'];
|
|
Database::query($sqlUpdate);
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public function getToolTitle(): string
|
|
{
|
|
$title = $this->get_lang('plugin_title');
|
|
|
|
if (!empty($title)) {
|
|
return $title;
|
|
}
|
|
|
|
return $this->get_title();
|
|
}
|
|
|
|
/**
|
|
* @throws ToolsException
|
|
*/
|
|
public function install()
|
|
{
|
|
$em = Database::getManager();
|
|
if ($em->getConnection()
|
|
->getSchemaManager()
|
|
->tablesExist(
|
|
[
|
|
self::TBL_H5P_IMPORT,
|
|
self::TBL_H5P_IMPORT_LIBRARY,
|
|
self::TBL_H5P_IMPORT_RESULTS,
|
|
]
|
|
)
|
|
) {
|
|
return;
|
|
}
|
|
|
|
$schemaTool = new SchemaTool($em);
|
|
$schemaTool->createSchema(
|
|
[
|
|
$em->getClassMetadata(H5pImport::class),
|
|
$em->getClassMetadata(H5pImportLibrary::class),
|
|
$em->getClassMetadata(H5pImportResults::class),
|
|
]
|
|
);
|
|
$this->addCourseTools();
|
|
}
|
|
|
|
public function addCourseTool(int $courseId)
|
|
{
|
|
// The $link param is set to "../plugin" as a hack to link correctly to the plugin URL in course tool.
|
|
// Otherwise, the link en the course tool will link to "/main/" URL.
|
|
$this->createLinkToCourseTool(
|
|
$this->get_lang('plugin_title'),
|
|
$courseId,
|
|
'plugin_h5p_import.png',
|
|
'../plugin/h5pimport/start.php',
|
|
0,
|
|
'authoring'
|
|
);
|
|
}
|
|
|
|
public function uninstall()
|
|
{
|
|
$em = Database::getManager();
|
|
|
|
if (!$em->getConnection()
|
|
->getSchemaManager()
|
|
->tablesExist(
|
|
[
|
|
self::TBL_H5P_IMPORT,
|
|
self::TBL_H5P_IMPORT_LIBRARY,
|
|
self::TBL_H5P_IMPORT_RESULTS,
|
|
]
|
|
)
|
|
) {
|
|
return;
|
|
}
|
|
|
|
$schemaTool = new SchemaTool($em);
|
|
$schemaTool->dropSchema(
|
|
[
|
|
$em->getClassMetadata(H5pImport::class),
|
|
$em->getClassMetadata(H5pImportLibrary::class),
|
|
$em->getClassMetadata(H5pImportResults::class),
|
|
]
|
|
);
|
|
$this->deleteCourseToolLinks();
|
|
$this->removeH5pDirectories();
|
|
}
|
|
|
|
/**
|
|
* Perform actions after configuring the H5P import plugin.
|
|
*
|
|
* @return H5pImportPlugin The H5P import plugin instance.
|
|
*/
|
|
public function performActionsAfterConfigure(): H5pImportPlugin
|
|
{
|
|
$this->deleteCourseToolLinks();
|
|
|
|
if ('true' === $this->get('tool_enable')) {
|
|
$this->addCourseTools();
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the view URL for an H5P import.
|
|
*
|
|
* @param H5pImport $h5pImport The H5P import object.
|
|
*
|
|
* @return string The view URL for the H5P import.
|
|
*/
|
|
public function getViewUrl(H5pImport $h5pImport): string
|
|
{
|
|
return api_get_path(WEB_PLUGIN_PATH).'h5pimport/view.php?id='.$h5pImport->getIid().'&'.api_get_cidreq();
|
|
}
|
|
|
|
/**
|
|
* Generates the LP resource block for H5P imports.
|
|
*
|
|
* @param int $lpId The LP ID.
|
|
*
|
|
* @return string The HTML for the LP resource block.
|
|
*/
|
|
public function getLpResourceBlock(int $lpId): string
|
|
{
|
|
$cidReq = api_get_cidreq(true, true, 'lp');
|
|
$webPath = api_get_path(WEB_PLUGIN_PATH).'h5pimport/';
|
|
$course = api_get_course_entity();
|
|
$session = api_get_session_entity();
|
|
|
|
$tools = Database::getManager()
|
|
->getRepository(H5pImport::class)
|
|
->findBy(['course' => $course, 'session' => $session]);
|
|
|
|
$importIcon = Display::return_icon('plugin_h5p_import_upload.png');
|
|
$moveIcon = Display::url(
|
|
Display::return_icon('move_everywhere.png', get_lang('Move'), [], ICON_SIZE_TINY),
|
|
'#',
|
|
['class' => 'moved']
|
|
);
|
|
|
|
$return = '<ul class="lp_resource">';
|
|
$return .= '<li class="lp_resource_element">';
|
|
$return .= $importIcon;
|
|
$return .= Display::url(
|
|
get_lang('Import'),
|
|
$webPath."start.php?action=add&$cidReq&".http_build_query(['lp_id' => $lpId])
|
|
);
|
|
$return .= '</li>';
|
|
|
|
/** @var H5pImport $tool */
|
|
foreach ($tools as $tool) {
|
|
$toolAnchor = Display::url(
|
|
Security::remove_XSS($tool->getName()),
|
|
api_get_self()."?$cidReq&"
|
|
.http_build_query(
|
|
['action' => 'add_item', 'type' => TOOL_H5P, 'file' => $tool->getIid(), 'lp_id' => $lpId]
|
|
),
|
|
['class' => 'moved']
|
|
);
|
|
|
|
$return .= Display::tag(
|
|
'li',
|
|
$moveIcon.$importIcon.$toolAnchor,
|
|
[
|
|
'class' => 'lp_resource_element',
|
|
'data_id' => $tool->getIid(),
|
|
'data_type' => TOOL_H5P,
|
|
'title' => $tool->getName(),
|
|
]
|
|
);
|
|
}
|
|
|
|
$return .= '</ul>';
|
|
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Add course tools for all courses.
|
|
*/
|
|
private function addCourseTools(): void
|
|
{
|
|
$courses = Database::getManager()
|
|
->createQuery('SELECT c.id FROM ChamiloCoreBundle:Course c')
|
|
->getResult();
|
|
|
|
foreach ($courses as $course) {
|
|
$this->addCourseTool($course['id']);
|
|
}
|
|
}
|
|
|
|
private function deleteCourseToolLinks()
|
|
{
|
|
Database::getManager()
|
|
->createQuery('DELETE FROM ChamiloCourseBundle:CTool t WHERE t.category = :category AND t.link LIKE :link')
|
|
->execute(['category' => 'authoring', 'link' => '../plugin/h5pimport/start.php%']);
|
|
}
|
|
|
|
/**
|
|
* Removes H5P directories for all courses.
|
|
*/
|
|
private function removeH5pDirectories(): void
|
|
{
|
|
$fs = new Filesystem();
|
|
$table = Database::get_main_table(TABLE_MAIN_COURSE);
|
|
$sql = "SELECT id FROM $table ORDER BY id";
|
|
$res = Database::query($sql);
|
|
while ($row = Database::fetch_assoc($res)) {
|
|
$courseInfo = api_get_course_info_by_id($row['id']);
|
|
$fs->remove($courseInfo['course_sys_path'].'/h5p');
|
|
}
|
|
}
|
|
}
|
|
|