HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/apklausos/application/models/QuestionType.php
<?php

/**
 * Class QuestionType
 * @property Question $question
 * @property QuestionRenderer $questionRenderer
 * @property string $fieldType The type of field question needs for storing data
 * @property string $fieldDataType numeric vs string types
 * @property boolean $isText Whether the type is text (string longer than char)
 * @property boolean $isChar Whether the type is char (one-character-string)
 * @property boolean $isString Whether the type is string (text or char)
 * @property boolean $isNumeric Whether the type numeric (integer, double)
 * @property boolean $isInteger Whether the type integer
 *
 * {@inheritdoc}
 */
class QuestionType extends StaticModel
{
    const QT_1_ARRAY_DUAL = '1'; // Array dual scale
    const QT_5_POINT_CHOICE = '5';
    const QT_A_ARRAY_5_POINT = 'A'; // Array of 5 point choice questions
    const QT_B_ARRAY_10_POINT = 'B'; // Array of 10 point choice questions
    const QT_C_ARRAY_YES_UNCERTAIN_NO = 'C'; // ARRAY OF Yes\No\Uncertain questions
    const QT_D_DATE = 'D';
    const QT_E_ARRAY_INC_SAME_DEC = 'E';
    const QT_F_ARRAY = 'F';
    const QT_G_GENDER = 'G';
    const QT_H_ARRAY_COLUMN = 'H';
    const QT_I_LANGUAGE = 'I';
    const QT_K_MULTIPLE_NUMERICAL = 'K';
    const QT_L_LIST = 'L';
    const QT_M_MULTIPLE_CHOICE = 'M';
    const QT_N_NUMERICAL = 'N';
    const QT_O_LIST_WITH_COMMENT = 'O';
    const QT_P_MULTIPLE_CHOICE_WITH_COMMENTS = 'P';
    const QT_Q_MULTIPLE_SHORT_TEXT = 'Q';
    const QT_R_RANKING = 'R';
    const QT_S_SHORT_FREE_TEXT = 'S';
    const QT_T_LONG_FREE_TEXT = 'T';
    const QT_U_HUGE_FREE_TEXT = 'U';
    const QT_X_TEXT_DISPLAY = 'X';
    const QT_Y_YES_NO_RADIO = 'Y';
    const QT_EXCLAMATION_LIST_DROPDOWN = '!';
    const QT_VERTICAL_FILE_UPLOAD = '|';
    const QT_ASTERISK_EQUATION = '*';
    const QT_COLON_ARRAY_NUMBERS = ':';
    const QT_SEMICOLON_ARRAY_TEXT = ';';

    /*
    * @deprecated The following constants are deprecated and will be removed in LimeSurvey 6 - please use the ones above.
    */
    const QT_1_ARRAY_MULTISCALE = '1'; //ARRAY (Flexible Labels) multi scale
    const QT_A_ARRAY_5_CHOICE_QUESTIONS = 'A'; // ARRAY OF 5 POINT CHOICE QUESTIONS
    const QT_E_ARRAY_OF_INC_SAME_DEC_QUESTIONS = 'E';
    const QT_F_ARRAY_FLEXIBLE_ROW = 'F';
    const QT_G_GENDER_DROPDOWN = 'G';
    const QT_H_ARRAY_FLEXIBLE_COLUMN = 'H';
    const QT_K_MULTIPLE_NUMERICAL_QUESTION = 'K';
    const QT_R_RANKING_STYLE = 'R';
    const QT_X_BOILERPLATE_QUESTION = 'X';
    const QT_COLON_ARRAY_MULTI_FLEX_NUMBERS = ':';
    const QT_SEMICOLON_ARRAY_MULTI_FLEX_TEXT = ';';


    /** @var Question */
    public $question;

    /** @var string $code */
    public $code;

    /** @var string $description */
    public $description;

    /** @var string $group Group name*/
    public $group;

    /** @var integer $subquestions whether has subquestions //TODO make it boolean instead */
    public $subquestions;

    /** @var boolean $other allow other (and add subquetsion title other if Y)*/
    public $other = false;

