Questiontype creation to delete

Jump to: navigation, search

functions related to create, editing and deleting questions

first draw Pierre Pichet 10:45, 17 March 2007 (CDT)

function create_editing_form($submiturl, $question)

    * Return an instance of the question editing form definition. This looks for a
    * class called edit_{$this->name()}_question_form in the file
    * {$CFG->docroot}/question/type/{$this->name()}/edit_{$this->name()}_question_form.php
    * and if it exists returns an instance of it.
    * @param string $submiturl passed on to the constructor call.
    * @return object an instance of the form definition, or null if one could not be found.
   function create_editing_form($submiturl, $question) {
       global $CFG;
       $definition_file = $CFG->dirroot.'/question/type/'.$this->name().'/edit_'.$this->name().'_form.php';
       if (!(is_readable($definition_file) && is_file($definition_file))) {
           return null;
       $classname = 'question_edit_'.$this->name().'_form';
       if (!class_exists($classname)) {
           return null;
       return new $classname($submiturl, $question);

function display_question_editing_page(&$mform, $question, $wizardnow)

    * This method should be overriden if you want to include a special heading or some other
    * html on a question editing page besides the question editing form.
    * @param question_edit_form $mform a child of question_edit_form
    * @param object $question
    * @param string $wizardnow is  for first page.
   function display_question_editing_page(&$mform, $question, $wizardnow){
       print_heading_with_help(get_string("editing".$question->qtype, "quiz"), $question->qtype, "quiz");

function save_question($question, $form, $course)

   * Saves or updates a question after editing by a teacher
   * Given some question info and some data about the answers
   * this function parses, organises and saves the question
   * It is used by {@link question.php} when saving new data from
   * a form, and also by {@link import.php} when importing questions
   * This function in turn calls {@link save_question_options}
   * to save question-type specific options
   * @param object $question the question object which should be updated
   * @param object $form the form submitted by the teacher
   * @param object $course the course we are in
   * @return object On success, return the new question object. On failure,
   *       return an object as follows. If the error object has an errors field,
   *       display that as an error message. Otherwise, the editing form will be
   *       redisplayed with validation errors, from validation_errors field, which
   *       is itself an object, shown next to the form fields.
   function save_question($question, $form, $course) {
       // This default implementation is suitable for most
       // question types.
       // First, save the basic question itself
       $question->name               = trim($form->name);
       $question->questiontext       = trim($form->questiontext);
       $question->questiontextformat = $form->questiontextformat;
       $question->parent             = isset($form->parent)? $form->parent : 0;
       $question->length = $this->actual_number_of_questions($question);
       $question->penalty = isset($form->penalty) ? $form->penalty : 0;
       if (empty($form->image)) {
           $question->image = "";
       } else {
           $question->image = $form->image;
       if (empty($form->generalfeedback)) {
           $question->generalfeedback = ;
       } else {
           $question->generalfeedback = trim($form->generalfeedback);
       if (empty($question->name)) {
           $question->name = substr(strip_tags($question->questiontext), 0, 15);
           if (empty($question->name)) {
               $question->name = '-';
       if ($question->penalty > 1 or $question->penalty < 0) {
           $question->errors['penalty'] = get_string('invalidpenalty', 'quiz');
       if (isset($form->defaultgrade)) {
           $question->defaultgrade = $form->defaultgrade;
       if (!empty($question->id)) { // Question already exists
           // keep existing unique stamp code
           $question->stamp = get_field('question', 'stamp', 'id', $question->id);
           if (!update_record("question", $question)) {
               error("Could not update question!");
       } else {         // Question is a new one
           // Set the unique code
           $question->stamp = make_unique_id_code();
           if (!$question->id = insert_record("question", $question)) {
               error("Could not insert new question!");
       // Now to save all the answers and type-specific options
       $form->id = $question->id;
       $form->qtype = $question->qtype;
       $form->category = $question->category;
       $form->questiontext = $question->questiontext;
       $result = $this->save_question_options($form);
       if (!empty($result->error)) {
       if (!empty($result->notice)) {
           notice($result->notice, "question.php?id=$question->id");
       if (!empty($result->noticeyesno)) {
           notice_yesno($result->noticeyesno, "question.php?id=$question->id&courseid={$course->id}",
       // Give the question a unique version stamp determined by question_hash()
       if (!set_field('question', 'version', question_hash($question), 'id', $question->id)) {
           error('Could not update question version field');
       return $question;

function save_question_options($question)

   * Saves question-type specific options
   * This is called by {@link save_question()} to save the question-type specific data
   * @return object $result->error or $result->noticeyesno or $result->notice
   * @param object $question  This holds the information from the editing form,
   *                          it is not a standard question object.
   function save_question_options($question) {
       return null;

function replace_question_in_attempts($oldquestionid, $newquestion, $attemtps)

   * Changes all states for the given attempts over to a new question
   * This is used by the versioning code if the teacher requests that a question
   * gets replaced by the new version. In order for the attempts to be regraded
   * properly all data in the states referring to the old question need to be
   * changed to refer to the new version instead. In particular for question types
   * that use the answers table the answers belonging to the old question have to
   * be changed to those belonging to the new version.
   * @param integer $oldquestionid  The id of the old question
   * @param object $newquestion    The new question
   * @param array  $attempts       An array of all attempt objects in whose states
   *                               replacement should take place
   function replace_question_in_attempts($oldquestionid, $newquestion, $attemtps) {
       echo 'Not yet implemented';

function get_question_options(&$question)

   * Loads the question type specific options for the question.
   * This function loads any question type specific options for the
   * question from the database into the question object. This information
   * is placed in the $question->options field. A question type is
   * free, however, to decide on a internal structure of the options field.
   * @return bool            Indicates success or failure.
   * @param object $question The question object for the question. This object
   *                         should be updated to include the question type
   *                         specific information (it is passed by reference).
   function get_question_options(&$question) {
       if (!isset($question->options)) {
           $question->options = new object;
       // The default implementation attaches all answers for this question
       $question->options->answers = get_records('question_answers', 'question', $question->id, 'id ASC');
       return true;