See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Component generator base class. 19 * 20 * @package core 21 * @category test 22 * @copyright 2013 The Open University 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 defined('MOODLE_INTERNAL') || die(); 27 28 /** 29 * Component generator base class. 30 * 31 * Extend in path/to/component/tests/generator/lib.php as 32 * class type_plugin_generator extends component_generator_base 33 * Note that there are more specific classes to extend for mods and blocks. 34 * 35 * @copyright 2013 The Open University 36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 37 */ 38 abstract class component_generator_base { 39 40 /** 41 * @var testing_data_generator 42 */ 43 protected $datagenerator; 44 45 /** 46 * Constructor. 47 * @param testing_data_generator $datagenerator 48 */ 49 public function __construct(testing_data_generator $datagenerator) { 50 $this->datagenerator = $datagenerator; 51 } 52 53 /** 54 * To be called from data reset code only, 55 * do not use in tests. 56 * @return void 57 */ 58 public function reset() { 59 } 60 61 /** 62 * Set the current user during data generation. 63 * 64 * This should be avoided wherever possible, but in some situations underlying code will insert data as the current 65 * user. 66 * 67 * @param stdClass $user 68 */ 69 protected function set_user(?stdClass $user = null): void { 70 global $CFG, $DB; 71 72 if ($user === null) { 73 $user = (object) [ 74 'id' => 0, 75 'mnethostid' => $CFG->mnet_localhost_id, 76 ]; 77 } else { 78 $user = clone($user); 79 unset($user->description); 80 unset($user->access); 81 unset($user->preference); 82 } 83 84 // Ensure session is empty, as it may contain caches and user-specific info. 85 \core\session\manager::init_empty_session(); 86 87 \core\session\manager::set_user($user); 88 } 89 90 /** 91 * Update the instance record, inserting any files that are referenced. 92 * 93 * @param stdClass $instance The instance record of the already-created record 94 * @param stdClass $record The data passed in to create the instance 95 * @param string $table The table that the data exists in 96 * @param context $context The context of the instance 97 * @param string $component The component of the owning plugin 98 * @param string $filearea The name of the file area 99 * @param int $targetitemid The itemid to use when saving the files 100 * @return stdClass The updated instance record 101 */ 102 protected function insert_files( 103 stdClass $instance, 104 stdClass $record, 105 string $table, 106 context $context, 107 string $component, 108 string $filearea, 109 int $targetitemid 110 ): stdClass { 111 global $CFG, $DB, $USER; 112 113 $fieldname = "[[files::{$filearea}]]"; 114 if (!isset($record->$fieldname)) { 115 return $instance; 116 } 117 118 preg_match('/\[\[files::(.*)\]\]/', $fieldname, $matches); 119 if (empty($matches[1])) { 120 throw new coding_exception('Invalid file field name: ' . $fieldname); 121 } 122 123 $referencedfieldname = trim($matches[1]); 124 if (!isset($record->$referencedfieldname)) { 125 throw new coding_exception("File field '{$fieldname}' references non-existent field '{$referencedfieldname}'"); 126 } 127 128 $fs = get_file_storage(); 129 $itemid = file_get_unused_draft_itemid(); 130 $itemidfieldname = "{$referencedfieldname}[itemid]"; 131 $record->$itemidfieldname = $itemid; 132 133 $filenames = explode(',', $record->$fieldname); 134 foreach ($filenames as $filename) { 135 $filename = trim($filename); 136 if (!$filename) { 137 continue; 138 } 139 140 $explodedfilename = explode('::', $filename, 3); 141 if (count($explodedfilename) === 2) { 142 [$sourcefile, $targetfile] = $explodedfilename; 143 $user = $USER; 144 } else { 145 [$sourcefile, $targetfile, $username] = $explodedfilename; 146 $user = \core_user::get_user_by_username($username); 147 } 148 $filepath = "{$CFG->dirroot}/{$sourcefile}"; 149 if (!file_exists($filepath)) { 150 throw new coding_exception("File '{$filepath}' does not exist"); 151 } 152 $filerecord = [ 153 'userid' => $user->id, 154 'contextid' => context_user::instance($user->id)->id, 155 'component' => 'user', 156 'filearea' => 'draft', 157 'itemid' => $itemid, 158 'filepath' => '/' . dirname($targetfile), 159 'filename' => basename($targetfile), 160 ]; 161 $fs->create_file_from_pathname($filerecord, $filepath); 162 } 163 164 $olduser = $USER; 165 $this->set_user($user); 166 $instance->$referencedfieldname = file_save_draft_area_files( 167 $itemid, 168 $context->id, 169 $component, 170 $referencedfieldname, 171 $targetitemid, 172 null, 173 $instance->$referencedfieldname 174 ); 175 $this->set_user($olduser); 176 177 $DB->update_record($table, $instance); 178 return $instance; 179 } 180 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body