MDL-61138 question: add question exporters
authorRyan Wyllie <ryan@moodle.com>
Wed, 21 Mar 2018 07:31:12 +0000 (15:31 +0800)
committerRyan Wyllie <ryan@moodle.com>
Wed, 18 Apr 2018 03:45:01 +0000 (11:45 +0800)
question/classes/external/question_icon_exporter.php [new file with mode: 0644]
question/classes/external/question_summary_exporter.php [new file with mode: 0644]
question/question.php

diff --git a/question/classes/external/question_icon_exporter.php b/question/classes/external/question_icon_exporter.php
new file mode 100644 (file)
index 0000000..bb2b32b
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Class for exporting a question icon from an stdClass.
+ *
+ * @package    core_question
+ * @copyright  2018 Ryan Wyllie <ryan@moodle.com>
+ * @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 <ryan@moodle.com>
+ * @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 (file)
index 0000000..740697b
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Class for exporting a question summary from an stdClass.
+ *
+ * @package    core_question
+ * @copyright  2018 Ryan Wyllie <ryan@moodle.com>
+ * @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 <ryan@moodle.com>
+ * @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),
+        ];
+    }
+}
index 2a02d92..0f78fc7 100644 (file)
@@ -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);
 // 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);
 $categoryid = optional_param('category', 0, PARAM_INT);
 $cmid = optional_param('cmid', 0, PARAM_INT);
 $courseid = optional_param('courseid', 0, PARAM_INT);