* @author Julio Montoya */ class CourseSelectForm { /** * @return array */ public static function getResourceTitleList() { $list = []; $list[RESOURCE_LEARNPATH_CATEGORY] = get_lang('Courses').' '.get_lang('Category'); $list[RESOURCE_ASSET] = get_lang('Assets'); $list[RESOURCE_GRADEBOOK] = get_lang('Assessments'); $list[RESOURCE_EVENT] = get_lang('Events'); $list[RESOURCE_ANNOUNCEMENT] = get_lang('Announcements'); $list[RESOURCE_DOCUMENT] = get_lang('Documents'); $list[RESOURCE_LINK] = get_lang('Links'); $list[RESOURCE_COURSEDESCRIPTION] = get_lang('Course Description'); $list[RESOURCE_FORUM] = get_lang('Forums'); $list[RESOURCE_FORUMCATEGORY] = get_lang('Forum category'); $list[RESOURCE_QUIZ] = get_lang('Tests'); $list[RESOURCE_TEST_CATEGORY] = get_lang('Questions category'); $list[RESOURCE_LEARNPATH] = get_lang('ToolCourses'); $list[RESOURCE_LEARNPATH_CATEGORY] = get_lang('CoursesCategory'); $list[RESOURCE_SCORM] = 'SCORM'; $list[RESOURCE_TOOL_INTRO] = get_lang('Tool introduction'); $list[RESOURCE_SURVEY] = get_lang('Survey'); $list[RESOURCE_GLOSSARY] = get_lang('Glossary'); $list[RESOURCE_WIKI] = get_lang('Group wiki'); $list[RESOURCE_THEMATIC] = get_lang('Thematic'); $list[RESOURCE_ATTENDANCE] = get_lang('Attendance'); $list[RESOURCE_WORK] = get_lang('Assignments'); return $list; } /** * Display the form. * * @param array $course * @param array $hidden_fields hidden fields to add to the form * @param bool $avoidSerialize the document array will be serialize. * This is used in the course_copy.php file * @param bool $avoidCourseInForm */ public static function display_form( $course, $hidden_fields = null, $avoidSerialize = false, $avoidCourseInForm = false ) { global $charset; ?> '; echo get_lang('Target course').' : '.$courseInfo['title'].' ('.$courseInfo['code'].') '.$sessionTitle; echo ''; } echo ''; echo '
'; echo '
'; echo ''; if (!empty($hidden_fields['destination_course']) && !empty($hidden_fields['origin_course']) && !empty($hidden_fields['destination_session']) && !empty($hidden_fields['origin_session']) ) { echo ''; echo ''; echo ''; echo ''; } $forum_categories = []; $forums = []; $forum_topics = []; echo '

'; echo get_lang('Select resources'); echo '

'; echo Display::return_message(get_lang('Don\'t forget to select the media files if your resource need it')); $resource_titles = self::getResourceTitleList(); $element_count = self::parseResources($resource_titles, $course->resources, true, true); // Fixes forum order if (!empty($forum_categories)) { $type = RESOURCE_FORUMCATEGORY; echo '
'; echo ''; echo ''.$resource_titles[RESOURCE_FORUM].'
'; echo '
'; echo '
    '; foreach ($forum_categories as $forum_category_id => $forum_category) { echo '
  • '; echo ''; echo '
  • '; if (isset($forums[$forum_category_id])) { $my_forums = $forums[$forum_category_id]; echo '
      '; foreach ($my_forums as $forum_id => $forum) { echo '
    • '; echo ''; echo '
    • '; if (isset($forum_topics[$forum_id])) { $my_forum_topics = $forum_topics[$forum_id]; if (!empty($my_forum_topics)) { echo '
        '; foreach ($my_forum_topics as $topic_id => $topic) { echo '
      • '; echo ''; echo '
      • '; } echo '
      '; } } } echo '
    '; } echo '
    '; } echo '
