Ejemplo n.º 1
0
 /**
  * Constructor.
  * @param \qubaid_condition $qubaids the usages to consider when counting previous uses of each question.
  * @param array $usedquestions questionid => number of times used count. If we should allow for
  *      further existing uses of a question in addition to the ones in $qubaids.
  */
 public function __construct(\qubaid_condition $qubaids, array $usedquestions = array())
 {
     $this->qubaids = $qubaids;
     $this->recentlyusedquestions = $usedquestions;
     foreach (\question_bank::get_all_qtypes() as $qtype) {
         if (!$qtype->is_usable_by_random()) {
             $this->excludedqtypes[] = $qtype->name();
         }
     }
 }
Ejemplo n.º 2
0
    /**
     * Import for questiontype plugins
     * Do not override.
     * @param data mixed The segment of data containing the question
     * @param question object processed (so far) by standard import code if appropriate
     * @param extra mixed any additional format specific data that may be passed by the format
     * @param qtypehint hint about a question type from format
     * @return object question object suitable for save_options() or false if cannot handle
     */
    public function try_importing_using_qtypes($data, $question = null, $extra = null,
            $qtypehint = '') {

        // work out what format we are using
        $formatname = substr(get_class($this), strlen('qformat_'));
        $methodname = "import_from_$formatname";

        //first try importing using a hint from format
        if (!empty($qtypehint)) {
            $qtype = question_bank::get_qtype($qtypehint, false);
            if (is_object($qtype) && method_exists($qtype, $methodname)) {
                $question = $qtype->$methodname($data, $question, $this, $extra);
                if ($question) {
                    return $question;
                }
            }
        }

        // loop through installed questiontypes checking for
        // function to handle this question
        foreach (question_bank::get_all_qtypes() as $qtype) {
            if (method_exists($qtype, $methodname)) {
                if ($question = $qtype->$methodname($data, $question, $this, $extra)) {
                    return $question;
                }
            }
        }
        return false;
    }
Ejemplo n.º 3
0
 /**
  * Search question types for the specified string
  *
  * @param string $query The string to search for in question types
  * @return array
  */
 public function search($query)
 {
     global $CFG;
     if ($result = parent::search($query)) {
         return $result;
     }
     $found = false;
     $textlib = textlib_get_instance();
     require_once $CFG->dirroot . '/question/engine/bank.php';
     foreach (question_bank::get_all_qtypes() as $qtype) {
         if (strpos($textlib->strtolower($qtype->local_name()), $query) !== false) {
             $found = true;
             break;
         }
     }
     if ($found) {
         $result = new stdClass();
         $result->page = $this;
         $result->settings = array();
         return array($this->name => $result);
     } else {
         return array();
     }
 }
Ejemplo n.º 4
0
 /**
  * This method needs to be called before the ->excludedqtypes and
  *      ->manualqtypes fields can be used.
  */
 protected function init_qtype_lists() {
     if (!is_null($this->excludedqtypes)) {
         return; // Already done.
     }
     $excludedqtypes = array();
     $manualqtypes = array();
     foreach (question_bank::get_all_qtypes() as $qtype) {
         $quotedname = "'" . $qtype->name() . "'";
         if (!$qtype->is_usable_by_random()) {
             $excludedqtypes[] = $quotedname;
         } else if ($qtype->is_manual_graded()) {
             $manualqtypes[] = $quotedname;
         }
     }
     $this->excludedqtypes = implode(',', $excludedqtypes);
     $this->manualqtypes = implode(',', $manualqtypes);
 }
