Search moodle.org's
Developer Documentation

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * prints the form to import items from xml-file
  19   *
  20   * @author Andreas Grabs
  21   * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
  22   * @package mod_feedback
  23   */
  24  
  25  require_once("../../config.php");
  26  require_once ("lib.php");
  27  require_once ('import_form.php');
  28  
  29  // get parameters
  30  $id = required_param('id', PARAM_INT);
  31  $choosefile = optional_param('choosefile', false, PARAM_PATH);
  32  $action = optional_param('action', false, PARAM_ALPHA);
  33  
  34  $url = new moodle_url('/mod/feedback/import.php', array('id'=>$id));
  35  if ($choosefile !== false) {
  36      $url->param('choosefile', $choosefile);
  37  }
  38  if ($action !== false) {
  39      $url->param('action', $action);
  40  }
  41  $PAGE->set_url($url);
  42  
  43  if (! $cm = get_coursemodule_from_id('feedback', $id)) {
  44      print_error('invalidcoursemodule');
  45  }
  46  
  47  if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
  48      print_error('coursemisconf');
  49  }
  50  
  51  if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
  52      print_error('invalidcoursemodule');
  53  }
  54  
  55  $context = context_module::instance($cm->id);
  56  
  57  require_login($course, true, $cm);
  58  
  59  require_capability('mod/feedback:edititems', $context);
  60  
  61  $mform = new feedback_import_form();
  62  $newformdata = array('id'=>$id,
  63                      'deleteolditems'=>'1',
  64                      'action'=>'choosefile',
  65                      'confirmadd'=>'1',
  66                      'do_show'=>'templates');
  67  $mform->set_data($newformdata);
  68  $formdata = $mform->get_data();
  69  
  70  if ($mform->is_cancelled()) {
  71      redirect('edit.php?id='.$id.'&do_show=templates');
  72  }
  73  
  74  // process if we are happy file is ok
  75  if ($choosefile) {
  76      $xmlcontent = $mform->get_file_content('choosefile');
  77  
  78      if (!$xmldata = feedback_load_xml_data($xmlcontent)) {
  79          print_error('cannotloadxml', 'feedback', 'edit.php?id='.$id);
  80      }
  81  
  82      $importerror = feedback_import_loaded_data($xmldata, $feedback->id);
  83      if ($importerror->stat == true) {
  84          $url = 'edit.php?id='.$id.'&do_show=templates';
  85          redirect($url, get_string('import_successfully', 'feedback'), 3);
  86          exit;
  87      }
  88  }
  89  
  90  
  91  /// Print the page header
  92  $strfeedbacks = get_string("modulenameplural", "feedback");
  93  $strfeedback  = get_string("modulename", "feedback");
  94  
  95  $PAGE->set_heading($course->fullname);
  96  $PAGE->set_title($feedback->name);
  97  echo $OUTPUT->header();
  98  echo $OUTPUT->heading(format_string($feedback->name));
  99  /// print the tabs
 100  require ('tabs.php');
 101  
 102  /// Print the main part of the page
 103  ///////////////////////////////////////////////////////////////////////////
 104  ///////////////////////////////////////////////////////////////////////////
 105  ///////////////////////////////////////////////////////////////////////////
 106  echo $OUTPUT->heading(get_string('import_questions', 'feedback'), 3);
 107  
 108  if (isset($importerror->msg) AND is_array($importerror->msg)) {
 109      echo $OUTPUT->box_start('generalbox errorboxcontent boxaligncenter');
 110      foreach ($importerror->msg as $msg) {
 111          echo $msg.'<br />';
 112      }
 113      echo $OUTPUT->box_end();
 114  }
 115  
 116  $mform->display();
 117  
 118  echo $OUTPUT->footer();
 119  
 120  function feedback_load_xml_data($xmlcontent) {
 121      global $CFG;
 122      require_once($CFG->dirroot.'/lib/xmlize.php');
 123  
 124      if (!$xmlcontent = feedback_check_xml_utf8($xmlcontent)) {
 125          return false;
 126      }
 127  
 128      $data = xmlize($xmlcontent, 1, 'UTF-8');
 129  
 130      if (intval($data['FEEDBACK']['@']['VERSION']) != 200701) {
 131          return false;
 132      }
 133      $data = $data['FEEDBACK']['#']['ITEMS'][0]['#']['ITEM'];
 134      return $data;
 135  }
 136  
 137  function feedback_import_loaded_data(&$data, $feedbackid) {
 138      global $CFG, $DB;
 139  
 140      feedback_load_feedback_items();
 141  
 142      $deleteolditems = optional_param('deleteolditems', 0, PARAM_INT);
 143  
 144      $error = new stdClass();
 145      $error->stat = true;
 146      $error->msg = array();
 147  
 148      if (!is_array($data)) {
 149          $error->msg[] = get_string('data_is_not_an_array', 'feedback');
 150          $error->stat = false;
 151          return $error;
 152      }
 153  
 154      if ($deleteolditems) {
 155          feedback_delete_all_items($feedbackid);
 156          $position = 0;
 157      } else {
 158          //items will be add to the end of the existing items
 159          $position = $DB->count_records('feedback_item', array('feedback'=>$feedbackid));
 160      }
 161  
 162      //depend items we are storing temporary in an mapping list array(new id => dependitem)
 163      //we also store a mapping of all items array(oldid => newid)
 164      $dependitemsmap = array();
 165      $itembackup = array();
 166      foreach ($data as $item) {
 167          $position++;
 168          //check the typ
 169          $typ = $item['@']['TYPE'];
 170  
 171          //check oldtypes first
 172          switch($typ) {
 173              case 'radio':
 174                  $typ = 'multichoice';
 175                  $oldtyp = 'radio';
 176                  break;
 177              case 'dropdown':
 178                  $typ = 'multichoice';
 179                  $oldtyp = 'dropdown';
 180                  break;
 181              case 'check':
 182                  $typ = 'multichoice';
 183                  $oldtyp = 'check';
 184                  break;
 185              case 'radiorated':
 186                  $typ = 'multichoicerated';
 187                  $oldtyp = 'radiorated';
 188                  break;
 189              case 'dropdownrated':
 190                  $typ = 'multichoicerated';
 191                  $oldtyp = 'dropdownrated';
 192                  break;
 193              default:
 194                  $oldtyp = $typ;
 195          }
 196  
 197          $itemclass = 'feedback_item_'.$typ;
 198          if ($typ != 'pagebreak' AND !class_exists($itemclass)) {
 199              $error->stat = false;
 200              $error->msg[] = 'type ('.$typ.') not found';
 201              continue;
 202          }
 203          $itemobj = new $itemclass();
 204  
 205          $newitem = new stdClass();
 206          $newitem->feedback = $feedbackid;
 207          $newitem->template = 0;
 208          $newitem->typ = $typ;
 209          $newitem->name = trim($item['#']['ITEMTEXT'][0]['#']);
 210          $newitem->label = trim($item['#']['ITEMLABEL'][0]['#']);
 211          $newitem->options = trim($item['#']['OPTIONS'][0]['#']);
 212          $newitem->presentation = trim($item['#']['PRESENTATION'][0]['#']);
 213          //check old types of radio, check, and so on
 214          switch($oldtyp) {
 215              case 'radio':
 216                  $newitem->presentation = 'r>>>>>'.$newitem->presentation;
 217                  break;
 218              case 'dropdown':
 219                  $newitem->presentation = 'd>>>>>'.$newitem->presentation;
 220                  break;
 221              case 'check':
 222                  $newitem->presentation = 'c>>>>>'.$newitem->presentation;
 223                  break;
 224              case 'radiorated':
 225                  $newitem->presentation = 'r>>>>>'.$newitem->presentation;
 226                  break;
 227              case 'dropdownrated':
 228                  $newitem->presentation = 'd>>>>>'.$newitem->presentation;
 229                  break;
 230          }
 231  
 232          if (isset($item['#']['DEPENDITEM'][0]['#'])) {
 233              $newitem->dependitem = intval($item['#']['DEPENDITEM'][0]['#']);
 234          } else {
 235              $newitem->dependitem = 0;
 236          }
 237          if (isset($item['#']['DEPENDVALUE'][0]['#'])) {
 238              $newitem->dependvalue = trim($item['#']['DEPENDVALUE'][0]['#']);
 239          } else {
 240              $newitem->dependvalue = '';
 241          }
 242          $olditemid = intval($item['#']['ITEMID'][0]['#']);
 243  
 244          if ($typ != 'pagebreak') {
 245              $newitem->hasvalue = $itemobj->get_hasvalue();
 246          } else {
 247              $newitem->hasvalue = 0;
 248          }
 249          $newitem->required = intval($item['@']['REQUIRED']);
 250          $newitem->position = $position;
 251          $newid = $DB->insert_record('feedback_item', $newitem);
 252  
 253          $itembackup[$olditemid] = $newid;
 254          if ($newitem->dependitem) {
 255              $dependitemsmap[$newid] = $newitem->dependitem;
 256          }
 257  
 258      }
 259      //remapping the dependency
 260      foreach ($dependitemsmap as $key => $dependitem) {
 261          $newitem = $DB->get_record('feedback_item', array('id'=>$key));
 262          $newitem->dependitem = $itembackup[$newitem->dependitem];
 263          $DB->update_record('feedback_item', $newitem);
 264      }
 265  
 266      return $error;
 267  }
 268  
 269  function feedback_check_xml_utf8($text) {
 270      //find the encoding
 271      $searchpattern = '/^\<\?xml.+(encoding=\"([a-z0-9-]*)\").+\?\>/is';
 272  
 273      if (!preg_match($searchpattern, $text, $match)) {
 274          return false; //no xml-file
 275      }
 276  
 277      //$match[0] = \<\? xml ... \?\> (without \)
 278      //$match[1] = encoding="...."
 279      //$match[2] = ISO-8859-1 or so on
 280      if (isset($match[0]) AND !isset($match[1])) { //no encoding given. we assume utf-8
 281          return $text;
 282      }
 283  
 284      //encoding is given in $match[2]
 285      if (isset($match[0]) AND isset($match[1]) AND isset($match[2])) {
 286          $enc = $match[2];
 287          return core_text::convert($text, $enc);
 288      }
 289  }

Search This Site: