AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace mod_questionnaire\question;
/**
* This file contains the parent class for yesno question types.
*
* @author Mike Churchward
* @copyright 2016 onward Mike Churchward (mike.churchward@poetopensource.org)
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package mod_questionnaire
*/
class yesno extends question {
/**
* Each question type must define its response class.
* @return object The response object based off of questionnaire_response_base.
*/
protected function responseclass() {
return '\\mod_questionnaire\\responsetype\\boolean';
}
/**
* Short name for this question type - no spaces, etc..
* @return string
*/
public function helpname() {
return 'yesno';
}
/**
* Override and return a form template if provided. Output of question_survey_display is iterpreted based on this.
* @return string
*/
public function question_template() {
return 'mod_questionnaire/question_yesno';
}
/**
* Override and return a response template if provided. Output of question_survey_display is iterpreted based on this.
* @return string
*/
public function response_template() {
return 'mod_questionnaire/response_yesno';
}
/**
* Override this and return true if the question type allows dependent questions.
* @return bool
*/
public function allows_dependents() {
return true;
}
/**
* True if question type supports feedback options. False by default.
* @return bool
*/
public function supports_feedback() {
return true;
}
/**
* True if the question supports feedback and has valid settings for feedback. Override if the default logic is not enough.
* @return bool
*/
public function valid_feedback() {
return $this->required();
}
/**
* Get the maximum score possible for feedback if appropriate. Override if default behaviour is not correct.
* @return int | boolean
*/
public function get_feedback_maxscore() {
if ($this->valid_feedback()) {
$maxscore = 1;
} else {
$maxscore = false;
}
return $maxscore;
}
/**
* Returns an array of dependency options for the question as an array of id value / display value pairs. Override in specific
* question types that support this.
* @return array An array of valid pair options.
*/
protected function get_dependency_options() {
$options = [];
if ($this->name != '') {
$options[$this->id . ',0'] = $this->name . '->' . get_string('yes');
$options[$this->id . ',1'] = $this->name . '->' . get_string('no');
}
return $options;
}
/**
* Return the context tags for the check question template.
* @param \mod_questionnaire\responsetype\response\response $response
* @param array $dependants Array of all questions/choices depending on this question.
* @param boolean $blankquestionnaire
* @return object The check question context tags.
* @throws \coding_exception
*/
protected function question_survey_display($response, $dependants=[], $blankquestionnaire=false) {
global $idcounter; // To make sure all radio buttons have unique ids. // JR 20 NOV 2007.
$stryes = get_string('yes');
$strno = get_string('no');
$val1 = 'y';
$val2 = 'n';
if ($blankquestionnaire) {
$stryes = ' (1) '.$stryes;
$strno = ' (0) '.$strno;
}
$options = [$val1 => $stryes, $val2 => $strno];
$name = 'q'.$this->id;
$checked = (isset($response->answers[$this->id][0]) ? $response->answers[$this->id][0]->value : '');
$ischecked = false;
$choicetags = new \stdClass();
$choicetags->qelements = new \stdClass();
$choicetags->qelements->choice = [];
foreach ($options as $value => $label) {
$htmlid = 'auto-rb'.sprintf('%04d', ++$idcounter);
$option = new \stdClass();
$option->name = $name;
$option->id = $htmlid;
$option->value = $value;
$option->label = $label;
if ($value == $checked) {
$option->checked = true;
$ischecked = true;
}
if ($blankquestionnaire) {
$option->disabled = true;
}
$choicetags->qelements->choice[] = $option;
}
// CONTRIB-846.
if (!$this->required()) {
$id = '';
$htmlid = 'auto-rb'.sprintf('%04d', ++$idcounter);
$content = get_string('noanswer', 'questionnaire');
$option = new \stdClass();
$option->name = $name;
$option->id = $htmlid;
$option->value = $id;
$option->label = format_text($content, FORMAT_HTML, ['noclean' => true]);
if (!$ischecked && !$blankquestionnaire) {
$option->checked = true;
}
$choicetags->qelements->choice[] = $option;
}
// End CONTRIB-846.
return $choicetags;
}
/**
* Return the context tags for the text response template.
* @param \mod_questionnaire\responsetype\response\response $response
* @return object The radio question response context tags.
* @throws \coding_exception
*/
protected function response_survey_display($response) {
static $uniquetag = 0; // To make sure all radios have unique names.
$resptags = new \stdClass();
$resptags->yesname = 'q'.$this->id.$uniquetag++.'y';
$resptags->noname = 'q'.$this->id.$uniquetag++.'n';
$resptags->stryes = get_string('yes');
$resptags->strno = get_string('no');
if (!isset($response->answers[$this->id])) {
$response->answers[$this->id][] = new \mod_questionnaire\responsetype\answer\answer();
}
$answer = reset($response->answers[$this->id]);
if ($answer->value == 'y') {
$resptags->yesselected = 1;
}
if ($answer->value == 'n') {
$resptags->noselected = 1;
}
return $resptags;
}
/**
* Return the length form element.
* @param \MoodleQuickForm $mform
* @param string $helpname
*/
protected function form_length(\MoodleQuickForm $mform, $helpname = '') {
return question::form_length_hidden($mform);
}
/**
* Return the precision form element.
* @param \MoodleQuickForm $mform
* @param string $helpname
*/
protected function form_precise(\MoodleQuickForm $mform, $helpname = '') {
return question::form_precise_hidden($mform);
}
/**
* True if question provides mobile support.
*
* @return bool
*/
public function supports_mobile() {
return true;
}
/**
* Override and return false if not supporting mobile app.
* @param int $qnum
* @param bool $autonum
* @return \stdClass
*/
public function mobile_question_display($qnum, $autonum = false) {
$mobiledata = parent::mobile_question_display($qnum, $autonum);
$mobiledata->isbool = true;
return $mobiledata;
}
/**
* Override and return false if not supporting mobile app.
* @return array
*/
public function mobile_question_choices_display() {
$choices = [];
$choices[0] = new \stdClass();
$choices[0]->id = 0;
$choices[0]->choice_id = 'n';
$choices[0]->question_id = $this->id;
$choices[0]->value = null;
$choices[0]->content = get_string('no');
$choices[0]->isbool = true;
$choices[1] = new \stdClass();
$choices[1]->id = 1;
$choices[1]->choice_id = 'y';
$choices[1]->question_id = $this->id;
$choices[1]->value = null;
$choices[1]->content = get_string('yes');
$choices[1]->isbool = true;
if ($this->required()) {
$choices[1]->value = 'y';
$choices[1]->firstone = true;
}
return $choices;
}
/**
* Return the mobile response data.
* @param response $response
* @return array
*/
public function get_mobile_response_data($response) {
$resultdata = [];
if (isset($response->answers[$this->id][0]) && ($response->answers[$this->id][0]->value == 'n')) {
$resultdata[$this->mobile_fieldkey()] = 0;
} else if (isset($response->answers[$this->id][0]) && ($response->answers[$this->id][0]->value == 'y')) {
$resultdata[$this->mobile_fieldkey()] = 1;
}
return $resultdata;
}
}