MDL-69549 core: Add context export API
[moodle.git] / lib / classes / content / export / exportable_items / exportable_textarea.php
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/>.
17 /**
18  * The definition of a text area which can be exported.
19  *
20  * @package     core
21  * @copyright   2020 Andrew Nicols <andrew@nicols.co.uk>
22  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 declare(strict_types=1);
27 namespace core\content\export\exportable_items;
29 use context;
30 use core\content\export\exportable_item;
31 use core\content\export\exported_item;
32 use core\content\export\zipwriter;
34 /**
35  * The definition of a text area which can be exported.
36  *
37  * @copyright   2020 Andrew Nicols <andrew@nicols.co.uk>
38  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39  */
40 class exportable_textarea extends exportable_item {
42     /** @var string The name of the table that ha the textarea within it */
43     protected $tablename;
45     /** @var int The id in the table */
46     protected $id;
48     /** @var string The name of the text field within the table */
49     protected $textfield;
51     /** @var null|string The name of the format field relating to the text field */
52     protected $textformatfield;
54     /** @var null|string The name of a file area for this content */
55     protected $filearea;
57     /** @var null|int The itemid for files in this text field */
58     protected $itemid;
60     /** @var null|int The itemid used for constructing pluginfiles */
61     protected $pluginfileitemid;
63     /**
64      * Create a new exportable_item instance.
65      *
66      * If no filearea or itemid  is specified the no attempt will be made to export files.
67      *
68      * @param   context $context The context that this content belongs to
69      * @param   string $component The component that this textarea belongs to
70      * @param   string $uservisiblename The name displayed to the user when filtering
71      * @param   string $tablename The name of the table that this textarea is in
72      * @param   string $textfield The field within the tbale
73      * @param   int $id The id in the database
74      * @param   null|string $textformatfield The field in the database relating to the format field if one is present
75      * @param   null|string $filearea The name of the file area for files associated with this text area
76      * @param   null|int $itemid The itemid for files associated with this text area
77      * @param   null|int $pluginfileitemid The itemid to use when constructing the pluginfile URL
78      *          Some fileareas do not use any itemid in the URL and should therefore provide a `null` value here.
79      */
80     public function __construct(
81         context $context,
82         string $component,
83         string $uservisiblename,
84         string $tablename,
85         string $textfield,
86         int $id,
87         ?string $textformatfield = null,
88         ?string $filearea = null,
89         ?int $itemid = null,
90         ?int $pluginfileitemid = null
91     ) {
92         parent::__construct($context, $component, $uservisiblename);
94         $this->tablename = $tablename;
95         $this->textfield = $textfield;
96         $this->textformatfield = $textformatfield;
97         $this->id = $id;
98         $this->filearea = $filearea;
99         $this->itemid = $itemid;
100         $this->pluginfileitemid = $pluginfileitemid;
101     }
103     /**
104      * Add the content to the archive.
105      *
106      * @param   zipwriter $archive
107      */
108     public function add_to_archive(zipwriter $archive): ?exported_item {
109         global $DB;
111         // Fetch the field.
112         $fields = [$this->textfield];
113         if (!empty($this->textformatfield)) {
114             $fields[] = $this->textformatfield;
115         }
116         $record = $DB->get_record($this->tablename, ['id' => $this->id], implode(', ', $fields));
118         if (empty($record)) {
119             return null;
120         }
122         // Export all of the files for this text area.
123         $text = $record->{$this->textfield};
124         if (empty($text)) {
125             $text = '';
126         }
128         if ($this->may_include_files()) {
129             // This content may include inline files.
130             $exporteditem = $archive->add_pluginfiles_for_content(
131                 $this->get_context(),
132                 "",
133                 $text,
134                 $this->component,
135                 $this->filearea,
136                 $this->itemid,
137                 $this->pluginfileitemid
138             );
139         } else {
140             $exporteditem = new exported_item();
141             $exporteditem->set_content($text);
142         }
144         $exporteditem->set_title($this->get_user_visible_name());
145         return $exporteditem;
146     }
148     /**
149      * Whether files may be included in this textarea.
150      *
151      * Both a filearea, and itemid are required for files to be exportable.
152      *
153      * @return  bool
154      */
155     protected function may_include_files(): bool {
156         if ($this->filearea === null) {
157             return false;
158         }
160         if ($this->itemid === null) {
161             return false;
162         }
164         return true;
165     }