    /** @var integer $assessable whether it can be used inside Assessments / Quizmode */
    public $assessable;

    /** @var integer $ahasdefaultvalues whether has default values */
    public $hasdefaultvalues;

    /** @var integer $answerscales number of answer scales*/
    public $answerscales;

    /** @var string $class the css class for question (container??)*/
    public $class;



    /**
     * {@inheritdoc}
     */
    public function attributeNames()
    {
        return [
            'code',
            'description',
            'group',
            'subquestions',
            'other',
            'assessable',
            'hasdefaultvalues',
            'answerscales',
            'class'
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'code' => gT("Code"),
            'description' => gT("Description"),
            'group' => gT("Group"),
        ];
    }

    public function applyToQuestion($oQuestion)
    {
        $this->question = $oQuestion;
        $aSettingsArray = self::modelsAttributes($oQuestion->survey->language)[$oQuestion->type];
        foreach ($aSettingsArray as $settingKey => $setting) {
            $this->$settingKey = $setting;
        }
    }

    /**
     * @param string $language
     * @return array
     * Still used in QuestionAdministrationController
     *
     * TODO choose between self::modelsAttributes and QuestionTheme::findQuestionMetaData or QuestionTheme::getAllQuestionMetaData
     * TODO QuestionTheme 1591616914305: Needs to be replaced by @link QuestionTheme::getAllQuestionMetaData() however translations inside the xml need to be inserted first
     */

