Proyectos de Subversion Moodle

Rev

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 defines a structured class to hold question choices.
 *
 * @author Mike Churchward
 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
 * @package mod_questionnaire
 * @copyright 2019, onwards Poet
 */
class choice {

    // Class properties.

    /** The table name. */
    const TABLE = 'questionnaire_quest_choice';

    /** @var int $id The id of the question choice this applies to. */
    public $id;

    /** @var int $questionid The id of the question this choice applies to. */
    public $questionid;

    /** @var string $content The display content for this choice. */
    public $content;

    /** @var string $value Optional value assigned to this choice. */
    public $value;

    /**
     * Choice constructor.
     * @param int $id
     * @param int $questionid
     * @param string $content
     * @param mixed $value
     */
    public function __construct($id = null, $questionid = null, $content = null, $value = null) {
        $this->id = $id;
        $this->questionid = $questionid;
        $this->content = $content;
        $this->value = $value;
    }

    /**
     * Create and return a choice object from a data id. If not found, an empty object is returned.
     *
     * @param int $id The data id to load.
     * @return choice
     */
    public static function create_from_id($id) {
        global $DB;

        // Rename the data field question_id to questionid to conform with code conventions. Eventually, data table should be
        // changed.
        if ($record = $DB->get_record(self::tablename(), ['id' => $id], 'id,question_id as questionid,content,value')) {
            return new choice($id, $record->questionid, $record->content, $record->value);
        } else {
            return new choice();
        }
    }

    /**
     * Create and return a choice object from data.
     *
     * @param \stdclass|array $choicedata The data to load.
     * @return choice
     */
    public static function create_from_data($choicedata) {
        if (!is_array($choicedata)) {
            $choicedata = (array)$choicedata;
        }

        $properties = array_keys(get_class_vars(__CLASS__));
        foreach ($properties as $property) {
            if (!isset($choicedata[$property])) {
                $choicedata[$property] = null;
            }
        }
        // Since the data table uses 'question_id' instead of 'questionid', look for that field as well. Hack that should be fixed
        // by renaming the data table column.
        if (!empty($choicedata['question_id'])) {
            $choicedata['questionid'] = $choicedata['question_id'];
        }

        return new choice($choicedata['id'], $choicedata['questionid'], $choicedata['content'], $choicedata['value']);
    }

    /**
     * Return the table name for choice.
     */
    public static function tablename() {
        return self::TABLE;
    }

    /**
     * Delete the choice record.
     * @param int $id
     * @return bool
     */
    public static function delete_from_db_by_id($id) {
        global $DB;
        return $DB->delete_records(self::tablename(), ['id' => $id]);
    }

    /**
     * Delete this record from the DB.
     * @return bool
     */
    public function delete_from_db() {
        return self::delete_from_db_by_id($this->id);
    }

    /**
     * Return true if the content string is an "other" choice.
     *
     * @param string $content
     * @return bool
     */
    public static function content_is_other_choice($content) {
        return (strpos($content, '!other') === 0);
    }

    /**
     * Return true if the choice object is an "other" choice.
     *
     * @return bool
     */
    public function is_other_choice() {
        return (self::content_is_other_choice($this->content));
    }

    /**
     * Return the string to display for an "other" option content string. If the option is not an "other", return false.
     *
     * @param string $content
     * @return string|bool
     */
    public static function content_other_choice_display($content) {
        if (!self::content_is_other_choice($content)) {
            return false;
        }

        // If there is a defined string display after the "=", return it. Otherwise the "other" language string.
        return preg_replace(["/^!other=/", "/^!other/"], ['', get_string('other', 'questionnaire')], $content);
    }

    /**
     * Return the string to display for an "other" option for this object. If the option is not an "other", return false.
     *
     * @return string|bool
     */
    public function other_choice_display() {
        return self::content_other_choice_display($this->content);
    }

    /**
     * Is the content a named degree rate choice.
     * @param string $content
     * @return array|bool
     */
    public static function content_is_named_degree_choice($content) {
        if (preg_match("/^([0-9]{1,3})=(.*)$/", $content, $ndegrees)) {
            return [$ndegrees[1] => $ndegrees[2]];
        } else {
            return false;
        }
    }

    /**
     * Is the choice object a named degree rate choice.
     * @return array|bool
     */
    public function is_named_degree_choice() {
        return self::content_is_named_degree_choice($this->content);
    }

    /**
     * Return the string to use as an input name for an other choice.
     *
     * @param int $choiceid
     * @return string
     */
    public static function id_other_choice_name($choiceid) {
        return 'o' . $choiceid;
    }

    /**
     * Return the string to use as an input name for an other choice.
     * @return string
     */
    public function other_choice_name() {
        return self::id_other_choice_name($this->id);
    }
}