[ Index ]

PHP Cross Reference of Moodle 1.9.3 [Build 15-Oct-2008]

title

Body

[close]

/mod/quiz/ -> backuplib.php (source)

   1  <?php // $Id: backuplib.php,v 1.62.2.6 2008/02/05 10:16:40 jamiesensei Exp $
   2      //This php script contains all the stuff to backup quizzes
   3  
   4  //This is the "graphical" structure of the quiz mod:
   5      //To see, put your terminal to 160cc
   6  
   7      //
   8      //                           quiz
   9      //                        (CL,pk->id)
  10      //                            |
  11      //           -------------------------------------------------------------------
  12      //           |               |                |                |               |
  13      //           |          quiz_grades           |     quiz_question_versions     |
  14      //           |      (UL,pk->id,fk->quiz)      |      (CL,pk->id,fk->quiz)      |
  15      //           |                                |                                |
  16      //      quiz_attempts             quiz_question_instances                quiz_feedback
  17      //  (UL,pk->id,fk->quiz)       (CL,pk->id,fk->quiz,question)         (CL,pk->id,fk->quiz)
  18      //
  19      // Meaning: pk->primary key field of the table
  20      //          fk->foreign key to link with parent
  21      //          nt->nested field (recursive data)
  22      //          SL->site level info
  23      //          CL->course level info
  24      //          UL->user level info
  25      //          files->table may have files
  26      //
  27      //-----------------------------------------------------------
  28  
  29      // When we backup a quiz we also need to backup the questions and possibly
  30      // the data about student interaction with the questions. The functions to do
  31      // that are included with the following library
  32      require_once("$CFG->dirroot/question/backuplib.php");
  33  
  34      /*
  35       * Insert necessary category ids to backup_ids table. Called during backup_check.html
  36       * This backs up ids for quiz module. It backs up :
  37       *     all categories and questions in course
  38       *     all categories and questions in contexts of quiz module instances which have been selected for backup
  39       *     all categories and questions in contexts above course level that are used by quizzes that have been selected for backup
  40       */
  41      function quiz_insert_category_and_question_ids($course, $backup_unique_code, $instances = null) {
  42          global $CFG;
  43          $status = true;
  44          
  45          // Create missing categories and reasign orphaned questions.
  46          quiz_fix_orphaned_questions($course);
  47  
  48          $coursecontext = get_context_instance(CONTEXT_COURSE, $course);
  49          $status = $status && question_insert_c_and_q_ids_for_course($coursecontext, $backup_unique_code);
  50          
  51          // then, all categories and questions from this course's modules' contexts.
  52          $status = $status && question_insert_c_and_q_ids_for_module($backup_unique_code, $course, 'quiz', $instances);
  53  
  54          // Then categories from parent contexts used by the quizzes we are backing up.
  55          //TODO this will need generalising when we have modules other than quiz using shared questions above course level.
  56          $parentcontexts = get_parent_contexts($coursecontext);
  57          $from = "{$CFG->prefix}quiz quiz,";
  58          $where = "AND quiz.course = '$course'
  59                       AND qqi.quiz = quiz.id";
  60          if (!empty($instances) && is_array($instances) && count($instances)) {
  61              $questionselectsqlfrom = '';
  62              $questionselectsqlwhere = 'AND qqi.quiz IN ('.implode(',',array_keys($instances)).')';
  63          } else {
  64              $questionselectsqlfrom = "{$CFG->prefix}quiz quiz,";
  65              $questionselectsqlwhere = "AND quiz.course = '$course'
  66                           AND qqi.quiz = quiz.id";
  67          }
  68          $categories = get_records_sql("
  69                  SELECT id, parent, 0 AS childrendone
  70                  FROM {$CFG->prefix}question_categories
  71                  WHERE contextid IN (".join($parentcontexts, ', ').")
  72                    AND id IN (
  73                      SELECT DISTINCT question.category
  74                      FROM {$CFG->prefix}question question,
  75                           $questionselectsqlfrom
  76                           {$CFG->prefix}quiz_question_instances qqi
  77                      WHERE qqi.question = question.id
  78                        $questionselectsqlwhere
  79                  )", false);
  80          if (!$categories) {
  81              $categories = array();
  82          } else {
  83              //put the ids of the used questions from all these categories into the db.
  84              $status = $status && execute_sql("INSERT INTO {$CFG->prefix}backup_ids
  85                                         (backup_code, table_name, old_id, info)
  86                                         SELECT DISTINCT $backup_unique_code, 'question', q.id, ''
  87                                         FROM {$CFG->prefix}question q,
  88                                         $from
  89                                         {$CFG->prefix}question_categories qc,
  90                                         {$CFG->prefix}quiz_question_instances qqi
  91                                         WHERE (qqi.question = q.id
  92                                         OR qqi.question = q.parent)
  93                                         AND q.category = qc.id
  94                                         AND qc.contextid IN (".join($parentcontexts, ', ').")
  95                                         $where", false);
  96  
  97              // Add the parent categories, of these categories up to the top of the category tree.
  98              // not backing up the questions in these categories.
  99              foreach ($categories as $category) {
 100                  while ($category->parent != 0) {
 101                      if (array_key_exists($category->parent, $categories)) {
 102                          // Parent category already on the list.
 103                          break;
 104                      }
 105                      $currentid = $category->id;
 106                      $category = get_record('question_categories', 'id', $category->parent, '', '', '', '', 'id, parent, 0 AS childrendone');
 107                      if ($category) {
 108                          $categories[$category->id] = $category;
 109                      } else {
 110                          // Parent not found: this indicates an error, but just fix it.
 111                          set_field('question_categories', 'parent', 0, 'id', $currentid);
 112                          break;
 113                      }
 114                  }
 115              }
 116  
 117              // Now we look for categories from other courses containing random questions
 118              // in our quizzes that select from the category and its subcategories. That implies
 119              // those subcategories also need to be backed up. (The categories themselves
 120              // and their parents will already have been included.)
 121              $categorieswithrandom = get_records_sql("
 122                      SELECT question.category AS id, SUM(" .
 123                              sql_cast_char2int('questiontext', true) . ") AS numqsusingsubcategories
 124                      FROM {$CFG->prefix}quiz_question_instances qqi,
 125                           $from
 126                           {$CFG->prefix}question question
 127                      WHERE question.id = qqi.question
 128                        AND question.qtype = '" . RANDOM . "'
 129                        $where
 130                      GROUP BY question.category
 131                      ");
 132              $randomselectedquestions = array();
 133              if ($categorieswithrandom) {
 134                  foreach ($categorieswithrandom as $category) {
 135                      if ($category->numqsusingsubcategories > 0) {
 136                          $status = $status && quiz_backup_add_sub_categories($categories, $randomselectedquestions, $category->id);
 137                      }
 138                  }
 139                  $returnval = get_records_sql("
 140                      SELECT question.id
 141                      FROM {$CFG->prefix}question question
 142                      WHERE question.category IN  (".join(array_keys($categorieswithrandom), ', ').")");
 143                  if ($returnval) {
 144                      $randomselectedquestions += $returnval;
 145                  }
 146              }
 147  
 148              // Finally, add all these extra categories to the backup_ids table.
 149              foreach ($categories as $category) {
 150                  $status = $status && backup_putid($backup_unique_code, 'question_categories', $category->id, 0);
 151              }
 152              // Finally, add all these extra categories to the backup_ids table.
 153              foreach ($randomselectedquestions as $question) {
 154                  $status = $status && backup_putid($backup_unique_code, 'question', $question->id, 0);
 155              }
 156          }
 157          return $status;
 158      }
 159      
 160      /**
 161       * Helper function adding the id of all the subcategories of a category to an array.
 162       */
 163      function quiz_backup_add_sub_categories(&$categories, &$questions, $categoryid) {
 164          global $CFG;
 165          $status = true;
 166          if ($categories[$categoryid]->childrendone) {
 167              return $status;
 168          }
 169          if ($subcategories = get_records('question_categories', 'parent', $categoryid, '', 'id, 0 AS childrendone')) {
 170              foreach ($subcategories as $subcategory) {
 171                  if (!array_key_exists($subcategory->id, $categories)) {
 172                      $categories[$subcategory->id] = $subcategory;
 173                  }
 174                  $status = $status && quiz_backup_add_sub_categories($categories, $questions, $subcategory->id);
 175              }
 176              $subcatlist = join(array_keys($subcategories), ',');
 177              $returnval = get_records_sql("
 178                  SELECT question.id
 179                  FROM {$CFG->prefix}question question
 180                  WHERE question.category IN ($subcatlist)
 181                  ");
 182              if ($returnval) {
 183                  $questions += $returnval;
 184              }
 185          }
 186          $categories[$categoryid]->childrendone = 1;
 187          return $status;
 188      }
 189  
 190  
 191      //This function is used to detect orphaned questions (pointing to a
 192      //non existing category) and to recreate such category. This function
 193      //is used by the backup process, to ensure consistency and should be
 194      //executed in the upgrade process and, perhaps in the health center.
 195      function quiz_fix_orphaned_questions ($course) {
 196  
 197          global $CFG;
 198  
 199          $categories = get_records_sql("SELECT DISTINCT t.category, t.category
 200                                         FROM {$CFG->prefix}question t,
 201                                              {$CFG->prefix}quiz_question_instances g,
 202                                              {$CFG->prefix}quiz q
 203                                         WHERE q.course = '$course' AND
 204                                               g.quiz = q.id AND
 205                                               g.question = t.id",false);
 206          if ($categories) {
 207              foreach ($categories as $key => $category) {
 208                  $exist = get_record('question_categories','id', $key);
 209                  //If the category doesn't exist
 210                  if (!$exist) {
 211                      //Build a new category
 212                      $db_cat = new stdClass;
 213                      // always create missing categories in course context
 214                      $db_cat->contextid = get_context_instance(CONTEXT_COURSE, $course);
 215                      $db_cat->name = get_string('recreatedcategory','',$key);
 216                      $db_cat->info = get_string('recreatedcategory','',$key);
 217                      $db_cat->stamp = make_unique_id_code();
 218                      //Insert the new category
 219                      $catid = insert_record('question_categories',$db_cat);
 220                      unset ($db_cat);
 221                      if ($catid) {
 222                          //Reasign orphaned questions to their new category
 223                          set_field ('question','category',$catid,'category',$key);
 224                      }
 225                  }
 226              }
 227          }
 228      }
 229  
 230  
 231  //STEP 2. Backup quizzes and associated structures
 232      //    (course dependent)
 233  
 234      function quiz_backup_one_mod($bf,$preferences,$quiz) {
 235          $status = true;
 236  
 237          if (is_numeric($quiz)) {
 238              $quiz = get_record('quiz','id',$quiz);
 239          }
 240  
 241          //Start mod
 242          fwrite ($bf,start_tag("MOD",3,true));
 243          //Print quiz data
 244          fwrite ($bf,full_tag("ID",4,false,$quiz->id));
 245          fwrite ($bf,full_tag("MODTYPE",4,false,"quiz"));
 246          fwrite ($bf,full_tag("NAME",4,false,$quiz->name));
 247          fwrite ($bf,full_tag("INTRO",4,false,$quiz->intro));
 248          fwrite ($bf,full_tag("TIMEOPEN",4,false,$quiz->timeopen));
 249          fwrite ($bf,full_tag("TIMECLOSE",4,false,$quiz->timeclose));
 250          fwrite ($bf,full_tag("OPTIONFLAGS",4,false,$quiz->optionflags));
 251          fwrite ($bf,full_tag("PENALTYSCHEME",4,false,$quiz->penaltyscheme));
 252          fwrite ($bf,full_tag("ATTEMPTS_NUMBER",4,false,$quiz->attempts));
 253          fwrite ($bf,full_tag("ATTEMPTONLAST",4,false,$quiz->attemptonlast));
 254          fwrite ($bf,full_tag("GRADEMETHOD",4,false,$quiz->grademethod));
 255          fwrite ($bf,full_tag("DECIMALPOINTS",4,false,$quiz->decimalpoints));
 256          fwrite ($bf,full_tag("REVIEW",4,false,$quiz->review));
 257          fwrite ($bf,full_tag("QUESTIONSPERPAGE",4,false,$quiz->questionsperpage));
 258          fwrite ($bf,full_tag("SHUFFLEQUESTIONS",4,false,$quiz->shufflequestions));
 259          fwrite ($bf,full_tag("SHUFFLEANSWERS",4,false,$quiz->shuffleanswers));
 260          fwrite ($bf,full_tag("QUESTIONS",4,false,$quiz->questions));
 261          fwrite ($bf,full_tag("SUMGRADES",4,false,$quiz->sumgrades));
 262          fwrite ($bf,full_tag("GRADE",4,false,$quiz->grade));
 263          fwrite ($bf,full_tag("TIMECREATED",4,false,$quiz->timecreated));
 264          fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$quiz->timemodified));
 265          fwrite ($bf,full_tag("TIMELIMIT",4,false,$quiz->timelimit));
 266          fwrite ($bf,full_tag("PASSWORD",4,false,$quiz->password));
 267          fwrite ($bf,full_tag("SUBNET",4,false,$quiz->subnet));
 268          fwrite ($bf,full_tag("POPUP",4,false,$quiz->popup));
 269          fwrite ($bf,full_tag("DELAY1",4,false,$quiz->delay1));
 270          fwrite ($bf,full_tag("DELAY2",4,false,$quiz->delay2));
 271          //Now we print to xml question_instances (Course Level)
 272          $status = backup_quiz_question_instances($bf,$preferences,$quiz->id);
 273          //Now we print to xml quiz_feedback (Course Level)
 274          $status = backup_quiz_feedback($bf,$preferences,$quiz->id);
 275          //Now we print to xml question_versions (Course Level)
 276          $status = backup_quiz_question_versions($bf,$preferences,$quiz->id);
 277          //if we've selected to backup users info, then execute:
 278          //    - backup_quiz_grades
 279          //    - backup_quiz_attempts
 280          if (backup_userdata_selected($preferences,'quiz',$quiz->id) && $status) {
 281              $status = backup_quiz_grades($bf,$preferences,$quiz->id);
 282              if ($status) {
 283                  $status = backup_quiz_attempts($bf,$preferences,$quiz->id);
 284              }
 285          }
 286          //End mod
 287          $status = fwrite ($bf,end_tag("MOD",3,true));
 288  
 289          return $status;
 290      }
 291  
 292  
 293      function quiz_backup_mods($bf,$preferences) {
 294  
 295          global $CFG;
 296  
 297          $status = true;
 298  
 299          //Iterate over quiz table
 300          $quizzes = get_records ("quiz","course",$preferences->backup_course,"id");
 301          if ($quizzes) {
 302              foreach ($quizzes as $quiz) {
 303                  if (backup_mod_selected($preferences,'quiz',$quiz->id)) {
 304                      $status = quiz_backup_one_mod($bf,$preferences,$quiz);
 305                  }
 306              }
 307          }
 308          return $status;
 309      }
 310  
 311      //Backup quiz_question_instances contents (executed from quiz_backup_mods)
 312      function backup_quiz_question_instances ($bf,$preferences,$quiz) {
 313          $status = true;
 314  
 315          $quiz_question_instances = get_records("quiz_question_instances","quiz",$quiz,"id");
 316          //If there are question_instances
 317          if ($quiz_question_instances) {
 318              //Write start tag
 319              $status = fwrite ($bf,start_tag("QUESTION_INSTANCES",4,true));
 320              //Iterate over each question_instance
 321              foreach ($quiz_question_instances as $que_ins) {
 322                  //Start question instance
 323                  $status = fwrite ($bf,start_tag("QUESTION_INSTANCE",5,true));
 324                  //Print question_instance contents
 325                  fwrite ($bf,full_tag("ID",6,false,$que_ins->id));
 326                  fwrite ($bf,full_tag("QUESTION",6,false,$que_ins->question));
 327                  fwrite ($bf,full_tag("GRADE",6,false,$que_ins->grade));
 328                  //End question instance
 329                  $status = fwrite ($bf,end_tag("QUESTION_INSTANCE",5,true));
 330              }
 331              //Write end tag
 332              $status = fwrite ($bf,end_tag("QUESTION_INSTANCES",4,true));
 333          }
 334          return $status;
 335      }
 336  
 337      //Backup quiz_question_instances contents (executed from quiz_backup_mods)
 338      function backup_quiz_feedback ($bf,$preferences,$quiz) {
 339          $status = true;
 340  
 341          $quiz_feedback = get_records('quiz_feedback', 'quizid', $quiz, 'id');
 342          // If there are question_instances ...
 343          if ($quiz_feedback) {
 344              // Write start tag.
 345              $status = $status & fwrite($bf,start_tag('FEEDBACKS', 4, true));
 346  
 347              // Iterate over each question_instance.
 348              foreach ($quiz_feedback as $feedback) {
 349  
 350                  //Start feedback instance
 351                  $status = $status & fwrite($bf, start_tag('FEEDBACK',5,true));
 352  
 353                  //Print question_instance contents.
 354                  $status = $status & fwrite($bf, full_tag('ID', 6, false, $feedback->id));
 355                  $status = $status & fwrite($bf, full_tag('QUIZID', 6, false, $feedback->quizid));
 356                  $status = $status & fwrite($bf, full_tag('FEEDBACKTEXT', 6, false, $feedback->feedbacktext));
 357                  $status = $status & fwrite($bf, full_tag('MINGRADE', 6, false, $feedback->mingrade));
 358                  $status = $status & fwrite($bf, full_tag('MAXGRADE', 6, false, $feedback->maxgrade));
 359  
 360                  // End feedback instance.
 361                  $status = $status & fwrite($bf, end_tag('FEEDBACK', 5, true));
 362              }
 363  
 364              // Write end tag.
 365              $status = $status & fwrite($bf, end_tag('FEEDBACKS', 4, true));
 366          }
 367          return $status;
 368      }
 369  
 370      //Backup quiz_question_versions contents (executed from quiz_backup_mods)
 371      function backup_quiz_question_versions ($bf,$preferences,$quiz) {
 372          $status = true;
 373  
 374          $quiz_question_versions = get_records("quiz_question_versions","quiz",$quiz,"id");
 375          //If there are question_versions
 376          if ($quiz_question_versions) {
 377              //Write start tag
 378              $status = fwrite ($bf,start_tag("QUESTION_VERSIONS",4,true));
 379              //Iterate over each question_version
 380              foreach ($quiz_question_versions as $que_ver) {
 381                  //Start question version
 382                  $status = fwrite ($bf,start_tag("QUESTION_VERSION",5,true));
 383                  //Print question_version contents
 384                  fwrite ($bf,full_tag("ID",6,false,$que_ver->id));
 385                  fwrite ($bf,full_tag("OLDQUESTION",6,false,$que_ver->oldquestion));
 386                  fwrite ($bf,full_tag("NEWQUESTION",6,false,$que_ver->newquestion));
 387                  fwrite ($bf,full_tag("ORIGINALQUESTION",6,false,$que_ver->originalquestion));
 388                  fwrite ($bf,full_tag("USERID",6,false,$que_ver->userid));
 389                  fwrite ($bf,full_tag("TIMESTAMP",6,false,$que_ver->timestamp));
 390                  //End question version
 391                  $status = fwrite ($bf,end_tag("QUESTION_VERSION",5,true));
 392              }
 393              //Write end tag
 394              $status = fwrite ($bf,end_tag("QUESTION_VERSIONS",4,true));
 395          }
 396          return $status;
 397      }
 398  
 399  
 400      //Backup quiz_grades contents (executed from quiz_backup_mods)
 401      function backup_quiz_grades ($bf,$preferences,$quiz) {
 402          $status = true;
 403  
 404          $quiz_grades = get_records("quiz_grades","quiz",$quiz,"id");
 405          //If there are grades
 406          if ($quiz_grades) {
 407              //Write start tag
 408              $status = fwrite ($bf,start_tag("GRADES",4,true));
 409              //Iterate over each grade
 410              foreach ($quiz_grades as $gra) {
 411                  //Start grade
 412                  $status = fwrite ($bf,start_tag("GRADE",5,true));
 413                  //Print grade contents
 414                  fwrite ($bf,full_tag("ID",6,false,$gra->id));
 415                  fwrite ($bf,full_tag("USERID",6,false,$gra->userid));
 416                  fwrite ($bf,full_tag("GRADEVAL",6,false,$gra->grade));
 417                  fwrite ($bf,full_tag("TIMEMODIFIED",6,false,$gra->timemodified));
 418                  //End question grade
 419                  $status = fwrite ($bf,end_tag("GRADE",5,true));
 420              }
 421              //Write end tag
 422              $status = fwrite ($bf,end_tag("GRADES",4,true));
 423          }
 424          return $status;
 425      }
 426  
 427      //Backup quiz_attempts contents (executed from quiz_backup_mods)
 428      function backup_quiz_attempts ($bf,$preferences,$quiz) {
 429          $status = true;
 430  
 431          $quiz_attempts = get_records("quiz_attempts","quiz",$quiz,"id");
 432          //If there are attempts
 433          if ($quiz_attempts) {
 434              //Write start tag
 435              $status = fwrite ($bf,start_tag("ATTEMPTS",4,true));
 436              //Iterate over each attempt
 437              foreach ($quiz_attempts as $attempt) {
 438                  //Start attempt
 439                  $status = fwrite ($bf,start_tag("ATTEMPT",5,true));
 440                  //Print attempt contents
 441                  fwrite ($bf,full_tag("ID",6,false,$attempt->id));
 442                  fwrite ($bf,full_tag("UNIQUEID",6,false,$attempt->uniqueid));
 443                  fwrite ($bf,full_tag("USERID",6,false,$attempt->userid));
 444                  fwrite ($bf,full_tag("ATTEMPTNUM",6,false,$attempt->attempt));
 445                  fwrite ($bf,full_tag("SUMGRADES",6,false,$attempt->sumgrades));
 446                  fwrite ($bf,full_tag("TIMESTART",6,false,$attempt->timestart));
 447                  fwrite ($bf,full_tag("TIMEFINISH",6,false,$attempt->timefinish));
 448                  fwrite ($bf,full_tag("TIMEMODIFIED",6,false,$attempt->timemodified));
 449                  fwrite ($bf,full_tag("LAYOUT",6,false,$attempt->layout));
 450                  fwrite ($bf,full_tag("PREVIEW",6,false,$attempt->preview));
 451                  //Now write to xml the states (in this attempt)
 452                  $status = backup_question_states ($bf,$preferences,$attempt->uniqueid);
 453                  //Now write to xml the sessions (in this attempt)
 454                  $status = backup_question_sessions ($bf,$preferences,$attempt->uniqueid);
 455                  //End attempt
 456                  $status = fwrite ($bf,end_tag("ATTEMPT",5,true));
 457              }
 458              //Write end tag
 459              $status = fwrite ($bf,end_tag("ATTEMPTS",4,true));
 460          }
 461          return $status;
 462      }
 463  
 464      function quiz_check_backup_mods_instances($instance,$backup_unique_code) {
 465          // the keys in this array need to be unique as they get merged...
 466          $info[$instance->id.'0'][0] = '<b>'.$instance->name.'</b>';
 467          $info[$instance->id.'0'][1] = '';
 468  
 469          //Categories
 470          $info[$instance->id.'1'][0] = get_string("categories","quiz");
 471          if ($ids = question_category_ids_by_backup ($backup_unique_code)) {
 472              $info[$instance->id.'1'][1] = count($ids);
 473          } else {
 474              $info[$instance->id.'1'][1] = 0;
 475          }
 476          //Questions
 477          $info[$instance->id.'2'][0] = get_string("questionsinclhidden","quiz");
 478          if ($ids = question_ids_by_backup ($backup_unique_code)) {
 479              $info[$instance->id.'2'][1] = count($ids);
 480          } else {
 481              $info[$instance->id.'2'][1] = 0;
 482          }
 483  
 484          //Now, if requested, the user_data
 485          if (!empty($instance->userdata)) {
 486              //Grades
 487              $info[$instance->id.'3'][0] = get_string("grades");
 488              if ($ids = quiz_grade_ids_by_instance ($instance->id)) {
 489                  $info[$instance->id.'3'][1] = count($ids);
 490              } else {
 491                  $info[$instance->id.'3'][1] = 0;
 492              }
 493          }
 494          return $info;
 495      }
 496  
 497     ////Return an array of info (name,value)
 498  /// $instances is an array with key = instanceid, value = object (name,id,userdata)
 499     function quiz_check_backup_mods($course,$user_data= false,$backup_unique_code,$instances=null) {
 500          //this function selects all the questions / categories to be backed up.
 501          quiz_insert_category_and_question_ids($course, $backup_unique_code, $instances);
 502          if ($course != SITEID){
 503              question_insert_site_file_names($course, $backup_unique_code);
 504          }
 505          if (!empty($instances) && is_array($instances) && count($instances)) {
 506              $info = array();
 507              foreach ($instances as $id => $instance) {
 508                  $info += quiz_check_backup_mods_instances($instance,$backup_unique_code);
 509              }
 510              return $info;
 511          }
 512          //First the course data
 513          $info[0][0] = get_string("modulenameplural","quiz");
 514          if ($ids = quiz_ids ($course)) {
 515              $info[0][1] = count($ids);
 516          } else {
 517              $info[0][1] = 0;
 518          }
 519          //Categories
 520          $info[1][0] = get_string("categories","quiz");
 521          if ($ids = question_category_ids_by_backup ($backup_unique_code)) {
 522              $info[1][1] = count($ids);
 523          } else {
 524              $info[1][1] = 0;
 525          }
 526          //Questions
 527          $info[2][0] = get_string("questions","quiz");
 528          if ($ids = question_ids_by_backup ($backup_unique_code)) {
 529              $info[2][1] = count($ids);
 530          } else {
 531              $info[2][1] = 0;
 532          }
 533  
 534          //Now, if requested, the user_data
 535          if ($user_data) {
 536              //Grades
 537              $info[3][0] = get_string("grades");
 538              if ($ids = quiz_grade_ids_by_course ($course)) {
 539                  $info[3][1] = count($ids);
 540              } else {
 541                  $info[3][1] = 0;
 542              }
 543          }
 544  
 545          return $info;
 546      }
 547  
 548      //Return a content encoded to support interactivities linking. Every module
 549      //should have its own. They are called automatically from the backup procedure.
 550      function quiz_encode_content_links ($content,$preferences) {
 551  
 552          global $CFG;
 553  
 554          $base = preg_quote($CFG->wwwroot,"/");
 555  
 556          //Link to the list of quizs
 557          $buscar="/(".$base."\/mod\/quiz\/index.php\?id\=)([0-9]+)/";
 558          $result= preg_replace($buscar,'$@QUIZINDEX*$2@$',$content);
 559  
 560          //Link to quiz view by moduleid
 561          $buscar="/(".$base."\/mod\/quiz\/view.php\?id\=)([0-9]+)/";
 562          $result= preg_replace($buscar,'$@QUIZVIEWBYID*$2@$',$result);
 563  
 564          //Link to quiz view by quizid
 565          $buscar="/(".$base."\/mod\/quiz\/view.php\?q\=)([0-9]+)/";
 566          $result= preg_replace($buscar,'$@QUIZVIEWBYQ*$2@$',$result);
 567  
 568          return $result;
 569      }
 570  
 571  // INTERNAL FUNCTIONS. BASED IN THE MOD STRUCTURE
 572  
 573      //Returns an array of quiz id
 574      function quiz_ids ($course) {
 575  
 576          global $CFG;
 577  
 578          return get_records_sql ("SELECT a.id, a.course
 579                                   FROM {$CFG->prefix}quiz a
 580                                   WHERE a.course = '$course'");
 581      }
 582  
 583      function quiz_grade_ids_by_course ($course) {
 584  
 585          global $CFG;
 586  
 587          return get_records_sql ("SELECT g.id, g.quiz
 588                                   FROM {$CFG->prefix}quiz a,
 589                                        {$CFG->prefix}quiz_grades g
 590                                   WHERE a.course = '$course' and
 591                                         g.quiz = a.id");
 592      }
 593  
 594      function quiz_grade_ids_by_instance($instanceid) {
 595  
 596          global $CFG;
 597  
 598          return get_records_sql ("SELECT g.id, g.quiz
 599                                   FROM {$CFG->prefix}quiz_grades g
 600                                   WHERE g.quiz = $instanceid");
 601      }
 602  
 603  ?>


Generated: Wed Jan 14 11:33:29 2009 Cross-referenced by PHPXref 0.7