protected function moveUpSectionDirectories_clbk($m) { $prefix = $m[1]; $dir = $m[2]; $file_path = $m[3]; $suffix = $m[4]; $root_dir = $this->getTempDir() . '/course_files'; // ファイル移動 SharingCart_FileSystem::move($root_dir . '/' . $dir . '/' . $file_path, $root_dir . '/' . $file_path, SharingCart_FileSystem::OVERWRITE); // ディレクトリが空になったら削除する SharingCart_FileSystem::rmdir($root_dir . '/' . $dir); return $prefix . $file_path . $suffix; }
protected function excludeUnnecessaryDuplications() { global $CFG; if ($this->prefs->original_wwwroot != $CFG->wwwroot) { // サイトが異なる場合は同一のID値でリストアされる可能性があるのでファイルを除外しない return; } // 問題が新規作成されなかった場合、project フォーマットのリストア先セクションディレクトリに // メディアファイルをコピーすると参照されることなく冗長となってしまうので、ここで除外する if ($section_name = $this->prefs->newdirectoryname) { // 複製されなかった問題 $no_dup_course_questions = get_records_sql("\n\t\t\t\tSELECT q.*\n\t\t\t\t\tFROM {$CFG->prefix}question q\n\t\t\t\t\t , {$CFG->prefix}backup_ids bk\n\t\t\t\t\t , {$CFG->prefix}question_categories qc\n\t\t\t\t\tWHERE bk.backup_code = " . $this->getUnique() . "\n\t\t\t\t\t AND bk.table_name = 'question'\n\t\t\t\t\t AND bk.new_id = bk.old_id\n\t\t\t\t\t AND q.id = bk.new_id\n\t\t\t\t\t AND q.category = qc.id\n\t\t\t\t\t AND qc.contextid != " . SYSCONTEXTID . "\n\t\t\t"); if ($no_dup_course_questions) { $no_dup_course_question_ids = array_keys($no_dup_course_questions); $xml = file_get_contents($this->getTempDir() . '/moodle.xml'); // ネストした内側にはマッチさせずに <QUESTION> ノードで分割 $re_question_tag = '@ <QUESTION>( (?: (?> (?: (?! </?QUESTION>). )* ) | (?R) )* )</QUESTION> @xs'; $a = preg_split($re_question_tag, $xml, -1, PREG_SPLIT_DELIM_CAPTURE); $re_file_refs = array('@"' . preg_quote(parent::LINK_FILE_ESC, '@') . '/' . preg_quote($section_name, '@') . '/(.+?)"@', '@<REFERENCE>' . preg_quote($section_name, '@') . '/(.+?)</REFERENCE>@'); // コピー不要なファイルを列挙 $exclude_flags = array(); foreach ($a as $i => $s) { if ($i & 1) { // 奇数インデックス:マッチ if (preg_match('@^\\s*<ID>(?:' . implode('|', $no_dup_course_question_ids) . ')</ID>@', $s)) { // 複製されなかった問題 → 除外フラグを立てる self::findLinksAndSetFlags($exclude_flags, $re_file_refs, $s, TRUE); } else { // 複製された問題 → 除外フラグを消す self::findLinksAndSetFlags($exclude_flags, $re_file_refs, $s, FALSE); } } else { // 偶数インデックス:非マッチ // (QUESTION以外のファイル) → 除外フラグを消す self::findLinksAndSetFlags($exclude_flags, $re_file_refs, $s, FALSE); } } $exclude_files = array_keys(array_filter($exclude_flags)); // コピー不要なファイルを一時ディレクトリから削除 $root = $this->getTempDir() . '/course_files/' . $section_name . '/'; foreach ($exclude_files as $file) { SharingCart_FileSystem::remove($root . $file); } SharingCart_FileSystem::rmdir($root); } } }