[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/mod/survey/classes/ -> external.php (source)

   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   * Survey external API
  19   *
  20   * @package    mod_survey
  21   * @category   external
  22   * @copyright  2015 Juan Leyva <juan@moodle.com>
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   * @since      Moodle 3.0
  25   */
  26  
  27  defined('MOODLE_INTERNAL') || die;
  28  
  29  require_once($CFG->libdir . '/externallib.php');
  30  require_once($CFG->dirroot . '/mod/survey/lib.php');
  31  
  32  /**
  33   * Survey external functions
  34   *
  35   * @package    mod_survey
  36   * @category   external
  37   * @copyright  2015 Juan Leyva <juan@moodle.com>
  38   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  39   * @since      Moodle 3.0
  40   */
  41  class mod_survey_external extends external_api {
  42  
  43      /**
  44       * Describes the parameters for get_surveys_by_courses.
  45       *
  46       * @return external_external_function_parameters
  47       * @since Moodle 3.0
  48       */
  49      public static function get_surveys_by_courses_parameters() {
  50          return new external_function_parameters (
  51              array(
  52                  'courseids' => new external_multiple_structure(
  53                      new external_value(PARAM_INT, 'course id'), 'Array of course ids', VALUE_DEFAULT, array()
  54                  ),
  55              )
  56          );
  57      }
  58  
  59      /**
  60       * Returns a list of surveys in a provided list of courses,
  61       * if no list is provided all surveys that the user can view will be returned.
  62       *
  63       * @param array $courseids the course ids
  64       * @return array of surveys details
  65       * @since Moodle 3.0
  66       */
  67      public static function get_surveys_by_courses($courseids = array()) {
  68          global $CFG, $USER, $DB;
  69  
  70          $returnedsurveys = array();
  71          $warnings = array();
  72  
  73          $params = self::validate_parameters(self::get_surveys_by_courses_parameters(), array('courseids' => $courseids));
  74  
  75          $mycourses = array();
  76          if (empty($params['courseids'])) {
  77              $mycourses = enrol_get_my_courses();
  78              $params['courseids'] = array_keys($mycourses);
  79          }
  80  
  81          // Ensure there are courseids to loop through.
  82          if (!empty($params['courseids'])) {
  83  
  84              list($courses, $warnings) = external_util::validate_courses($params['courseids'], $mycourses);
  85  
  86              // Get the surveys in this course, this function checks users visibility permissions.
  87              // We can avoid then additional validate_context calls.
  88              $surveys = get_all_instances_in_courses("survey", $courses);
  89              foreach ($surveys as $survey) {
  90                  $context = context_module::instance($survey->coursemodule);
  91                  // Entry to return.
  92                  $surveydetails = array();
  93                  // First, we return information that any user can see in the web interface.
  94                  $surveydetails['id'] = $survey->id;
  95                  $surveydetails['coursemodule']      = $survey->coursemodule;
  96                  $surveydetails['course']            = $survey->course;
  97                  $surveydetails['name']              = external_format_string($survey->name, $context->id);
  98  
  99                  if (has_capability('mod/survey:participate', $context)) {
 100                      $trimmedintro = trim($survey->intro);
 101                      if (empty($trimmedintro)) {
 102                          $tempo = $DB->get_field("survey", "intro", array("id" => $survey->template));
 103                          $survey->intro = get_string($tempo, "survey");
 104                      }
 105  
 106                      // Format intro.
 107                      list($surveydetails['intro'], $surveydetails['introformat']) =
 108                          external_format_text($survey->intro, $survey->introformat, $context->id, 'mod_survey', 'intro', null);
 109                      $surveydetails['introfiles'] = external_util::get_area_files($context->id, 'mod_survey', 'intro', false,
 110                                                                                      false);
 111  
 112                      $surveydetails['template']  = $survey->template;
 113                      $surveydetails['days']      = $survey->days;
 114                      $surveydetails['questions'] = $survey->questions;
 115                      $surveydetails['surveydone'] = survey_already_done($survey->id, $USER->id) ? 1 : 0;
 116  
 117                  }
 118  
 119                  if (has_capability('moodle/course:manageactivities', $context)) {
 120                      $surveydetails['timecreated']   = $survey->timecreated;
 121                      $surveydetails['timemodified']  = $survey->timemodified;
 122                      $surveydetails['section']       = $survey->section;
 123                      $surveydetails['visible']       = $survey->visible;
 124                      $surveydetails['groupmode']     = $survey->groupmode;
 125                      $surveydetails['groupingid']    = $survey->groupingid;
 126                  }
 127                  $returnedsurveys[] = $surveydetails;
 128              }
 129          }
 130          $result = array();
 131          $result['surveys'] = $returnedsurveys;
 132          $result['warnings'] = $warnings;
 133          return $result;
 134      }
 135  
 136      /**
 137       * Describes the get_surveys_by_courses return value.
 138       *
 139       * @return external_single_structure
 140       * @since Moodle 3.0
 141       */
 142      public static function get_surveys_by_courses_returns() {
 143          return new external_single_structure(
 144              array(
 145                  'surveys' => new external_multiple_structure(
 146                      new external_single_structure(
 147                          array(
 148                              'id' => new external_value(PARAM_INT, 'Survey id'),
 149                              'coursemodule' => new external_value(PARAM_INT, 'Course module id'),
 150                              'course' => new external_value(PARAM_INT, 'Course id'),
 151                              'name' => new external_value(PARAM_RAW, 'Survey name'),
 152                              'intro' => new external_value(PARAM_RAW, 'The Survey intro', VALUE_OPTIONAL),
 153                              'introformat' => new external_format_value('intro', VALUE_OPTIONAL),
 154                              'introfiles' => new external_files('Files in the introduction text', VALUE_OPTIONAL),
 155                              'template' => new external_value(PARAM_INT, 'Survey type', VALUE_OPTIONAL),
 156                              'days' => new external_value(PARAM_INT, 'Days', VALUE_OPTIONAL),
 157                              'questions' => new external_value(PARAM_RAW, 'Question ids', VALUE_OPTIONAL),
 158                              'surveydone' => new external_value(PARAM_INT, 'Did I finish the survey?', VALUE_OPTIONAL),
 159                              'timecreated' => new external_value(PARAM_INT, 'Time of creation', VALUE_OPTIONAL),
 160                              'timemodified' => new external_value(PARAM_INT, 'Time of last modification', VALUE_OPTIONAL),
 161                              'section' => new external_value(PARAM_INT, 'Course section id', VALUE_OPTIONAL),
 162                              'visible' => new external_value(PARAM_INT, 'Visible', VALUE_OPTIONAL),
 163                              'groupmode' => new external_value(PARAM_INT, 'Group mode', VALUE_OPTIONAL),
 164                              'groupingid' => new external_value(PARAM_INT, 'Group id', VALUE_OPTIONAL),
 165                          ), 'Surveys'
 166                      )
 167                  ),
 168                  'warnings' => new external_warnings(),
 169              )
 170          );
 171      }
 172  
 173      /**
 174       * Returns description of method parameters
 175       *
 176       * @return external_function_parameters
 177       * @since Moodle 3.0
 178       */
 179      public static function view_survey_parameters() {
 180          return new external_function_parameters(
 181              array(
 182                  'surveyid' => new external_value(PARAM_INT, 'survey instance id')
 183              )
 184          );
 185      }
 186  
 187      /**
 188       * Trigger the course module viewed event and update the module completion status.
 189       *
 190       * @param int $surveyid the survey instance id
 191       * @return array of warnings and status result
 192       * @since Moodle 3.0
 193       * @throws moodle_exception
 194       */
 195      public static function view_survey($surveyid) {
 196          global $DB, $USER;
 197  
 198          $params = self::validate_parameters(self::view_survey_parameters(),
 199                                              array(
 200                                                  'surveyid' => $surveyid
 201                                              ));
 202          $warnings = array();
 203  
 204          // Request and permission validation.
 205          $survey = $DB->get_record('survey', array('id' => $params['surveyid']), '*', MUST_EXIST);
 206          list($course, $cm) = get_course_and_cm_from_instance($survey, 'survey');
 207  
 208          $context = context_module::instance($cm->id);
 209          self::validate_context($context);
 210          require_capability('mod/survey:participate', $context);
 211  
 212          $viewed = survey_already_done($survey->id, $USER->id) ? 'graph' : 'form';
 213  
 214          // Trigger course_module_viewed event and completion.
 215          survey_view($survey, $course, $cm, $context, $viewed);
 216  
 217          $result = array();
 218          $result['status'] = true;
 219          $result['warnings'] = $warnings;
 220          return $result;
 221      }
 222  
 223      /**
 224       * Returns description of method result value
 225       *
 226       * @return external_description
 227       * @since Moodle 3.0
 228       */
 229      public static function view_survey_returns() {
 230          return new external_single_structure(
 231              array(
 232                  'status' => new external_value(PARAM_BOOL, 'status: true if success'),
 233                  'warnings' => new external_warnings()
 234              )
 235          );
 236      }
 237  
 238      /**
 239       * Returns description of method parameters
 240       *
 241       * @return external_function_parameters
 242       * @since Moodle 3.0
 243       */
 244      public static function get_questions_parameters() {
 245          return new external_function_parameters(
 246              array(
 247                  'surveyid' => new external_value(PARAM_INT, 'survey instance id')
 248              )
 249          );
 250      }
 251  
 252      /**
 253       * Get the complete list of questions for the survey, including subquestions.
 254       *
 255       * @param int $surveyid the survey instance id
 256       * @return array of warnings and the question list
 257       * @since Moodle 3.0
 258       * @throws moodle_exception
 259       */
 260      public static function get_questions($surveyid) {
 261          global $DB, $USER;
 262  
 263          $params = self::validate_parameters(self::get_questions_parameters(),
 264                                              array(
 265                                                  'surveyid' => $surveyid
 266                                              ));
 267          $warnings = array();
 268  
 269          // Request and permission validation.
 270          $survey = $DB->get_record('survey', array('id' => $params['surveyid']), '*', MUST_EXIST);
 271          list($course, $cm) = get_course_and_cm_from_instance($survey, 'survey');
 272  
 273          $context = context_module::instance($cm->id);
 274          self::validate_context($context);
 275          require_capability('mod/survey:participate', $context);
 276  
 277          $mainquestions = survey_get_questions($survey);
 278  
 279          foreach ($mainquestions as $question) {
 280              if ($question->type >= 0) {
 281                  // Parent is used in subquestions.
 282                  $question->parent = 0;
 283                  $questions[] = survey_translate_question($question);
 284  
 285                  // Check if the question has subquestions.
 286                  if ($question->multi) {
 287                      $subquestions = survey_get_subquestions($question);
 288                      foreach ($subquestions as $sq) {
 289                          $sq->parent = $question->id;
 290                          $questions[] = survey_translate_question($sq);
 291                      }
 292                  }
 293              }
 294          }
 295  
 296          $result = array();
 297          $result['questions'] = $questions;
 298          $result['warnings'] = $warnings;
 299          return $result;
 300      }
 301  
 302      /**
 303       * Returns description of method result value
 304       *
 305       * @return external_description
 306       * @since Moodle 3.0
 307       */
 308      public static function get_questions_returns() {
 309          return new external_single_structure(
 310              array(
 311                  'questions' => new external_multiple_structure(
 312                      new external_single_structure(
 313                          array(
 314                              'id' => new external_value(PARAM_INT, 'Question id'),
 315                              'text' => new external_value(PARAM_RAW, 'Question text'),
 316                              'shorttext' => new external_value(PARAM_RAW, 'Question short text'),
 317                              'multi' => new external_value(PARAM_RAW, 'Subquestions ids'),
 318                              'intro' => new external_value(PARAM_RAW, 'The question intro'),
 319                              'type' => new external_value(PARAM_INT, 'Question type'),
 320                              'options' => new external_value(PARAM_RAW, 'Question options'),
 321                              'parent' => new external_value(PARAM_INT, 'Parent question (for subquestions)'),
 322                          ), 'Questions'
 323                      )
 324                  ),
 325                  'warnings' => new external_warnings()
 326              )
 327          );
 328      }
 329  
 330      /**
 331       * Describes the parameters for submit_answers.
 332       *
 333       * @return external_function_parameters
 334       * @since Moodle 3.0
 335       */
 336      public static function submit_answers_parameters() {
 337          return new external_function_parameters(
 338              array(
 339                  'surveyid' => new external_value(PARAM_INT, 'Survey id'),
 340                  'answers' => new external_multiple_structure(
 341                      new external_single_structure(
 342                          array(
 343                              'key' => new external_value(PARAM_RAW, 'Answer key'),
 344                              'value' => new external_value(PARAM_RAW, 'Answer value')
 345                          )
 346                      )
 347                  ),
 348              )
 349          );
 350      }
 351  
 352      /**
 353       * Submit the answers for a given survey.
 354       *
 355       * @param int $surveyid the survey instance id
 356       * @param array $answers the survey answers
 357       * @return array of warnings and status result
 358       * @since Moodle 3.0
 359       * @throws moodle_exception
 360       */
 361      public static function submit_answers($surveyid, $answers) {
 362          global $DB, $USER;
 363  
 364          $params = self::validate_parameters(self::submit_answers_parameters(),
 365                                              array(
 366                                                  'surveyid' => $surveyid,
 367                                                  'answers' => $answers
 368                                              ));
 369          $warnings = array();
 370  
 371          // Request and permission validation.
 372          $survey = $DB->get_record('survey', array('id' => $params['surveyid']), '*', MUST_EXIST);
 373          list($course, $cm) = get_course_and_cm_from_instance($survey, 'survey');
 374  
 375          $context = context_module::instance($cm->id);
 376          self::validate_context($context);
 377          require_capability('mod/survey:participate', $context);
 378  
 379          if (survey_already_done($survey->id, $USER->id)) {
 380              throw new moodle_exception("alreadysubmitted", "survey");
 381          }
 382  
 383          // Build the answers array. Data is cleaned inside the survey_save_answers function.
 384          $answers = array();
 385          foreach ($params['answers'] as $answer) {
 386              $key = $answer['key'];
 387              $answers[$key] = $answer['value'];
 388          }
 389  
 390          survey_save_answers($survey, $answers, $course, $context);
 391  
 392          $result = array();
 393          $result['status'] = true;
 394          $result['warnings'] = $warnings;
 395          return $result;
 396      }
 397  
 398      /**
 399       * Returns description of method result value
 400       *
 401       * @return external_description
 402       * @since Moodle 3.0
 403       */
 404      public static function submit_answers_returns() {
 405          return new external_single_structure(
 406              array(
 407                  'status' => new external_value(PARAM_BOOL, 'status: true if success'),
 408                  'warnings' => new external_warnings()
 409              )
 410          );
 411      }
 412  
 413  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1