Ejemplo n.º 5
0
 * @copyright  2008 Tim Hunt
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
require_once dirname(__FILE__) . '/../config.php';
require_once $CFG->libdir . '/questionlib.php';
require_once $CFG->libdir . '/adminlib.php';
require_once $CFG->libdir . '/pluginlib.php';
require_once $CFG->libdir . '/tablelib.php';
// Check permissions.
require_login();
$systemcontext = context_system::instance();
require_capability('moodle/question:config', $systemcontext);
$canviewreports = has_capability('report/questioninstances:view', $systemcontext);
admin_externalpage_setup('manageqtypes');
$thispageurl = new moodle_url('/admin/qtypes.php');
$qtypes = question_bank::get_all_qtypes();
$pluginmanager = plugin_manager::instance();
// Get some data we will need - question counts and which types are needed.
$counts = $DB->get_records_sql("\n        SELECT qtype, COUNT(1) as numquestions, SUM(hidden) as numhidden\n        FROM {question} GROUP BY qtype", array());
$needed = array();
foreach ($qtypes as $qtypename => $qtype) {
    if (!isset($counts[$qtypename])) {
        $counts[$qtypename] = new stdClass();
        $counts[$qtypename]->numquestions = 0;
        $counts[$qtypename]->numhidden = 0;
    }
    $needed[$qtypename] = $counts[$qtypename]->numquestions > 0 || $pluginmanager->other_plugins_that_require($qtype->plugin_name());
    $counts[$qtypename]->numquestions -= $counts[$qtypename]->numhidden;
}
$needed['missingtype'] = true;
// The system needs the missing question type.
Ejemplo n.º 6
0
 /**
  * @return array all the file area names that may contain response files.
  */
 public static function get_all_response_file_areas()
 {
     $variables = array();
     foreach (question_bank::get_all_qtypes() as $qtype) {
         $variables += $qtype->response_file_areas();
     }
     $areas = array();
     foreach (array_unique($variables) as $variable) {
         $areas[] = 'response_' . $variable;
     }
     return $areas;
 }
 /**
  * Initialise the JavaScript for the general editing. (JavaScript for popups
  * is handled with the specific code for those.)
  *
  * @param \stdClass $course the course settings from the database.
  * @param \stdClass $quiz the quiz settings from the database.
  * @param structure $structure object containing the structure of the quiz.
  * @param \question_edit_contexts $contexts the relevant question bank contexts.
  * @param array $pagevars the variables from {@link \question_edit_setup()}.
  * @param \moodle_url $pageurl the canonical URL of this page.
  * @return bool Always returns true
  */
 protected function initialise_editing_javascript($course, $quiz, structure $structure, \question_edit_contexts $contexts, array $pagevars, \moodle_url $pageurl)
 {
     $config = new \stdClass();
     $config->resourceurl = '/mod/quiz/edit_rest.php';
     $config->sectionurl = '/mod/quiz/edit_rest.php';
     $config->pageparams = array();
     $config->questiondecimalpoints = $quiz->questiondecimalpoints;
     $config->pagehtml = $this->new_page_template($structure, $contexts, $pagevars, $pageurl);
     $config->addpageiconhtml = $this->add_page_icon_template($structure, $quiz);
     $this->page->requires->yui_module('moodle-mod_quiz-toolboxes', 'M.mod_quiz.init_resource_toolbox', array(array('courseid' => $course->id, 'quizid' => $quiz->id, 'ajaxurl' => $config->resourceurl, 'config' => $config)));
     unset($config->pagehtml);
     unset($config->addpageiconhtml);
     $this->page->requires->yui_module('moodle-mod_quiz-toolboxes', 'M.mod_quiz.init_section_toolbox', array(array('courseid' => $course->id, 'quizid' => $quiz->id, 'format' => $course->format, 'ajaxurl' => $config->sectionurl, 'config' => $config)));
     $this->page->requires->yui_module('moodle-mod_quiz-dragdrop', 'M.mod_quiz.init_section_dragdrop', array(array('courseid' => $course->id, 'quizid' => $quiz->id, 'ajaxurl' => $config->sectionurl, 'config' => $config)), null, true);
     $this->page->requires->yui_module('moodle-mod_quiz-dragdrop', 'M.mod_quiz.init_resource_dragdrop', array(array('courseid' => $course->id, 'quizid' => $quiz->id, 'ajaxurl' => $config->resourceurl, 'config' => $config)), null, true);
     // Require various strings for the command toolbox.
     $this->page->requires->strings_for_js(array('clicktohideshow', 'deletechecktype', 'deletechecktypename', 'edittitle', 'edittitleinstructions', 'emptydragdropregion', 'hide', 'markedthistopic', 'markthistopic', 'move', 'movecontent', 'moveleft', 'movesection', 'page', 'question', 'selectall', 'show', 'tocontent'), 'moodle');
     $this->page->requires->strings_for_js(array('addpagebreak', 'confirmremovequestion', 'dragtoafter', 'dragtostart', 'numquestionsx', 'removepagebreak'), 'quiz');
     foreach (\question_bank::get_all_qtypes() as $qtype => $notused) {
         $this->page->requires->string_for_js('pluginname', 'qtype_' . $qtype);
     }
     return true;
 }