'; echo '
'; echo ''; } if ($avoidSerialize) { /*Documents are avoided due the huge amount of memory that the serialize php function "eats" (when there are directories with hundred/thousand of files) */ // this is a known issue of serialize $course->resources['document'] = null; } if (false === $avoidCourseInForm) { /** @var Course $course */ $courseSerialized = base64_encode(Course::serialize($course)); echo ''; } if (is_array($hidden_fields)) { foreach ($hidden_fields as $key => $value) { echo ''; } } $recycleOption = isset($_POST['recycle_option']) ? true : false; if (empty($element_count)) { echo Display::return_message(get_lang('No data available'), 'warning'); } else { if (!empty($hidden_fields['destination_session'])) { echo '
'; } else { if ($recycleOption) { echo '
'; } else { echo '
'; } } } self::display_hidden_quiz_questions($course); self::display_hidden_scorm_directories($course); echo '
'; echo '
'; echo '
'; } /** * @param array $resource_titles * @param array $resourceList * @param bool $showHeader * @param bool $showItems * * @return int */ public static function parseResources( $resource_titles, $resourceList, $showHeader = true, $showItems = true ) { $element_count = 0; foreach ($resourceList as $type => $resources) { if (count($resources) > 0) { switch ($type) { // Resources to avoid case RESOURCE_FORUMCATEGORY: foreach ($resources as $id => $resource) { $forum_categories[$id] = $resource; } $element_count++; break; case RESOURCE_FORUM: foreach ($resources as $id => $resource) { $forums[$resource->obj->forum_category][$id] = $resource; } $element_count++; break; case RESOURCE_FORUMTOPIC: foreach ($resources as $id => $resource) { $forum_topics[$resource->obj->forum_id][$id] = $resource; } $element_count++; break; case RESOURCE_LINKCATEGORY: case RESOURCE_FORUMPOST: case RESOURCE_QUIZQUESTION: case RESOURCE_SURVEYQUESTION: case RESOURCE_SURVEYINVITATION: case RESOURCE_SCORM: break; default: if ($showHeader) { echo '
'; echo ''; echo ''.$resource_titles[$type].''; echo '
'; echo '
'; } if (RESOURCE_LEARNPATH == $type) { echo Display::return_message( get_lang( 'ToExportCoursesWithQuizYouHaveToSelectQuiz' ), 'warning' ); echo Display::return_message( get_lang( 'IfYourLPsHaveAudioFilesIncludedYouShouldSelectThemFromTheDocuments' ), 'warning' ); } if (RESOURCE_DOCUMENT == $type) { if ('none' != api_get_setting('show_glossary_in_documents')) { echo Display::return_message( get_lang( 'ToExportDocumentsWithGlossaryYouHaveToSelectGlossary' ), 'warning' ); } } if (RESOURCE_QUIZ == $type) { echo Display::return_message( get_lang( 'IfYourQuizHaveHotspotQuestionsIncludedYouShouldSelectTheImagesFromTheDocuments' ), 'warning' ); } if ($showItems) { echo '
'; echo '
'; echo "".get_lang('All').''; echo "".get_lang('none').''; echo '
'; echo '
    '; foreach ($resources as $id => $resource) { if ($resource) { echo '
  • '; // Event obj in 1.9.x in 1.10.x the class is CalendarEvent Resource::setClassType($resource); echo ''; echo '
  • '; } } echo '
