From 81f43bc6d450e23cca00ff876c39e833ab141d17 Mon Sep 17 00:00:00 2001 From: Ryan Wyllie Date: Wed, 21 Mar 2018 15:31:12 +0800 Subject: [PATCH] MDL-61138 question: add question exporters --- .../external/question_icon_exporter.php | 74 ++++++++++ .../external/question_summary_exporter.php | 128 ++++++++++++++++++ question/question.php | 2 +- 3 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 question/classes/external/question_icon_exporter.php create mode 100644 question/classes/external/question_summary_exporter.php diff --git a/question/classes/external/question_icon_exporter.php b/question/classes/external/question_icon_exporter.php new file mode 100644 index 00000000000..bb2b32ba241 --- /dev/null +++ b/question/classes/external/question_icon_exporter.php @@ -0,0 +1,74 @@ +. + +/** + * Class for exporting a question icon from an stdClass. + * + * @package core_question + * @copyright 2018 Ryan Wyllie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace core_question\external; +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->dirroot . '/question/engine/bank.php'); + +/** + * Class for exporting a question from an stdClass. + * + * @copyright 2018 Ryan Wyllie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class question_icon_exporter extends \core\external\exporter { + + /** + * Constructor. + * + * @param \stdClass $question + * @param array $related The related data. + */ + public function __construct(\stdClass $question, $related = []) { + $qtype = \question_bank::get_qtype($question->qtype, false); + + parent::__construct((object) [ + 'key' => 'icon', + 'component' => $qtype->plugin_name(), + 'alttext' => $qtype->local_name() + ], $related); + } + + /** + * Set the moodle context as a required related object. + * + * @return array Required related objects. + */ + protected static function define_related() { + return ['context' => '\\context']; + } + + /** + * Return the list of properties. + * + * @return array + */ + protected static function define_properties() { + return [ + 'key' => ['type' => PARAM_TEXT], + 'component' => ['type' => PARAM_COMPONENT], + 'alttext' => ['type' => PARAM_TEXT], + ]; + } +} diff --git a/question/classes/external/question_summary_exporter.php b/question/classes/external/question_summary_exporter.php new file mode 100644 index 00000000000..740697bd3a7 --- /dev/null +++ b/question/classes/external/question_summary_exporter.php @@ -0,0 +1,128 @@ +. + +/** + * Class for exporting a question summary from an stdClass. + * + * @package core_question + * @copyright 2018 Ryan Wyllie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace core_question\external; +defined('MOODLE_INTERNAL') || die(); + +use \renderer_base; + +/** + * Class for exporting a question summary from an stdClass. + * + * @copyright 2018 Ryan Wyllie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class question_summary_exporter extends \core\external\exporter { + + /** + * @var \stdClass $question + */ + protected $question; + + /** + * Constructor. + * + * @param \stdClass $question + * @param array $related The related data. + */ + public function __construct(\stdClass $question, $related = []) { + $this->question = $question; + return parent::__construct($question, $related); + } + + /** + * Set the moodle context as a required related object. + * + * @return array Required related objects. + */ + protected static function define_related() { + return ['context' => '\\context']; + } + + /** + * The list of mandatory properties required on the question object to + * export. + * + * @return string[] List of properties. + */ + public static function get_mandatory_properties() { + $properties = self::define_properties(); + $mandatoryproperties = array_filter($properties, function($property) { + return empty($property['optional']); + }); + return array_keys($mandatoryproperties); + } + + /** + * The list of static properties returned. + * + * @return array List of properties. + */ + public static function define_properties() { + return [ + 'id' => [ + 'type' => PARAM_INT, + ], + 'category' => [ + 'type' => PARAM_INT, + ], + 'parent' => [ + 'type' => PARAM_INT, + ], + 'name' => [ + 'type' => PARAM_TEXT, + ], + 'qtype' => [ + 'type' => PARAM_COMPONENT, + ] + ]; + } + + /** + * Define the list of calculated properties. + * + * @return array The list of properties. + */ + protected static function define_other_properties() { + return [ + 'icon' => [ + 'type' => question_icon_exporter::read_properties_definition(), + ] + ]; + } + + /** + * Calculate the values for the properties defined in the define_other_properties + * function. + * + * @param renderer_base $output A renderer. + * @return array The list of properties. + */ + protected function get_other_values(\renderer_base $output) { + $iconexporter = new question_icon_exporter($this->question, $this->related); + + return [ + 'icon' => $iconexporter->export($output), + ]; + } +} diff --git a/question/question.php b/question/question.php index 2a02d92b126..0f78fc79109 100644 --- a/question/question.php +++ b/question/question.php @@ -32,7 +32,7 @@ require_once($CFG->libdir . '/formslib.php'); // Read URL parameters telling us which question to edit. $id = optional_param('id', 0, PARAM_INT); // question id $makecopy = optional_param('makecopy', 0, PARAM_BOOL); -$qtype = optional_param('qtype', '', PARAM_FILE); +$qtype = optional_param('qtype', '', PARAM_COMPONENT); $categoryid = optional_param('category', 0, PARAM_INT); $cmid = optional_param('cmid', 0, PARAM_INT); $courseid = optional_param('courseid', 0, PARAM_INT);