'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 = ''; 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'); } } }