    public static function modelsAttributes($language = '')
    {
        return [
            self::QT_1_ARRAY_DUAL => [
                'code' => self::QT_1_ARRAY_DUAL,
                'description' => gT("Array dual scale", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 1,
                'other' => false,
                'assessable' => 1,
                'hasdefaultvalues' => 0,
                'answerscales' => 2,
                'class' => 'array-flexible-dual-scale',
            ],
            self::QT_5_POINT_CHOICE => [
                'code' => self::QT_5_POINT_CHOICE,
                'description' => gT("5 point choice", "html", $language),
                'group' => gT("Single choice questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => "choice-5-pt-radio"
            ],
            self::QT_A_ARRAY_5_POINT => [
                'code' => self::QT_A_ARRAY_5_POINT,
                'description' => gT("Array (5 point choice)", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 1,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'array-5-pt'
            ],
            self::QT_B_ARRAY_10_POINT => [
                'code' => self::QT_B_ARRAY_10_POINT,
                'description' => gT("Array (10 point choice)", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 1,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'array-10-pt'
            ],
            self::QT_C_ARRAY_YES_UNCERTAIN_NO => [
                'code' => self::QT_C_ARRAY_YES_UNCERTAIN_NO,
                'description' => gT("Array (Yes/No/Uncertain)", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 1,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'array-yes-uncertain-no'
            ],
            self::QT_D_DATE => [
                'code' => self::QT_D_DATE,
                'description' => gT("Date/Time", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'date'
            ],
            self::QT_E_ARRAY_INC_SAME_DEC => [
                'code' => self::QT_E_ARRAY_INC_SAME_DEC,
                'description' => gT("Array (Increase/Same/Decrease)", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 1,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'array-increase-same-decrease'
            ],
            self::QT_F_ARRAY => [
                'code' => self::QT_F_ARRAY,
                'description' => gT("Array", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 1,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 1,
                'answerscales' => 1,
                'class' => 'array-flexible-row'
            ],
            self::QT_G_GENDER => [
                'code' => self::QT_G_GENDER,
                'description' => gT("Gender", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'gender'
            ],
            self::QT_H_ARRAY_COLUMN => [
                'code' => self::QT_H_ARRAY_COLUMN,
                'description' => gT("Array by column", "html", $language),
                'group' => gT('Arrays'),
                'hasdefaultvalues' => 0,
                'subquestions' => 1,
                'other' => false,
                'assessable' => 1,
                'answerscales' => 1,
                'class' => 'array-flexible-column'
            ],
            self::QT_I_LANGUAGE => [
                'code' => self::QT_I_LANGUAGE,
                'description' => gT("Language switch", "html", $language),
                'group' => gT("Mask questions"),
                'hasdefaultvalues' => 0,
                'subquestions' => 0,
                'other' => false,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'language'
            ],
            self::QT_K_MULTIPLE_NUMERICAL => [
                'code' => self::QT_K_MULTIPLE_NUMERICAL,
                'description' => gT("Multiple numerical input", "html", $language),
                'group' => gT("Mask questions"),
                'hasdefaultvalues' => 1,
                'subquestions' => 1,
                'other' => false,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'numeric-multi'
            ],
            self::QT_L_LIST => [
                'code' => self::QT_L_LIST,
                'description' => gT("List (Radio)", "html", $language),
                'group' => gT("Single choice questions"),
                'subquestions' => 0,
                'other' => true,
                'hasdefaultvalues' => 1,
                'assessable' => 1,
                'answerscales' => 1,
                'class' => 'list-radio'
            ],
            self::QT_M_MULTIPLE_CHOICE => [
                'code' => self::QT_M_MULTIPLE_CHOICE,
                'description' => gT("Multiple choice", "html", $language),
                'group' => gT("Multiple choice questions"),
                'subquestions' => 1,
                'other' => true,
                'hasdefaultvalues' => 1,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'multiple-opt'
            ],
            self::QT_N_NUMERICAL => [
                'code' => self::QT_N_NUMERICAL,
                'description' => gT("Numerical input", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'numeric'
            ],
            self::QT_O_LIST_WITH_COMMENT => [
                'code' => self::QT_O_LIST_WITH_COMMENT,
                'description' => gT("List with comment", "html", $language),
                'group' => gT("Single choice questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 1,
                'answerscales' => 1,
                'class' => 'list-with-comment'
            ],
            self::QT_P_MULTIPLE_CHOICE_WITH_COMMENTS => [
                'code' => self::QT_P_MULTIPLE_CHOICE_WITH_COMMENTS,
                'description' => gT("Multiple choice with comments", "html", $language),
                'group' => gT("Multiple choice questions"),
                'subquestions' => 1,
                'other' => true,
                'hasdefaultvalues' => 1,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'multiple-opt-comments'
            ],
            self::QT_Q_MULTIPLE_SHORT_TEXT => [
                'code' => self::QT_Q_MULTIPLE_SHORT_TEXT,
                'description' => gT("Multiple short text", "html", $language),
                'group' => gT("Text questions"),
                'subquestions' => 1,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'multiple-short-txt'
            ],
            self::QT_R_RANKING => [
                'code' => self::QT_R_RANKING,
                'description' => gT("Ranking", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 1,
                'answerscales' => 1,
                'class' => 'ranking'
            ],
            self::QT_S_SHORT_FREE_TEXT => [
                'code' => self::QT_S_SHORT_FREE_TEXT,
                'description' => gT("Short free text", "html", $language),
                'group' => gT("Text questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'text-short'
            ],
            self::QT_T_LONG_FREE_TEXT => [
                'code' => self::QT_T_LONG_FREE_TEXT,
                'description' => gT("Long free text", "html", $language),
                'group' => gT("Text questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'text-long'
            ],
            self::QT_U_HUGE_FREE_TEXT => [
                'code' => self::QT_U_HUGE_FREE_TEXT,
                'description' => gT("Huge free text", "html", $language),
                'group' => gT("Text questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'text-huge'
            ],
            self::QT_X_TEXT_DISPLAY => [
                'code' => self::QT_X_TEXT_DISPLAY,
                'description' => gT("Text display", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'boilerplate'
            ],
            self::QT_Y_YES_NO_RADIO => [
                'code' => self::QT_Y_YES_NO_RADIO,
                'description' => gT("Yes/No", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 1,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'yes-no'
            ],
            self::QT_EXCLAMATION_LIST_DROPDOWN => [
                'code' => self::QT_EXCLAMATION_LIST_DROPDOWN,
                'description' => gT("List (Dropdown)", "html", $language),
                'group' => gT("Single choice questions"),
                'subquestions' => 0,
                'other' => true,
                'hasdefaultvalues' => 1,
                'assessable' => 1,
                'answerscales' => 1,
                'class' => 'list-dropdown'
            ],
            self::QT_COLON_ARRAY_NUMBERS => [
                'code' => self::QT_COLON_ARRAY_NUMBERS,
                'description' => gT("Array (Numbers)", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 2,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 1,
                'answerscales' => 0,
                'class' => 'array-multi-flexi'
            ],
            self::QT_SEMICOLON_ARRAY_TEXT => [
                'code' => self::QT_SEMICOLON_ARRAY_TEXT,
                'description' => gT("Array (Texts)", "html", $language),
                'group' => gT('Arrays'),
                'subquestions' => 2,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'array-multi-flexi-text'
            ],
            self::QT_VERTICAL_FILE_UPLOAD => [
                'code' => self::QT_VERTICAL_FILE_UPLOAD,
                'description' => gT("File upload", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'upload-files'
            ],
            self::QT_ASTERISK_EQUATION => [
                'code' => self::QT_ASTERISK_EQUATION,
                'description' => gT("Equation", "html", $language),
                'group' => gT("Mask questions"),
                'subquestions' => 0,
                'other' => false,
                'hasdefaultvalues' => 0,
                'assessable' => 0,
                'answerscales' => 0,
                'class' => 'equation'
            ],
        ];
    }


    /**
     * Get all type codes of that represent data in text (string longer than char)
     * @return string[]
     */
    public static function textCodes()
    {
        return [
            self::QT_I_LANGUAGE, self::QT_S_SHORT_FREE_TEXT, self::QT_U_HUGE_FREE_TEXT,
            self::QT_Q_MULTIPLE_SHORT_TEXT, self::QT_T_LONG_FREE_TEXT, self::QT_SEMICOLON_ARRAY_TEXT,
            self::QT_COLON_ARRAY_NUMBERS,
        ];
    }


    /**
     * Get all type codes of that represent data in char (one-character-string)
     * @return string[]
     */
    public static function charCodes()
    {
        return [
            self::QT_5_POINT_CHOICE, self::QT_G_GENDER, self::QT_Y_YES_NO_RADIO,
            self::QT_X_TEXT_DISPLAY
        ];
    }

    /**
     * Get all type codes of that represent data in string (text and char)
     * @return string[]
     */
    public static function stringCodes()
    {
        return array_merge(self::textCodes(), self::charCodes());
    }



    /**
     * Get all type codes of that represent data as integer
     * @return string[]
     */
    public static function integerCodes()
    {
        return [
            self::QT_VERTICAL_FILE_UPLOAD
        ];
    }

    /**
     * Get all type codes of that represent data as double
     * @return string[]
     */
    public static function doubleCodes()
    {
        return [];
    }

    /**
     * Get all type codes of that represent data as double
     * @return string[]
     */
    public static function numericCodes()
    {
        return array_merge(self::integerCodes(), self::doubleCodes());
    }

    /**
     * @return bool
     */
    public function getIsText()
    {
        return in_array($this->code, self::textCodes());
    }

    /**
     * @return bool
     */
    public function getIsChar()
    {
        return in_array($this->code, self::charCodes());
    }

    /**
     * @return bool
     */
    public function getIsString()
    {
        return in_array($this->code, self::charCodes());
    }

    /**
     * @return bool
     */
    public function getIsInteger()
    {
        return in_array($this->code, self::integerCodes());
    }

    /**
     * @return bool
     */
    public function getIsNumeric()
    {
        return in_array($this->code, self::numericCodes());
    }


    /**
     * @return string
     */
    public function getFieldType()
    {
        if ($this->isString) {
            if ($this->isChar) {
                return 'char';
            } else {
                return 'string';
            }
        }
        return $this->getFieldDataType();
    }

    /**
     * @return string
     */
    public function getFieldDataType()
    {
        if ($this->isString) {
            return 'string';
        }
        if ($this->isInteger) {
            return 'integer';
        }

        throw new \Exception("Undefined field data type for QuestionType {$this->code}");
    }
}