dirroot . '/course/lib.php'); require_once($CFG->dirroot . '/mod/page/lib.php'); /** * Hàm tạo một Page Activity trong Moodle. * * @param int $courseid ID của khóa học. * @param int $topicid ID của topic (section) trong khóa học. * @param string $page_name Tên của trang. * @param string $page_content Nội dung của trang. * @return int|false Trả về ID của page nếu thành công, hoặc `false` nếu thất bại. * @throws Exception Nếu xảy ra lỗi. */ function create_page_activity($courseid, $topicid, $page_name, $page_content) { global $DB; try { // Lấy thông tin khóa học. $course = $DB->get_record('course', ['id' => $courseid], '*', MUST_EXIST); // Kiểm tra section tồn tại. $section = $DB->get_record('course_sections', ['course' => $courseid, 'section' => $topicid], '*', MUST_EXIST); // Dữ liệu của activity page. $page_data = (object)[ 'course' => $courseid, 'name' => $page_name, // Tên của trang (tên tệp đã bóc tách). 'content' => $page_content, // Nội dung trang. 'contentformat' => FORMAT_HTML, // Định dạng nội dung. 'intro' => 'Automatically generated page activity.', // Phần giới thiệu mặc định. 'introformat' => FORMAT_HTML, // Định dạng phần giới thiệu. 'timemodified' => time() // Thời gian chỉnh sửa cuối cùng. ]; // Tạo bản ghi trong bảng `page`. $pageid = $DB->insert_record('page', $page_data); // **Cập nhật DB: Bảng `page`.** if (!$pageid) { throw new moodle_exception('Không thể tạo bản ghi trong bảng page.'); } // Tạo bản ghi trong bảng `course_modules` (CM). $module = $DB->get_record('modules', ['name' => 'page'], '*', MUST_EXIST); // Lấy module ID cho `page`. $module_instance = (object)[ 'course' => $courseid, 'module' => $module->id, 'instance' => $pageid, // Liên kết với bản ghi trong `page`. 'section' => $section->id, 'added' => time(), 'visible' => 1, // Hoạt động này có hiển thị không. 'visibleold' => 1, 'groupmode' => 0, 'groupingid' => 0, 'groupmembersonly' => 0 ]; $cmid = $DB->insert_record('course_modules', $module_instance); // **Cập nhật DB: Bảng `course_modules`.** if (!$cmid) { throw new moodle_exception('Không thể tạo bản ghi trong bảng course_modules.'); } // Cập nhật bảng `course_sections`. $section->sequence = trim($section->sequence . ',' . $cmid, ','); $DB->update_record('course_sections', $section); // **Cập nhật DB: Bảng `course_sections`.** rebuild_course_cache($courseid); // Xây dựng lại bộ nhớ đệm của khóa học. // Ghi lại sự kiện trong `logstore_standard_log`. $event = \core\event\course_module_created::create([ 'context' => context_course::instance($courseid), 'objectid' => $cmid, 'courseid' => $courseid, 'relateduserid' => null, // Không cần thiết nếu chạy từ CLI. 'other' => [ 'modulename' => 'page', 'instanceid' => $pageid, // Thêm instanceid. 'name' => $page_name // Thêm tên hoạt động. ] ]); $event->trigger(); // **Ghi vào DB: Bảng `logstore_standard_log`.** return $pageid; } catch (Exception $e) { echo "Lỗi: " . $e->getMessage() . "\n"; return false; } } /** * Hàm phân tích một dòng stream và bóc tách tên tệp. * * @param string $stream_line Dòng stream cần phân tích. * @return array Mảng chứa tên tệp đã bóc tách và dòng stream. */ function parse_stream_line($stream_line) { // Kiểm tra nếu chuỗi có dấu ngoặc vuông hay không. if (strpos($stream_line, '[') === false || strpos($stream_line, ']') === false) { return ['', '']; // Trả về giá trị mặc định nếu không có dấu ngoặc vuông. } // Giả sử tệp có dạng: [stream=tháng năm/tên_video.mp4] preg_match('/\[(.*?)\]/', $stream_line, $matches); // Kiểm tra nếu tìm thấy tên tệp trong dòng stream. if (isset($matches[1])) { $file_name_with_extension = $matches[1]; // Lấy tên tệp từ dòng stream. // Loại bỏ phần mở rộng tệp (ví dụ .mp4, .avi, .jpg) $file_name_without_extension = pathinfo($file_name_with_extension, PATHINFO_FILENAME); // Loại bỏ các ký tự không cần thiết ở cuối (các phần sau dấu gạch nối, gạch dưới hoặc ký tự vô nghĩa) // Chỉ giữ lại các phần tên hợp lý trước khi xuất hiện các ký tự đặc biệt. $file_name_clean = preg_replace('/[^\w\s-]/', '', $file_name_without_extension); // Loại bỏ các ký tự đặc biệt. $file_name_clean = preg_replace('/[-\s]+/', ' ', $file_name_clean); // Thay thế các dấu gạch nối và khoảng trắng liên tiếp bằng một dấu cách. $file_name_clean = trim($file_name_clean); // Loại bỏ khoảng trắng ở đầu và cuối. return [$file_name_clean, $stream_line]; // Trả về tên tệp đã được xử lý và dòng stream. } // Nếu không tìm thấy tên tệp, trả về giá trị mặc định. return ['', '']; } // Chương trình chính $courseid = 1347; // ID của khóa học. $topicid = 0; // ID của topic (section) trong khóa học. // Kiểm tra xem có truyền tên tệp từ dòng lệnh không if ($argc < 2) { echo "Vui lòng cung cấp tên tệp chứa các dòng stream.\n"; exit(1); } // Đọc tên tệp từ dòng lệnh $filename = $argv[1]; // Kiểm tra nếu tệp có tồn tại không if (!file_exists($filename)) { echo "Tệp không tồn tại: {$filename}\n"; exit(1); } // Đọc tệp và xử lý từng dòng $file_lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($file_lines as $stream_line) { // Lấy tên tệp và dòng stream. list($page_name, $page_content) = parse_stream_line($stream_line); // Tạo Page Activity với nội dung từ dòng stream. $pageid = create_page_activity($courseid, $topicid, $page_name, $page_content); if ($pageid !== false) { echo "Tạo Page Activity thành công! Page ID: {$pageid}\n"; } else { echo "Không thể tạo Page Activity.\n"; } } ?>