Skip to content

Commit 358089b

Browse files
committed
Scripts: Add script to change course code
Replace string in all HTML files and exercises content - refs BT#22302
1 parent 982bbfa commit 358089b

File tree

2 files changed

+170
-0
lines changed

2 files changed

+170
-0
lines changed

main/inc/lib/exercise.lib.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7492,4 +7492,79 @@ private static function subscribeSessionWhenFinishedFailure(int $exerciseId): vo
74927492
);
74937493
}
74947494
}
7495+
7496+
public static function replaceTermsInContent(string $search, string $replace): array
7497+
{
7498+
$quizCount = 0;
7499+
$questionCount = 0;
7500+
$answerCount = 0;
7501+
$tableQuiz = Database::get_course_table(TABLE_QUIZ_TEST);
7502+
$sql = "SELECT iid, title, description FROM $tableQuiz WHERE title LIKE '%$search%' OR description LIKE '%$search%' ORDER BY iid";
7503+
$res = Database::query($sql);
7504+
7505+
if (Database::num_rows($res) > 0) {
7506+
while ($row = Database::fetch_assoc($res)) {
7507+
$title = preg_replace('#'.$search.'#',$replace, $row['title']);
7508+
$description = preg_replace('#'.$search.'#',$replace, $row['description']);
7509+
$sqlReplace = "UPDATE $tableQuiz SET title = '$title', description = '$description' WHERE iid = ".$row['iid'];
7510+
7511+
try {
7512+
Database::query($sqlReplace);
7513+
} catch (Exception $e) {
7514+
echo "Error executing $sqlReplace".PHP_EOL;
7515+
Database::handleError($e);
7516+
}
7517+
7518+
$quizCount++;
7519+
}
7520+
}
7521+
7522+
$tableQuestion = Database::get_course_table(TABLE_QUIZ_QUESTION);
7523+
$sql = "SELECT iid, question, description FROM $tableQuestion WHERE question LIKE '%$search%' OR description LIKE '%$search%' ORDER BY iid";
7524+
$res = Database::query($sql);
7525+
7526+
if (Database::num_rows($res) > 0) {
7527+
while ($row = Database::fetch_assoc($res)) {
7528+
$question = preg_replace('#'.$search.'#',$replace, $row['question']);
7529+
$description = preg_replace('#'.$search.'#',$replace, $row['description']);
7530+
$sqlReplace = "UPDATE $tableQuestion SET question = '$question', description = '$description' WHERE iid = ".$row['iid'];
7531+
7532+
try {
7533+
Database::query($sqlReplace);
7534+
} catch (Exception $e) {
7535+
echo "Error executing $sqlReplace".PHP_EOL;
7536+
Database::handleError($e);
7537+
}
7538+
7539+
$questionCount++;
7540+
}
7541+
}
7542+
7543+
$tableAnswer = Database::get_course_table(TABLE_QUIZ_ANSWER);
7544+
$sql = "SELECT iid, answer, comment FROM $tableAnswer WHERE answer LIKE '%$search%' OR comment LIKE '%$search%' ORDER BY iid";
7545+
$res = Database::query($sql);
7546+
7547+
if (Database::num_rows($res) > 0) {
7548+
while ($row = Database::fetch_assoc($res)) {
7549+
$answer = preg_replace('#'.$search.'#',$replace, $row['answer']);
7550+
$comment = preg_replace('#'.$search.'#',$replace, $row['comment']);
7551+
$sqlReplace = "UPDATE $tableAnswer SET answer = '$answer', comment = '$comment' WHERE iid = ".$row['iid'];
7552+
7553+
try {
7554+
Database::query($sqlReplace);
7555+
} catch (Exception $e) {
7556+
echo "Error executing $sqlReplace".PHP_EOL;
7557+
Database::handleError($e);
7558+
}
7559+
7560+
$answerCount++;
7561+
}
7562+
}
7563+
7564+
return [
7565+
'quizzes' => $quizCount,
7566+
'questions' => $questionCount,
7567+
'answers' => $answerCount,
7568+
];
7569+
}
74957570
}

tests/scripts/replace_course_code.php

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<?php
2+
3+
/* For licensing terms, see /license.txt */
4+
5+
use Symfony\Component\Filesystem\Filesystem;
6+
7+
exit;
8+
9+
/**
10+
* Update the code for a list of courses.
11+
*
12+
* Goes through all HTML files of the courses directory and replaces the current code by the new code.
13+
*/
14+
15+
require __DIR__.'/../../main/inc/global.inc.php';
16+
17+
$list = [
18+
'CURRENTCODE' => 'NEWCODE',
19+
];
20+
21+
foreach (replaceCodes($list) as $message) {
22+
echo time()." -- $message".PHP_EOL;
23+
};
24+
25+
function replaceCodes(array $list): Generator
26+
{
27+
foreach ($list as $currentCode => $newCode) {
28+
$currentCodeExists = CourseManager::course_code_exists($currentCode);
29+
30+
if (!$currentCodeExists) {
31+
yield "Current course code '$currentCode' not exists";
32+
33+
continue;
34+
}
35+
36+
$newCodeExists = CourseManager::course_code_exists($newCode);
37+
38+
if ($newCodeExists) {
39+
yield "New course code '$currentCode' already exists";
40+
41+
continue;
42+
}
43+
44+
$newCode = CourseManager::generate_course_code($newCode);
45+
46+
yield "New code to use for '$currentCode' is '$newCode'";
47+
48+
$tablesWithCode = [
49+
'course' => ['code', 'visual_code', 'directory'],
50+
'course_rel_class' => ['course_code'],
51+
'course_request' => ['code'],
52+
'gradebook_category' => ['course_code'],
53+
'gradebook_evaluation' => ['course_code'],
54+
'gradebook_link' => ['course_code'],
55+
'search_engine_ref' => ['course_code'],
56+
'shared_survey' => ['course_code'],
57+
'specific_field_values' => ['course_code'],
58+
'templates' => ['course_code'],
59+
];
60+
61+
yield "Updating database tables new code";
62+
63+
Database::query('SET foreign_key_checks = 0');
64+
65+
foreach ($tablesWithCode as $tblName => $fieldNames) {
66+
foreach ($fieldNames as $fieldName) {
67+
Database::update(
68+
$tblName,
69+
[$fieldName => $newCode],
70+
["$fieldName = ?" => [$currentCode]]
71+
);
72+
}
73+
}
74+
75+
yield "Replacing course code in exercises content";
76+
77+
ExerciseLib::replaceTermsInContent("/courses/$currentCode/", "/courses/$newCode/");
78+
79+
yield "Replacing course code in HTML files";
80+
81+
$coursePath = api_get_path(SYS_COURSE_PATH);
82+
83+
exec('find '.$coursePath.$currentCode.'/document/ -type f -name "*.html" -exec sed -i '."'s#/courses/$currentCode/#/courses/$newCode/#g' {} +");
84+
85+
yield "Renaming course directory";
86+
87+
$fs = new Filesystem();
88+
$fs->rename(
89+
$coursePath.$currentCode,
90+
$coursePath.$newCode
91+
);
92+
}
93+
94+
yield "Done";
95+
}

0 commit comments

Comments
 (0)