MDL-67062 core_h5p: delete libraries
[moodle.git] / mod / forum / export.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  * Page to export forum discussions.
19  *
20  * @package    mod_forum
21  * @copyright  2019 Simey Lameze <simey@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 define('NO_OUTPUT_BUFFERING', true);
26 require_once(__DIR__ . '/../../config.php');
27 require_once($CFG->libdir . '/adminlib.php');
28 require_once($CFG->libdir . '/dataformatlib.php');
29 require_once($CFG->dirroot . '/calendar/externallib.php');
31 $forumid = required_param('id', PARAM_INT);
32 $userids = optional_param_array('userids', [], PARAM_INT);
33 $discussionids = optional_param_array('discids', [], PARAM_INT);
34 $from = optional_param_array('from', [], PARAM_INT);
35 $to = optional_param_array('to', [], PARAM_INT);
36 $fromtimestamp = optional_param('timestampfrom', '', PARAM_INT);
37 $totimestamp = optional_param('timestampto', '', PARAM_INT);
39 if (!empty($from['enabled'])) {
40     unset($from['enabled']);
41     $from = core_calendar_external::get_timestamps([$from])['timestamps'][0]['timestamp'];
42 } else {
43     $from = $fromtimestamp;
44 }
46 if (!empty($to['enabled'])) {
47     unset($to['enabled']);
48     $to = core_calendar_external::get_timestamps([$to])['timestamps'][0]['timestamp'];
49 } else {
50     $to = $totimestamp;
51 }
53 $vaultfactory = mod_forum\local\container::get_vault_factory();
54 $managerfactory = mod_forum\local\container::get_manager_factory();
55 $legacydatamapperfactory = mod_forum\local\container::get_legacy_data_mapper_factory();
57 $forumvault = $vaultfactory->get_forum_vault();
59 $forum = $forumvault->get_from_id($forumid);
60 if (empty($forum)) {
61     throw new moodle_exception('Unable to find forum with id ' . $forumid);
62 }
64 $capabilitymanager = $managerfactory->get_capability_manager($forum);
65 if (!$capabilitymanager->can_export_forum($USER)) {
66     throw new moodle_exception('cannotexportforum', 'forum');
67 }
69 $course = $forum->get_course_record();
70 $coursemodule = $forum->get_course_module_record();
71 $cm = cm_info::create($coursemodule);
73 require_course_login($course, true, $cm);
75 $url = new moodle_url('/mod/forum/export.php');
76 $pagetitle = get_string('export', 'mod_forum');
77 $context = $forum->get_context();
79 $form = new mod_forum\form\export_form($url->out(false), [
80     'forum' => $forum
81 ]);
83 if ($form->is_cancelled()) {
84     redirect(new moodle_url('/mod/forum/view.php', ['id' => $cm->id]));
85 } else if ($data = $form->get_data()) {
86     $dataformat = $data->format;
88     // This may take a very long time and extra memory.
89     \core_php_time_limit::raise();
90     raise_memory_limit(MEMORY_HUGE);
92     $discussionvault = $vaultfactory->get_discussion_vault();
93     $postvault = $vaultfactory->get_post_vault();
94     if ($data->discussionids) {
95         $discussionids = $data->discussionids;
96     } else if (empty($discussionids)) {
97         $discussions = $discussionvault->get_all_discussions_in_forum($forum);
98         $discussionids = array_map(function ($discussion) {
99             return $discussion->get_id();
100         }, $discussions);
101     }
103     $filters = ['discussionids' => $discussionids];
104     if ($data->useridsselected) {
105         $filters['userids'] = $data->useridsselected;
106     }
107     if ($data->from) {
108         $filters['from'] = $data->from;
109     }
110     if ($data->to) {
111         $filters['to'] = $data->to;
112     }
114     // Retrieve posts based on the selected filters.
115     $posts = $postvault->get_from_filters($USER, $filters, $capabilitymanager->can_view_any_private_reply($USER));
117     $striphtml = !empty($data->striphtml);
118     $humandates = !empty($data->humandates);
120     $fields = ['id', 'discussion', 'parent', 'userid', 'created', 'modified', 'mailed', 'subject', 'message',
121                 'messageformat', 'messagetrust', 'attachment', 'totalscore', 'mailnow', 'deleted', 'privatereplyto',
122                 'wordcount', 'charcount'];
124     $datamapper = $legacydatamapperfactory->get_post_data_mapper();
125     $exportdata = new ArrayObject($datamapper->to_legacy_objects($posts));
126     $iterator = $exportdata->getIterator();
128     require_once($CFG->libdir . '/dataformatlib.php');
129     $filename = clean_filename('discussion');
130     download_as_dataformat(
131         $filename,
132         $dataformat,
133         $fields,
134         $iterator,
135         function($exportdata) use ($fields, $striphtml, $humandates) {
136             $data = $exportdata;
137             if ($striphtml) {
138                 // The following call to html_to_text uses the option that strips out
139                 // all URLs, but format_text complains if it finds @@PLUGINFILE@@ tokens.
140                 // So, we need to replace @@PLUGINFILE@@ with a real URL, but it doesn't
141                 // matter what. We use http://example.com/.
142                 $data->message = str_replace('@@PLUGINFILE@@/', 'http://example.com/', $data->message);
143                 $data->message = html_to_text(format_text($data->message, $data->messageformat), 0, false);
144                 $data->messageformat = FORMAT_PLAIN;
145             }
146             if ($humandates) {
147                 $data->created = userdate($data->created);
148                 $data->modified = userdate($data->modified);
149             }
150             foreach ($fields as $field) {
151                 // Convert any boolean fields to their integer equivalent for output.
152                 if (is_bool($data->$field)) {
153                     $data->$field = (int) $data->$field;
154                 }
155             }
156             return $data;
157         });
158     die;
161 $PAGE->set_context($context);
162 $PAGE->set_url($url);
163 $PAGE->set_title($pagetitle);
164 $PAGE->set_pagelayout('admin');
165 $PAGE->set_heading($pagetitle);
167 echo $OUTPUT->header();
168 echo $OUTPUT->heading($pagetitle);
170 // It is possible that the following fields have been provided in the URL.
171 $form->set_data(['useridsselected' => $userids, 'discussionids' => $discussionids, 'from' => $from, 'to' => $to]);
173 $form->display();
175 echo $OUTPUT->footer();