/** * Function rewritten based on old_add_item() from Yannick Warnier. Due the fact that users can decide where the item should come, I had to overlook this function and * I found it better to rewrite it. Old function is still available. Added also the possibility to add a description. * * @param int $parent * @param int $previous * @param string $type * @param int resource ID (ref) * @param string $title * @param string $description * @return int */ public function add_item($parent, $previous, $type = 'dokeos_chapter', $id, $title, $description, $prerequisites = 0, $max_time_allowed = 0) { $course_id = api_get_course_int_id(); if ($this->debug > 0) { error_log('New LP - In learnpath::add_item(' . $parent . ',' . $previous . ',' . $type . ',' . $id . ',' . $title . ')', 0); } $tbl_lp_item = Database::get_course_table(TABLE_LP_ITEM); $parent = intval($parent); $previous = intval($previous); $type = Database::escape_string($type); $id = intval($id); $max_time_allowed = Database::escape_string($max_time_allowed); if (empty($max_time_allowed)) { $max_time_allowed = 0; } $title = Database::escape_string($title); $description = Database::escape_string($description); $sql_count = "\tSELECT COUNT(id) AS num\n FROM {$tbl_lp_item}\n WHERE c_id = {$course_id} AND lp_id = " . $this->get_id() . " AND parent_item_id = " . $parent; $res_count = Database::query($sql_count); $row = Database::fetch_array($res_count); $num = $row['num']; if ($num > 0) { if ($previous == 0) { $sql = "SELECT id, next_item_id, display_order\n FROM " . $tbl_lp_item . "\n WHERE c_id = {$course_id} AND\n lp_id = " . $this->get_id() . " AND\n parent_item_id = " . $parent . " AND\n previous_item_id = 0 OR previous_item_id=" . $parent; $result = Database::query($sql); $row = Database::fetch_array($result); $tmp_previous = 0; $next = $row['id']; $display_order = 0; } else { $previous = (int) $previous; $sql = "SELECT id, previous_item_id, next_item_id, display_order\n\t\t\t\t\t\tFROM {$tbl_lp_item}\n WHERE c_id = {$course_id} AND lp_id = " . $this->get_id() . " AND id = " . $previous; $result = Database::query($sql); $row = Database::fetch_array($result); $tmp_previous = $row['id']; $next = $row['next_item_id']; $display_order = $row['display_order']; } } else { $tmp_previous = 0; $next = 0; $display_order = 0; } $new_item_id = -1; $id = Database::escape_string($id); if ($type == 'quiz') { $sql = 'SELECT SUM(ponderation) FROM ' . Database::get_course_table(TABLE_QUIZ_QUESTION) . ' as quiz_question INNER JOIN ' . Database::get_course_table(TABLE_QUIZ_TEST_QUESTION) . ' as quiz_rel_question ON quiz_question.iid = quiz_rel_question.question_id WHERE quiz_rel_question.exercice_id = ' . $id . " AND\n\t \t\t\tquiz_question.c_id = {$course_id} AND\n\t \t\t\tquiz_rel_question.c_id = {$course_id} "; $rsQuiz = Database::query($sql); $max_score = Database::result($rsQuiz, 0, 0); //Disabling the exercise if we add it inside a LP $exercise = new Exercise(); $exercise->read($id); $exercise->disable(); $exercise->save(); } else { $max_score = 100; } if ($prerequisites != 0) { $sql_ins = "INSERT INTO " . $tbl_lp_item . " (\n \t\t\t\t\tc_id,\n lp_id, " . "item_type, " . "ref, " . "title, " . "description, " . "path, " . "max_score, " . "parent_item_id, " . "previous_item_id, " . "next_item_id, " . "display_order, " . "prerequisite, " . "max_time_allowed " . ") VALUES (\n \t{$course_id} ,\n " . $this->get_id() . ", " . "'" . $type . "', " . "'', " . "'" . $title . "', " . "'" . $description . "', " . "'" . $id . "', " . "'" . $max_score . "', " . $parent . ", " . $previous . ", " . $next . ", " . ($display_order + 1) . ", " . $prerequisites . ", " . $max_time_allowed . ")"; } else { // Insert new item. $sql_ins = "\n INSERT INTO " . $tbl_lp_item . " ( " . "c_id, " . "lp_id, " . "item_type, " . "ref, " . "title, " . "description, " . "path, " . "max_score, " . "parent_item_id, " . "previous_item_id, " . "next_item_id, " . "display_order, " . "max_time_allowed " . ") VALUES (" . $course_id . "," . $this->get_id() . "," . "'" . $type . "'," . "''," . "'" . $title . "'," . "'" . $description . "'," . "'" . $id . "'," . "'" . $max_score . "'," . $parent . "," . $previous . "," . $next . "," . ($display_order + 1) . "," . $max_time_allowed . ")"; } if ($this->debug > 2) { error_log('New LP - Inserting dokeos_chapter: ' . $sql_ins, 0); } $res_ins = Database::query($sql_ins); if ($res_ins) { $new_item_id = Database::insert_id(); // Update the item that should come after the new item. $sql_update_next = "\n UPDATE " . $tbl_lp_item . "\n SET previous_item_id = " . $new_item_id . "\n WHERE c_id = {$course_id} AND id = " . $next; Database::query($sql_update_next); // Update the item that should be before the new item. $sql_update_previous = "\n UPDATE " . $tbl_lp_item . "\n SET next_item_id = " . $new_item_id . "\n WHERE c_id = {$course_id} AND id = " . $tmp_previous; Database::query($sql_update_previous); // Update all the items after the new item. $sql_update_order = "\n UPDATE " . $tbl_lp_item . "\n SET display_order = display_order + 1\n WHERE\n c_id = {$course_id} AND\n lp_id = " . $this->get_id() . " AND\n id <> " . $new_item_id . " AND\n parent_item_id = " . $parent . " AND\n display_order > " . $display_order; Database::query($sql_update_order); // Update the item that should come after the new item. $sql_update_ref = "UPDATE " . $tbl_lp_item . "\n SET ref = " . $new_item_id . "\n WHERE c_id = {$course_id} AND id = " . $new_item_id; Database::query($sql_update_ref); } // Upload audio. if (!empty($_FILES['mp3']['name'])) { // Create the audio folder if it does not exist yet. $_course = api_get_course_info(); $filepath = api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/document/'; if (!is_dir($filepath . 'audio')) { mkdir($filepath . 'audio', api_get_permissions_for_new_directories()); $audio_id = FileManager::add_document($_course, '/audio', 'folder', 0, 'audio'); api_item_property_update($_course, TOOL_DOCUMENT, $audio_id, 'FolderCreated', api_get_user_id(), null, null, null, null, api_get_session_id()); api_item_property_update($_course, TOOL_DOCUMENT, $audio_id, 'invisible', api_get_user_id(), null, null, null, null, api_get_session_id()); } // Upload the file in the documents tool. $file_path = FileManager::handle_uploaded_document($_course, $_FILES['mp3'], api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/document', '/audio', api_get_user_id(), '', '', '', '', false); // Getting the filename only. $file_components = explode('/', $file_path); $file = $file_components[count($file_components) - 1]; // Store the mp3 file in the lp_item table. $sql_insert_audio = "UPDATE {$tbl_lp_item} SET audio = '" . Database::escape_string($file) . "' WHERE id = '" . Database::escape_string($new_item_id) . "'"; Database::query($sql_insert_audio); } return $new_item_id; }
/** * @todo Fix tool_visible_by_default_at_creation labels * @todo Add sessionId parameter to avoid using context * * @param int $item_id * @param int $tool_id * @param int $group_id * @param array $courseInfo */ function api_set_default_visibility($item_id, $tool_id, $group_id = 0, $courseInfo = array()) { $courseInfo = empty($courseInfo) ? api_get_course_info() : $courseInfo; $courseId = $courseInfo['real_id']; $courseCode = $courseInfo['code']; $original_tool_id = $tool_id; switch ($tool_id) { case TOOL_LINK: case TOOL_LINK_CATEGORY: $tool_id = 'links'; break; case TOOL_DOCUMENT: $tool_id = 'documents'; break; case TOOL_LEARNPATH: $tool_id = 'learning'; break; case TOOL_ANNOUNCEMENT: $tool_id = 'announcements'; break; case TOOL_FORUM: case TOOL_FORUM_CATEGORY: case TOOL_FORUM_THREAD: $tool_id = 'forums'; break; case TOOL_QUIZ: $tool_id = 'quiz'; break; } $setting = api_get_setting('document.tool_visible_by_default_at_creation'); $visibility = 'invisible'; if (empty($group_id)) { $group_id = api_get_group_id(); } if (isset($setting[$tool_id])) { if ($setting[$tool_id] == 'true') { $visibility = 'visible'; } } // Read the portal and course default visibility if ($tool_id == 'documents') { $visibility = DocumentManager::getDocumentDefaultVisibility($courseCode); } api_item_property_update($courseInfo, $original_tool_id, $item_id, $visibility, api_get_user_id(), $group_id, null, null, null, api_get_session_id()); // Fixes default visibility for tests switch ($original_tool_id) { case TOOL_QUIZ: $objExerciseTmp = new Exercise($courseId); $objExerciseTmp->read($item_id); if ($visibility == 'visible') { $objExerciseTmp->enable(); $objExerciseTmp->save(); } else { $objExerciseTmp->disable(); $objExerciseTmp->save(); } break; } }
/** * This function sets the default visibility for any given content, using the * default visibility setting of the corresponding tool. For example, if we * create a new quiz and call this function, if the quiz tool is * invisible/disabled at course creation, the quiz itself will be set to * invisible. * @param array|\Entity\Course $course * @param int The ID of the item in its own table * @param string The string identifier of the tool * @param int The group ID, in case we want to specify it * @param int The integer course ID, in case we cannot get it from the context * @todo Fix tool_visible_by_default_at_creation labels */ function api_set_default_visibility($course, $item_id, $tool_id, $group_id = null) { $original_tool_id = $tool_id; switch ($tool_id) { case TOOL_LINK: $tool_id = 'links'; break; case TOOL_DOCUMENT: $tool_id = 'documents'; break; case TOOL_LEARNPATH: $tool_id = 'learning'; break; case TOOL_ANNOUNCEMENT: $tool_id = 'announcements'; break; case TOOL_FORUM: case TOOL_FORUM_CATEGORY: case TOOL_FORUM_THREAD: $tool_id = 'forums'; break; case TOOL_QUIZ: $tool_id = 'quiz'; break; } $setting = api_get_setting('tool_visible_by_default_at_creation'); if (is_array($course)) { $courseId = $course['real_id']; } else { if ($course instanceof Course) { $courseId = $course->getId(); } } if (isset($setting[$tool_id])) { $visibility = 'invisible'; if ($setting[$tool_id] == 'true') { $visibility = 'visible'; } if (empty($group_id)) { $group_id = api_get_group_id(); } api_item_property_update($course, $original_tool_id, $item_id, $visibility, api_get_user_id(), $group_id, null, null, null, api_get_session_id()); // Fixes default visibility for tests switch ($original_tool_id) { case TOOL_QUIZ: $objExerciseTmp = new Exercise($courseId); $objExerciseTmp->read($item_id); if ($visibility == 'visible') { $objExerciseTmp->enable(); $objExerciseTmp->save(); } else { $objExerciseTmp->disable(); $objExerciseTmp->save(); } break; } } }
remove_resource_from_course_gradebook($link_info['id']); } Display::display_confirmation_message(get_lang('ExerciseDeleted')); } break; case 'enable': // enables an exercise $objExerciseTmp->enable(); $objExerciseTmp->save(); api_item_property_update($course_info, TOOL_QUIZ, $objExerciseTmp->id, 'visible', api_get_user_id()); // "WHAT'S NEW" notification: update table item_property (previously last_tooledit) Display::display_confirmation_message(get_lang('VisibilityChanged')); break; case 'disable': // disables an exercise $objExerciseTmp->disable(); $objExerciseTmp->save(); api_item_property_update($course_info, TOOL_QUIZ, $objExerciseTmp->id, 'invisible', api_get_user_id()); Display::display_confirmation_message(get_lang('VisibilityChanged')); break; case 'disable_results': //disable the results for the learners $objExerciseTmp->disable_results(); $objExerciseTmp->save(); Display::display_confirmation_message(get_lang('ResultsDisabled')); break; case 'enable_results': //disable the results for the learners $objExerciseTmp->enable_results(); $objExerciseTmp->save(); Display::display_confirmation_message(get_lang('ResultsEnabled'));
/** * Function rewritten based on old_add_item() from Yannick Warnier. * Due the fact that users can decide where the item should come, I had to overlook this function and * I found it better to rewrite it. Old function is still available. * Added also the possibility to add a description. * * @param int $parent * @param int $previous * @param string $type * @param int resource ID (ref) * @param string $title * @param string $description * @param int $prerequisites * @param int $max_time_allowed * @param int $userId * * @return int */ public function add_item($parent, $previous, $type = 'dokeos_chapter', $id, $title, $description, $prerequisites = 0, $max_time_allowed = 0, $userId = 0) { $course_id = $this->course_info['real_id']; if ($this->debug > 0) { error_log('New LP - In learnpath::add_item(' . $parent . ',' . $previous . ',' . $type . ',' . $id . ',' . $title . ')', 0); } if (empty($course_id)) { // Sometimes Oogie doesn't catch the course info but sets $this->cc $this->course_info = api_get_course_info($this->cc); $course_id = $this->course_info['real_id']; } $userId = empty($userId) ? api_get_user_id() : $userId; $sessionId = api_get_session_id(); $tbl_lp_item = Database::get_course_table(TABLE_LP_ITEM); $_course = $this->course_info; $parent = intval($parent); $previous = intval($previous); $id = intval($id); $max_time_allowed = htmlentities($max_time_allowed); if (empty($max_time_allowed)) { $max_time_allowed = 0; } $sql = "SELECT COUNT(id) AS num\n FROM {$tbl_lp_item}\n WHERE\n c_id = {$course_id} AND\n lp_id = " . $this->get_id() . " AND\n parent_item_id = " . $parent; $res_count = Database::query($sql); $row = Database::fetch_array($res_count); $num = $row['num']; if ($num > 0) { if ($previous == 0) { $sql = "SELECT id, next_item_id, display_order\n FROM " . $tbl_lp_item . "\n WHERE\n c_id = {$course_id} AND\n lp_id = " . $this->get_id() . " AND\n parent_item_id = " . $parent . " AND\n previous_item_id = 0 OR\n previous_item_id=" . $parent; $result = Database::query($sql); $row = Database::fetch_array($result); $tmp_previous = 0; $next = $row['id']; $display_order = 0; } else { $previous = (int) $previous; $sql = "SELECT id, previous_item_id, next_item_id, display_order\n\t\t\t\t\t\tFROM {$tbl_lp_item}\n WHERE\n c_id = {$course_id} AND\n lp_id = " . $this->get_id() . " AND\n id = " . $previous; $result = Database::query($sql); $row = Database::fetch_array($result); $tmp_previous = $row['id']; $next = $row['next_item_id']; $display_order = $row['display_order']; } } else { $tmp_previous = 0; $next = 0; $display_order = 0; } $id = intval($id); $typeCleaned = Database::escape_string($type); if ($type == 'quiz') { $sql = 'SELECT SUM(ponderation) FROM ' . Database::get_course_table(TABLE_QUIZ_QUESTION) . ' as quiz_question INNER JOIN ' . Database::get_course_table(TABLE_QUIZ_TEST_QUESTION) . ' as quiz_rel_question ON quiz_question.id = quiz_rel_question.question_id AND quiz_question.c_id = quiz_rel_question.c_id WHERE quiz_rel_question.exercice_id = ' . $id . " AND\n quiz_question.c_id = {$course_id} AND\n quiz_rel_question.c_id = {$course_id} "; $rsQuiz = Database::query($sql); $max_score = Database::result($rsQuiz, 0, 0); // Disabling the exercise if we add it inside a LP $exercise = new Exercise($course_id); $exercise->read($id); $exercise->disable(); $exercise->save(); } else { $max_score = 100; } $params = array("c_id" => $course_id, "lp_id" => $this->get_id(), "item_type" => $typeCleaned, "ref" => '', "title" => $title, "description" => $description, "path" => $id, "max_score" => $max_score, "parent_item_id" => $parent, "previous_item_id" => $previous, "next_item_id" => intval($next), "display_order" => $display_order + 1, "prerequisite" => $prerequisites, "max_time_allowed" => $max_time_allowed, 'min_score' => 0, 'launch_data' => ''); if ($prerequisites != 0) { $params['prerequisite'] = $prerequisites; } $new_item_id = Database::insert($tbl_lp_item, $params); if ($this->debug > 2) { error_log('New LP - Inserting chapter: ' . $new_item_id, 0); } if ($new_item_id) { $sql = "UPDATE {$tbl_lp_item} SET id = iid WHERE iid = {$new_item_id}"; Database::query($sql); // Update the item that should come after the new item. $sql = " UPDATE {$tbl_lp_item} SET\n previous_item_id = {$new_item_id},\n next_item_id = {$new_item_id},\n id = {$new_item_id}\n WHERE iid = {$new_item_id}"; Database::query($sql); // Update all the items after the new item. $sql = "UPDATE " . $tbl_lp_item . "\n SET display_order = display_order + 1\n WHERE\n c_id = {$course_id} AND\n lp_id = " . $this->get_id() . " AND\n id <> " . $new_item_id . " AND\n parent_item_id = " . $parent . " AND\n display_order > " . $display_order; Database::query($sql); // Update the item that should come after the new item. $sql = "UPDATE " . $tbl_lp_item . "\n SET ref = " . $new_item_id . "\n WHERE c_id = {$course_id} AND id = " . $new_item_id; Database::query($sql); // Upload audio. if (!empty($_FILES['mp3']['name'])) { // Create the audio folder if it does not exist yet. $filepath = api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/document/'; if (!is_dir($filepath . 'audio')) { mkdir($filepath . 'audio', api_get_permissions_for_new_directories()); $audio_id = add_document($_course, '/audio', 'folder', 0, 'audio', '', 0, true, null, $sessionId, $userId); api_item_property_update($_course, TOOL_DOCUMENT, $audio_id, 'FolderCreated', $userId, null, null, null, null, $sessionId); api_item_property_update($_course, TOOL_DOCUMENT, $audio_id, 'invisible', $userId, null, null, null, null, $sessionId); } $file_path = handle_uploaded_document($_course, $_FILES['mp3'], api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/document', '/audio', $userId, '', '', '', '', false); // Getting the filename only. $file_components = explode('/', $file_path); $file = $file_components[count($file_components) - 1]; // Store the mp3 file in the lp_item table. $sql = "UPDATE {$tbl_lp_item} SET\n audio = '" . Database::escape_string($file) . "'\n WHERE id = '" . intval($new_item_id) . "'"; Database::query($sql); } } return $new_item_id; }