Ejemplo n.º 8
0
 function action($action)
 {
     $qtypes = question_bank::get_all_qtypes();
     if (!isset($qtypes[$this->plugin])) {
         return get_string('unknownquestiontype', 'question', $this->plugin);
     }
     switch ($action) {
         case 'enable':
             unset_config($this->plugin . '_disabled', 'question');
             break;
         case 'disable':
             set_config($this->plugin . '_disabled', 1, 'question');
             break;
     }
     return 0;
 }
Ejemplo n.º 9
0
 /**
  * @global core_renderer $OUTPUT
  * @param string $name
  * @param string $visiblename
  * @param string $description
  * @param array $defaultsetting
  */
 public function __construct($name, $visiblename, $description, $defaultsetting = null)
 {
     global $OUTPUT;
     $choices = array();
     $icons = array();
     $qtypes = question_bank::get_all_qtypes();
     // some qtypes do not need workaround
     unset($qtypes['missingtype']);
     unset($qtypes['random']);
     // question_bank::sort_qtype_array() expects array(name => local_name)
     $qtypenames = array_map(function ($qtype) {
         return $qtype->local_name();
     }, $qtypes);
     foreach (question_bank::sort_qtype_array($qtypenames) as $name => $label) {
         $choices[$name] = $label;
         $icons[$name] = ' ' . $OUTPUT->pix_icon('icon', '', $qtypes[$name]->plugin_name()) . ' ';
     }
     parent::__construct($name, $visiblename, $description, $defaultsetting, $choices, $icons);
 }
Ejemplo n.º 10
0
    /**
     * Initialise the JavaScript for the general editing. (JavaScript for popups
     * is handled with the specific code for those.)
     *
     * @param \stdClass $course the course settings from the database.
     * @param \stdClass $quiz the quiz settings from the database.
     * @return bool Always returns true
     */
    protected function initialise_editing_javascript($course, $quiz) {

        $config = new \stdClass();
        $config->resourceurl = '/mod/quiz/edit_rest.php';
        $config->sectionurl = '/mod/quiz/edit_rest.php';
        $config->pageparams = array();
        $config->questiondecimalpoints = $quiz->questiondecimalpoints;

        // Include toolboxes.
        $this->page->requires->yui_module('moodle-mod_quiz-toolboxes',
                'M.mod_quiz.init_resource_toolbox',
                array(array(
                        'courseid' => $course->id,
                        'quizid' => $quiz->id,
                        'ajaxurl' => $config->resourceurl,
                        'config' => $config,
                ))
        );
        $this->page->requires->yui_module('moodle-mod_quiz-toolboxes',
                'M.mod_quiz.init_section_toolbox',
                array(array(
                        'courseid' => $course->id,
                        'quizid' => $quiz->id,
                        'format' => $course->format,
                        'ajaxurl' => $config->sectionurl,
                        'config' => $config,
                ))
        );

        // Include course dragdrop.
        $this->page->requires->yui_module('moodle-mod_quiz-dragdrop', 'M.mod_quiz.init_section_dragdrop',
                array(array(
                        'courseid' => $course->id,
                        'quizid' => $quiz->id,
                        'ajaxurl' => $config->sectionurl,
                        'config' => $config,
                )), null, true);

        $this->page->requires->yui_module('moodle-mod_quiz-dragdrop', 'M.mod_quiz.init_resource_dragdrop',
                array(array(
                        'courseid' => $course->id,
                        'quizid' => $quiz->id,
                        'ajaxurl' => $config->resourceurl,
                        'config' => $config,
                )), null, true);

        // Require various strings for the command toolbox.
        $this->page->requires->strings_for_js(array(
                'moveleft',
                'deletechecktype',
                'deletechecktypename',
                'edittitle',
                'edittitleinstructions',
                'show',
                'hide',
                'clicktochangeinbrackets',
                'markthistopic',
                'markedthistopic',
                'move',
                'movesection',
                'movecontent',
                'selectall',
                'tocontent',
                'emptydragdropregion'
        ), 'moodle');

        $this->page->requires->strings_for_js(array(
                'confirmremovequestion',
                'dragtoafter',
                'dragtostart',
        ), 'quiz');

        foreach (\question_bank::get_all_qtypes() as $qtype => $notused) {
            $this->page->requires->string_for_js('pluginname', 'qtype_' . $qtype);
        }

        return true;
    }