Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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
}