Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?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/>.namespace mod_quiz\external;defined('MOODLE_INTERNAL') || die();require_once($CFG->libdir . '/externallib.php');require_once($CFG->dirroot . '/question/editlib.php');require_once($CFG->dirroot . '/mod/quiz/locallib.php');use external_function_parameters;use external_single_structure;use external_value;use external_api;use mod_quiz\question\bank\filter\custom_category_condition;use mod_quiz\quiz_settings;use mod_quiz\structure;/*** Add random questions to a quiz.** @package mod_quiz* @copyright 2022 Catalyst IT Australia Pty Ltd* @author Nathan Nguyen <nathannguyen@catalyst-au.net>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class add_random_questions extends external_api {/*** Parameters for the web service function** @return external_function_parameters*/public static function execute_parameters(): external_function_parameters {return new external_function_parameters (['cmid' => new external_value(PARAM_INT, 'The cmid of the quiz'),'addonpage' => new external_value(PARAM_INT, 'The page where random questions will be added to'),'randomcount' => new external_value(PARAM_INT, 'Number of random questions'),'filtercondition' => new external_value(PARAM_TEXT,'(Optional) The filter condition used when adding random questions from an existing category.Not required if adding random questions from a new category.',VALUE_DEFAULT,'',),'newcategory' => new external_value(PARAM_TEXT,'(Optional) The name of a new question category to create and use for the random questions.',VALUE_DEFAULT,'',),'parentcategory' => new external_value(PARAM_TEXT,'(Optional) The parent of the new question category, if creating one.',VALUE_DEFAULT,0,),]);}/*** Add random questions.** @param int $cmid The cmid of the quiz* @param int $addonpage The page where random questions will be added to* @param int $randomcount Number of random questions* @param string $filtercondition Filter condition* @param string $newcategory add new category* @param string $parentcategory parent category of new category* @return array result*/public static function execute(int $cmid,int $addonpage,int $randomcount,string $filtercondition = '',string $newcategory = '',string $parentcategory = '',): array {['cmid' => $cmid,'addonpage' => $addonpage,'randomcount' => $randomcount,'filtercondition' => $filtercondition,'newcategory' => $newcategory,'parentcategory' => $parentcategory,] = self::validate_parameters(self::execute_parameters(), ['cmid' => $cmid,'addonpage' => $addonpage,'randomcount' => $randomcount,'filtercondition' => $filtercondition,'newcategory' => $newcategory,'parentcategory' => $parentcategory,]);// Validate context.$thiscontext = \context_module::instance($cmid);self::validate_context($thiscontext);require_capability('mod/quiz:manage', $thiscontext);// If filtercondition is not empty, decode it. Otherwise, set it to empty array.$filtercondition = !empty($filtercondition) ? json_decode($filtercondition, true) : [];// Create new category.if (!empty($newcategory)) {$contexts = new \core_question\local\bank\question_edit_contexts($thiscontext);$defaultcategoryobj = question_make_default_categories($contexts->all());$defaultcategory = $defaultcategoryobj->id . ',' . $defaultcategoryobj->contextid;$qcobject = new \qbank_managecategories\question_category_object(null,new \moodle_url('/'),$contexts->having_one_edit_tab_cap('categories'),$defaultcategoryobj->id,$defaultcategory,null,$contexts->having_cap('moodle/question:add'));$categoryid = $qcobject->add_category($parentcategory, $newcategory, '', true);$filter = ['category' => ['jointype' => custom_category_condition::JOINTYPE_DEFAULT,'values' => [$categoryid],'filteroptions' => ['includesubcategories' => false],]];// Generate default filter condition for the random question to be added in the new category.$filtercondition = ['qpage' => 0,'cat' => "{$categoryid},{$thiscontext->id}",'qperpage' => DEFAULT_QUESTIONS_PER_PAGE,'tabname' => 'questions','sortdata' => [],'filter' => $filter,];}// Add random question to the quiz.[$quiz, ] = get_module_from_cmid($cmid);$settings = quiz_settings::create_for_cmid($cmid);$structure = structure::create_for_quiz($settings);$structure->add_random_questions($addonpage, $randomcount, $filtercondition);quiz_delete_previews($quiz);quiz_settings::create($quiz->id)->get_grade_calculator()->recompute_quiz_sumgrades();return ['message' => get_string('addarandomquestion_success', 'mod_quiz')];}/*** Returns description of method result value.** @return external_value*/public static function execute_returns() {return new external_single_structure(['message' => new external_value(PARAM_TEXT, 'Message', VALUE_OPTIONAL)]);}}