From f7b7f4e6799d31cb3f225516e604f7943c96b68e Mon Sep 17 00:00:00 2001 From: Simey Lameze Date: Mon, 1 Jul 2019 13:50:49 +0800 Subject: [PATCH] MDL-9469 mod_forum: create basic forum export structure Part of MDL-66075 --- mod/forum/classes/local/vaults/discussion.php | 14 +++ mod/forum/export.php | 114 ++++++++++++++++++ mod/forum/export_form.php | 62 ++++++++++ 3 files changed, 190 insertions(+) create mode 100644 mod/forum/export.php create mode 100644 mod/forum/export_form.php diff --git a/mod/forum/classes/local/vaults/discussion.php b/mod/forum/classes/local/vaults/discussion.php index f5a60bc4b6d..084c6127354 100644 --- a/mod/forum/classes/local/vaults/discussion.php +++ b/mod/forum/classes/local/vaults/discussion.php @@ -86,6 +86,20 @@ class discussion extends db_table_vault { }, $results); } + /** + * Get all discussions in the specified forum. + * + * @param forum_entity $forum + * @return array + */ + public function get_all_discussions_in_forum(forum_entity $forum): ?array { + $records = $this->get_db()->get_records(self::TABLE, [ + 'forum' => $forum->get_id(), + ]); + + return $this->transform_db_records_to_entities($records); + } + /** * Get the first discussion in the specified forum. * diff --git a/mod/forum/export.php b/mod/forum/export.php new file mode 100644 index 00000000000..0650d57c2bc --- /dev/null +++ b/mod/forum/export.php @@ -0,0 +1,114 @@ +. + +/** + * Page to export forum discussions. + * + * @package mod_forum + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +define('NO_OUTPUT_BUFFERING', true); + +require_once(__DIR__ . '/../../config.php'); +require_once($CFG->libdir . '/adminlib.php'); +require_once($CFG->libdir . '/dataformatlib.php'); +require_once($CFG->dirroot . '/mod/forum/export_form.php'); + +$forumid = optional_param('id', 0, PARAM_INT); +$doexport = optional_param('export', false, PARAM_BOOL); + +$vaultfactory = mod_forum\local\container::get_vault_factory(); +$managerfactory = mod_forum\local\container::get_manager_factory(); + +$forumvault = $vaultfactory->get_forum_vault(); + +$forum = $forumvault->get_from_id($forumid); +if (empty($forum)) { + throw new \moodle_exception('Unable to find forum with id ' . $forumid); +} + +$capabilitymanager = $managerfactory->get_capability_manager($forum); + +$course = $forum->get_course_record(); +$coursemodule = $forum->get_course_module_record(); +$cm = \cm_info::create($coursemodule); + +require_course_login($course, true, $cm); + +$url = new moodle_url('/mod/forum/export.php'); +$pagetitle = get_string('export', 'mod_forum'); +$context = $forum->get_context(); + +if ($doexport == false) { + $PAGE->set_context($context); + $PAGE->set_url($url); + $PAGE->set_title($pagetitle); + $PAGE->set_pagelayout('admin'); + $PAGE->set_heading($pagetitle); +} + +$form = new export($url->out(false), [ + 'forum' => $forum +]); + +if ($form->is_cancelled()) { + redirect($url); +} else if ($data = $form->get_data()) { + require_sesskey(); + + $dataformat = $data->format; + + $discussionvault = $vaultfactory->get_discussion_vault(); + $discussions = $discussionvault->get_all_discussions_in_forum($forum); + $discussionids = array_map(function ($discussion) { + return $discussion->get_id(); + }, $discussions); + $postvault = $vaultfactory->get_post_vault(); + $posts = $postvault->get_from_discussion_ids( + $USER, + $discussionids, + $capabilitymanager->can_view_any_private_reply($USER) + ); + + $builderfactory = mod_forum\local\container::get_builder_factory(); + $exportedpostsbuilder = $builderfactory->get_exported_posts_builder(); + $exportedposts = $exportedpostsbuilder->build( + $USER, + [$forum], + $discussions, + $posts + ); + + $fields = ['id', 'subject', 'message']; + + $exportdata = new ArrayObject($exportedposts); + $iterator = $exportdata->getIterator(); + + require_once($CFG->libdir . '/dataformatlib.php'); + $filename = clean_filename('discussion'); + download_as_dataformat($filename, $dataformat, $fields, $iterator); + die(); +} +if ($doexport == false) { + echo $OUTPUT->header(); + echo $OUTPUT->heading($pagetitle); + + $form->display(); + + echo $OUTPUT->footer(); +} + diff --git a/mod/forum/export_form.php b/mod/forum/export_form.php new file mode 100644 index 00000000000..75a5c74bd74 --- /dev/null +++ b/mod/forum/export_form.php @@ -0,0 +1,62 @@ +. + +/** + * This file contains the form definition for discussion export. + * + * @package mod_forum + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.'); + +require_once($CFG->dirroot.'/mod/forum/lib.php'); +require_once($CFG->libdir.'/formslib.php'); + +/** + * Export discussion form. + * + * @package mod_forum + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL Juv3 or later + */ +class export extends moodleform { + + /** + * Define the form - called by parent constructor + */ + public function definition() { + $mform = $this->_form; + $forum = $this->_customdata['forum']; + + $mform->addElement('hidden', 'export'); + $mform->setType('export', PARAM_BOOL); + $mform->setDefault('export', true); + + $mform->addElement('hidden', 'id'); + $mform->setType('id', PARAM_INT); + $mform->setDefault('id', $forum->get_id()); + + // Export formats. + $formats = core_plugin_manager::instance()->get_plugins_of_type('dataformat'); + $options = []; + foreach ($formats as $format) { + $options[$format->name] = $format->displayname; + } + $mform->addElement('select', 'format', 'Format', $options); + $this->add_action_buttons(true, get_string('export', 'mod_forum')); + } +}