'; echo '
'; } if ($showHeader) { echo '
'; echo ''; } $element_count++; } } } return $element_count; } /** * @param $course */ public static function display_hidden_quiz_questions($course) { if (is_array($course->resources)) { foreach ($course->resources as $type => $resources) { if (!empty($resources) && count($resources) > 0) { switch ($type) { case RESOURCE_QUIZQUESTION: foreach ($resources as $id => $resource) { echo ''; } break; } } } } } /** * @param $course */ public static function display_hidden_scorm_directories($course) { if (is_array($course->resources)) { foreach ($course->resources as $type => $resources) { if (!empty($resources) && count($resources) > 0) { switch ($type) { case RESOURCE_SCORM: foreach ($resources as $id => $resource) { echo ''; } break; } } } } } /** * Get the posted course. * * @param string $from who calls the function? * It can be copy_course, create_backup, import_backup or recycle_course * @param int $session_id * @param string $course_code * @param Course $postedCourse * * @return Course The course-object with all resources selected by the user * in the form given by display_form(...) */ public static function get_posted_course($from = '', $session_id = 0, $course_code = '', $postedCourse = null) { $course = $postedCourse; if (empty($postedCourse)) { $cb = new CourseBuilder(); $postResource = isset($_POST['resource']) ? $_POST['resource'] : []; $course = $cb->build(0, null, false, array_keys($postResource), $postResource); } if (empty($course)) { return false; } // Create the resource DOCUMENT objects // Loading the results from the checkboxes of ethe javascript $resource = isset($_POST['resource'][RESOURCE_DOCUMENT]) ? $_POST['resource'][RESOURCE_DOCUMENT] : null; $course_info = api_get_course_info($course_code); $table_doc = Database::get_course_table(TABLE_DOCUMENT); $table_prop = Database::get_course_table(TABLE_ITEM_PROPERTY); $course_id = $course_info['real_id']; /* Searching the documents resource that have been set to null because $avoidSerialize is true in the display_form() function*/ if ('copy_course' === $from) { if (is_array($resource)) { $resource = array_keys($resource); foreach ($resource as $resource_item) { $conditionSession = ''; if (!empty($session_id)) { $session_id = (int) $session_id; $conditionSession = ' AND d.session_id ='.$session_id; } $sql = 'SELECT d.id, d.path, d.comment, d.title, d.filetype, d.size FROM '.$table_doc.' d INNER JOIN '.$table_prop.' p ON (d.c_id = p.c_id) WHERE d.c_id = '.$course_id.' AND p.c_id = '.$course_id.' AND tool = \''.TOOL_DOCUMENT.'\' AND p.ref = d.id AND p.visibility != 2 AND d.id = '.$resource_item.$conditionSession.' ORDER BY path'; $db_result = Database::query($sql); while ($obj = Database::fetch_object($db_result)) { $doc = new Document( $obj->id, $obj->path, $obj->comment, $obj->title, $obj->filetype, $obj->size ); if ($doc) { $course->add_resource($doc); // adding item property $sql = "SELECT * FROM $table_prop WHERE c_id = $course_id AND tool = '".RESOURCE_DOCUMENT."' AND ref = $resource_item "; $res = Database::query($sql); $all_properties = []; while ($item_property = Database::fetch_array($res, 'ASSOC')) { $all_properties[] = $item_property; } $course->resources[RESOURCE_DOCUMENT][$resource_item]->item_properties = $all_properties; } } } } } if (is_array($course->resources)) { foreach ($course->resources as $type => $resources) { switch ($type) { case RESOURCE_SURVEYQUESTION: foreach ($resources as $id => $obj) { if (isset($_POST['resource'][RESOURCE_SURVEY]) && is_array($_POST['resource'][RESOURCE_SURVEY]) && !in_array($obj->survey_id, array_keys($_POST['resource'][RESOURCE_SURVEY])) ) { unset($course->resources[$type][$id]); } } break; case RESOURCE_FORUMTOPIC: case RESOURCE_FORUMPOST: //Add post from topic if (RESOURCE_FORUMTOPIC == $type) { $posts_to_save = []; $posts = $course->resources[RESOURCE_FORUMPOST]; foreach ($resources as $thread_id => $obj) { if (!isset($_POST['resource'][RESOURCE_FORUMTOPIC][$thread_id])) { unset($course->resources[RESOURCE_FORUMTOPIC][$thread_id]); continue; } $forum_id = $obj->obj->forum_id; $title = $obj->obj->thread_title; foreach ($posts as $post_id => $post) { if ($post->obj->thread_id == $thread_id && $forum_id == $post->obj->forum_id && $title == $post->obj->post_title ) { $posts_to_save[] = $post_id; } } } if (!empty($posts)) { foreach ($posts as $post_id => $post) { if (!in_array($post_id, $posts_to_save)) { unset($course->resources[RESOURCE_FORUMPOST][$post_id]); } } } } break; case RESOURCE_LEARNPATH: $lps = isset($_POST['resource'][RESOURCE_LEARNPATH]) ? $_POST['resource'][RESOURCE_LEARNPATH] : null; if (!empty($lps)) { foreach ($lps as $id => $obj) { $lp_resource = $course->resources[RESOURCE_LEARNPATH][$id]; if (isset($lp_resource) && !empty($lp_resource) && isset($lp_resource->items)) { foreach ($lp_resource->items as $item) { switch ($item['item_type']) { //Add links added in a LP see #5760 case 'link': $_POST['resource'][RESOURCE_LINK][$item['path']] = 1; break; } } } } } // no break case RESOURCE_LINKCATEGORY: case RESOURCE_FORUMCATEGORY: case RESOURCE_QUIZQUESTION: case RESOURCE_DOCUMENT: // Mark folders to import which are not selected by the user to import, // but in which a document was selected. $documents = isset($_POST['resource'][RESOURCE_DOCUMENT]) ? $_POST['resource'][RESOURCE_DOCUMENT] : null; if (!empty($resources) && is_array($resources)) { foreach ($resources as $id => $obj) { if (isset($obj->file_type) && 'folder' === $obj->file_type && !isset($_POST['resource'][RESOURCE_DOCUMENT][$id]) && is_array($documents) ) { foreach ($documents as $id_to_check => $post_value) { if (isset($resources[$id_to_check])) { $obj_to_check = $resources[$id_to_check]; $shared_path_part = substr( $obj_to_check->path, 0, strlen($obj->path) ); if ($id_to_check != $id && $obj->path == $shared_path_part) { $_POST['resource'][RESOURCE_DOCUMENT][$id] = 1; break; } } } } } } // no break default: if (!empty($resources) && is_array($resources)) { foreach ($resources as $id => $obj) { $resource_is_used_elsewhere = $course->is_linked_resource($obj); // check if document is in a quiz (audio/video) if (RESOURCE_DOCUMENT == $type && $course->has_resources(RESOURCE_QUIZ)) { foreach ($course->resources[RESOURCE_QUIZ] as $quiz) { $quiz = $quiz->obj; if (isset($quiz->media) && $quiz->media == $id) { $resource_is_used_elsewhere = true; } } } // quiz question can be, not attached to an exercise if (RESOURCE_QUIZQUESTION != $type) { if (!isset($_POST['resource'][$type][$id]) && !$resource_is_used_elsewhere) { unset($course->resources[$type][$id]); } } } } } } } return $course; } /** * Display the form session export. * * @param array $list_course * @param array $hidden_fields hidden fields to add to the form * @param bool $avoidSerialize the document array will be serialize. This is used in the course_copy.php file */ public static function display_form_session_export( $list_course, $hidden_fields = null, $avoidSerialize = false ) { ?> '; echo get_lang('Target course').' : '.$courseInfo['title'].$sessionTitle; echo ''; } echo ''; $icon = Display::returnIconPath('progress_bar.gif'); echo '
'; echo '
'; echo ''; foreach ($list_course as $course) { foreach ($course->resources as $type => $resources) { if (count($resources) > 0) { echo '
code'".');">'; echo ''; echo ' '.$course->code.'
'; echo '
'; echo '
'; echo ''; foreach ($resources as $id => $resource) { echo ''; } echo '
'; echo '
'; echo ''; } } } if ($avoidSerialize) { // Documents are avoided due the huge amount of memory that the serialize php // function "eats" (when there are directories with hundred/thousand of files) // this is a known issue of serialize $course->resources['document'] = null; } echo ''; if (is_array($hidden_fields)) { foreach ($hidden_fields as $key => $value) { echo "\n"; echo ''; } } echo '
'; self::display_hidden_quiz_questions($course); self::display_hidden_scorm_directories($course); echo '
'; echo '
'; echo '
'; } }