40        $this->db = 
$DIC->database();
 
   41        $this->lng = 
$DIC->language();
 
   90            $this->label = 
$data[
'label'];
 
  100            $this->use_min_answers = (
$data[
'use_min_answers']) ? 
true : 
false;
 
  101            $this->nr_min_answers = 
$data[
'nr_min_answers'];
 
  102            $this->nr_max_answers = 
$data[
'nr_max_answers'];
 
  104            $this->categories->flushCategories();
 
  106                "SELECT svy_variable.*, svy_category.title, svy_category.neutral FROM svy_variable, svy_category WHERE svy_variable.question_fi = %s AND svy_variable.category_fi = svy_category.category_id ORDER BY sequence ASC",
 
  112                    $this->categories->addCategory(
$data[
"title"], 
$data[
"other"], 
$data[
"neutral"], 
null, (
$data[
'scale']) ? 
$data[
'scale'] : (
$data[
'sequence'] + 1));
 
  116        parent::loadFromDb(
$id);
 
  131            $this->categories->getCategoryCount()
 
  148        $affectedRows = parent::saveToDb($original_id);
 
  149        if ($affectedRows == 1) {
 
  150            $affectedRows = 
$ilDB->manipulateF(
 
  153                array($this->
getId())
 
  155            $affectedRows = 
$ilDB->manipulateF(
 
  156                "INSERT INTO " . $this->
getAdditionalTableName() . 
" (question_fi, orientation, use_min_answers, nr_min_answers, nr_max_answers) VALUES (%s, %s, %s, %s, %s)",
 
  157                array(
'integer', 
'text', 
'integer', 
'integer', 
'integer'),
 
  161                    ($this->use_min_answers) ? 1 : 0,
 
  162                    ($this->nr_min_answers > 0) ? $this->nr_min_answers : 
null,
 
  163                    ($this->nr_max_answers > 0) ? $this->nr_max_answers : 
null 
  177        $affectedRows = 
$ilDB->manipulateF(
 
  178            "DELETE FROM svy_variable WHERE question_fi = %s",
 
  180            array($this->
getId())
 
  183        for (
$i = 0; 
$i < $this->categories->getCategoryCount(); 
$i++) {
 
  184            $cat = $this->categories->getCategory(
$i);
 
  186            $next_id = 
$ilDB->nextId(
'svy_variable');
 
  187            $affectedRows = 
$ilDB->manipulateF(
 
  188                "INSERT INTO svy_variable (variable_id, category_fi, question_fi, value1, other, sequence, scale, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
 
  189                array(
'integer',
'integer',
'integer',
'float',
'integer',
'integer', 
'integer',
'integer'),
 
  190                array($next_id, $category_id, $this->
getId(), (
$i + 1), $cat->other, 
$i, ($cat->scale > 0) ? $cat->scale : 
null, time())
 
  202    public function toXML($a_include_header = 
true, $obligatory_state = 
"")
 
  206        $this->
insertXML($a_xml_writer, $a_include_header, $obligatory_state);
 
  207        $xml = $a_xml_writer->xmlDumpMem(
false);
 
  208        if (!$a_include_header) {
 
  209            $pos = strpos(
$xml, 
"?>");
 
  222    public function insertXML(&$a_xml_writer, $a_include_header = 
true)
 
  225            "id" => $this->
getId(),
 
  227            "type" => $this->getQuestiontype(),
 
  230        $a_xml_writer->xmlStartTag(
"question", $attrs);
 
  232        $a_xml_writer->xmlElement(
"description", 
null, $this->
getDescription());
 
  233        $a_xml_writer->xmlElement(
"author", 
null, $this->
getAuthor());
 
  234        if (strlen($this->label)) {
 
  236                "label" => $this->label,
 
  241        $a_xml_writer->xmlStartTag(
"questiontext", $attrs);
 
  243        $a_xml_writer->xmlEndTag(
"questiontext");
 
  245        $a_xml_writer->xmlStartTag(
"responses");
 
  247        for (
$i = 0; 
$i < $this->categories->getCategoryCount(); 
$i++) {
 
  251            if (strlen($this->categories->getCategory(
$i)->other)) {
 
  252                $attrs[
'other'] = $this->categories->getCategory(
$i)->other;
 
  254            if (strlen($this->categories->getCategory(
$i)->neutral)) {
 
  255                $attrs[
'neutral'] = $this->categories->getCategory(
$i)->neutral;
 
  257            if (strlen($this->categories->getCategory(
$i)->label)) {
 
  258                $attrs[
'label'] = $this->categories->getCategory(
$i)->label;
 
  260            if (strlen($this->categories->getCategory(
$i)->scale)) {
 
  261                $attrs[
'scale'] = $this->categories->getCategory(
$i)->scale;
 
  263            $a_xml_writer->xmlStartTag(
"response_multiple", $attrs);
 
  264            $this->
addMaterialTag($a_xml_writer, $this->categories->getCategory(
$i)->title);
 
  265            $a_xml_writer->xmlEndTag(
"response_multiple");
 
  268        $a_xml_writer->xmlEndTag(
"responses");
 
  270        if (count($this->material)) {
 
  271            if (preg_match(
"/il_(\d*?)_(\w+)_(\d+)/", $this->material[
"internal_link"], $matches)) {
 
  273                    "label" => $this->material[
"title"]
 
  275                $a_xml_writer->xmlStartTag(
"material", $attrs);
 
  276                $intlink = 
"il_" . 
IL_INST_ID . 
"_" . $matches[2] . 
"_" . $matches[3];
 
  277                if (strcmp($matches[1], 
"") != 0) {
 
  278                    $intlink = $this->material[
"internal_link"];
 
  280                $a_xml_writer->xmlElement(
"mattext", 
null, $intlink);
 
  281                $a_xml_writer->xmlEndTag(
"material");
 
  285        $a_xml_writer->xmlStartTag(
"metadata");
 
  286        $a_xml_writer->xmlStartTag(
"metadatafield");
 
  287        $a_xml_writer->xmlElement(
"fieldlabel", 
null, 
"orientation");
 
  288        $a_xml_writer->xmlElement(
"fieldentry", 
null, $this->
getOrientation());
 
  289        $a_xml_writer->xmlEndTag(
"metadatafield");
 
  290        $a_xml_writer->xmlStartTag(
"metadatafield");
 
  291        $a_xml_writer->xmlElement(
"fieldlabel", 
null, 
"use_min_answers");
 
  292        $a_xml_writer->xmlElement(
"fieldentry", 
null, $this->use_min_answers);
 
  293        $a_xml_writer->xmlEndTag(
"metadatafield");
 
  294        $a_xml_writer->xmlStartTag(
"metadatafield");
 
  295        $a_xml_writer->xmlElement(
"fieldlabel", 
null, 
"nr_min_answers");
 
  296        $a_xml_writer->xmlElement(
"fieldentry", 
null, $this->nr_min_answers);
 
  297        $a_xml_writer->xmlEndTag(
"metadatafield");
 
  298        $a_xml_writer->xmlStartTag(
"metadatafield");
 
  299        $a_xml_writer->xmlElement(
"fieldlabel", 
null, 
"nr_max_answers");
 
  300        $a_xml_writer->xmlElement(
"fieldentry", 
null, $this->nr_max_answers);
 
  301        $a_xml_writer->xmlEndTag(
"metadatafield");
 
  302        $a_xml_writer->xmlEndTag(
"metadata");
 
  304        $a_xml_writer->xmlEndTag(
"question");
 
  315        return "SurveyMultipleChoiceQuestion";
 
  337        $entered_value = $post_data[$this->
getId() . 
"_value"];
 
  339        if (is_array($entered_value)) {
 
  340            foreach ($entered_value as $idx => $value) {
 
  341                array_push(
$data, array(
"value" => $value, 
"textanswer" => $post_data[$this->
getId() . 
'_' . $value . 
'_other']));
 
  344        for (
$i = 0; 
$i < $this->categories->getCategoryCount(); 
$i++) {
 
  345            $cat = $this->categories->getCategory(
$i);
 
  348                if (!is_array($entered_value) || !in_array(
$i, $entered_value)) {
 
  349                    if (strlen($post_data[$this->
getId() . 
"_" . 
$i . 
"_other"])) {
 
  350                        array_push(
$data, array(
"value" => 
$i, 
"textanswer" => $post_data[$this->
getId() . 
'_' . 
$i . 
'_other'], 
"uncheck" => 
true));
 
  369        $entered_value = (array) $post_data[$this->
getId() . 
"_value"];
 
  374        if ($this->use_min_answers && $this->nr_min_answers > 0 && $this->nr_max_answers > 0 && $this->nr_min_answers == $this->nr_max_answers && count($entered_value) != $this->nr_max_answers) {
 
  375            return sprintf($this->lng->txt(
"err_no_exact_answers"), $this->nr_min_answers);
 
  377        if ($this->use_min_answers && $this->nr_min_answers > 0 && count($entered_value) < $this->nr_min_answers) {
 
  378            return sprintf($this->lng->txt(
"err_no_min_answers"), $this->nr_min_answers);
 
  380        if ($this->use_min_answers && $this->nr_max_answers > 0 && count($entered_value) > $this->nr_max_answers) {
 
  381            return sprintf($this->lng->txt(
"err_no_max_answers"), $this->nr_max_answers);
 
  383        if (count($entered_value) == 0) {
 
  384            return $this->lng->txt(
"question_mr_not_checked");
 
  386        for (
$i = 0; 
$i < $this->categories->getCategoryCount(); 
$i++) {
 
  387            $cat = $this->categories->getCategory(
$i);
 
  389                if (in_array(
$i, $entered_value)) {
 
  390                    if (array_key_exists($this->
getId() . 
"_" . 
$i . 
"_other", $post_data) && !strlen($post_data[$this->
getId() . 
"_" . 
$i . 
"_other"])) {
 
  391                        return $this->lng->txt(
"question_mr_no_other_answer");
 
  394                    if (strlen($post_data[$this->
getId() . 
"_" . 
$i . 
"_other"])) {
 
  395                        return $this->lng->txt(
"question_mr_no_other_answer_checked");
 
  408            $return_data = array();
 
  410        if (is_array($post_data[$this->
getId() . 
"_value"])) {
 
  411            foreach ($post_data[$this->
getId() . 
"_value"] as $entered_value) {
 
  412                if (strlen($entered_value) > 0) {
 
  414                        $next_id = 
$ilDB->nextId(
'svy_answer');
 
  418                        $fields[
'answer_id'] = array(
"integer", $next_id);
 
  419                        $fields[
'question_fi'] = array(
"integer", $this->
getId());
 
  420                        $fields[
'active_fi'] = array(
"integer", $active_id);
 
  421                        $fields[
'value'] = array(
"float", (strlen($entered_value)) ? $entered_value : 
null);
 
  422                        $fields[
'textanswer'] = array(
"clob", ($post_data[$this->
getId() . 
"_" . $entered_value . 
"_other"]) ? $this->
stripSlashesAddSpaceFallback($post_data[$this->
getId() . 
"_" . $entered_value . 
"_other"]) : 
null);
 
  423                        $fields[
'tstamp'] = array(
"integer", time());
 
  425                        $affectedRows = 
$ilDB->insert(
"svy_answer", $fields);
 
  427                        $return_data[] = array(
"value" => $entered_value,
 
  428                                "textanswer" => $post_data[$this->
getId() . 
"_" . $entered_value . 
"_other"]);
 
  448        foreach ($a_meta as $key => $value) {
 
  449            switch ($value[
"label"]) {
 
  453                case "use_min_answers":
 
  454                    $this->use_min_answers = $value[
"entry"];
 
  456                case "nr_min_answers":
 
  457                    $this->nr_min_answers = $value[
"entry"];
 
  459                case "nr_max_answers":
 
  460                    $this->nr_max_answers = $value[
"entry"];
 
  479            $this->categories->addCategory(
 
  482                strlen(
$data[
'neutral']) ? 
$data[
'neutral'] : 0,
 
  483                strlen(
$data[
'label']) ? 
$data[
'label'] : 
null,
 
  484                strlen(
$data[
'scale']) ? 
$data[
'scale'] : 
null 
  508        return array(
"=", 
"<>");
 
  521        for (
$i = 0; 
$i < $this->categories->getCategoryCount(); 
$i++) {
 
  522            $category = $this->categories->getCategory(
$i);
 
  523            $options[$category->scale - 1] = $category->scale . 
" - " . $category->title;
 
  538        $step3->setOptions($options);
 
  539        $step3->setValue($default);
 
  553        $category = $this->categories->getCategoryForScale($value + 1);
 
  556        return $category->scale .
 
  558            ((strlen($category->title)) ? $category->title : $this->lng->txt(
'other_answer'));
 
  576            "SELECT SUM(scale) sum_sum_score FROM svy_svy_qst sq " .
 
  577            "JOIN svy_question q ON (sq.question_fi = q.question_id) " .
 
  578            "JOIN svy_variable v ON (v.question_fi = q.question_id) " .
 
  579            "WHERE sq.survey_fi  = %s AND q.questiontype_fi = %s ",
 
  580            [
"integer", 
"integer"],
 
  583        $rec = 
$db->fetchAssoc($set);
 
  584        return (
int) $rec[
"sum_sum_score"];
 
An exception for terminatinating execution or to throw for unit testing.
MultipleChoice survey question.
toXML($a_include_header=true, $obligatory_state="")
Returns an xml representation of the question.
getPreconditionValueOutput($value)
Returns the output for a precondition value.
getAvailableRelations()
Returns the available relations for the question.
getPreconditionSelectValue($default="", $title, $variable)
Creates a form property for the precondition value.
static getMaxSumScore(int $survey_id)
@inheritDoc
checkUserInput($post_data, $survey_id)
Checks the input of the active user for obligatory status and entered values.
saveUserInput($post_data, $active_id, $a_return=false)
importResponses($a_data)
Import response data from the question import file.
isComplete()
Returns true if the question is complete for use.
getQuestionType()
Returns the question type of the question.
loadFromDb($id)
Loads a SurveyMultipleChoiceQuestion object from the database.
usableForPrecondition()
Returns if the question is usable for preconditions.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
getQuestionDataArray($id)
Returns the question data fields from the database.
saveToDb($original_id="")
Saves a SurveyMultipleChoiceQuestion object to a database.
insertXML(&$a_xml_writer, $a_include_header=true)
Adds the question XML to a given XMLWriter object.
getPreconditionOptions()
Returns the options for preconditions.
importAdditionalMetadata($a_meta)
Import additional meta data from the question import file.
__construct($title="", $description="", $author="", $questiontext="", $owner=-1, $orientation=0)
The constructor takes possible arguments an creates an instance of the SurveyMultipleChoiceQuestion o...
& getWorkingDataFromUserInput($post_data)
Creates the user data of the svy_answer table from the POST data.
Basic class for all survey question types.
setQuestiontext($questiontext="")
Sets the questiontext of the SurveyQuestion object.
setId($id=-1)
Sets the id of the SurveyQuestion object.
setAuthor($author="")
Sets the authors name of the SurveyQuestion object.
stripSlashesAddSpaceFallback($a_str)
Strip slashes with add space fallback, see https://mantis.ilias.de/view.php?id=19727 and https://mant...
getDescription()
Gets the description string of the SurveyQuestion object.
getId()
Gets the id of the SurveyQuestion object.
setDescription($description="")
Sets the description string of the SurveyQuestion object.
setObjId($obj_id=0)
Set the reference id of the container object.
getAuthor()
Gets the authors name of the SurveyQuestion object.
setOriginalId($original_id)
getQuestiontext()
Gets the questiontext of the SurveyQuestion object.
getObligatory($survey_id="")
Gets the obligatory state of the question.
setOrientation($orientation=0)
Sets the orientation of the question output.
saveCategoryToDb($categorytext, $neutral=0)
Saves a category to the database.
getTitle()
Gets the title string of the SurveyQuestion object.
setComplete($a_complete)
Sets the complete state of the question.
saveMaterial()
save material to db
setOwner($owner="")
Sets the creator/owner ID of the SurveyQuestion object.
setTitle($title="")
Sets the title string of the SurveyQuestion object.
saveCompletionStatus($original_id="")
Saves the complete flag to the database.
getOrientation()
Gets the orientation of the question output.
addMaterialTag(&$a_xml_writer, $a_material, $close_material_tag=true, $add_mobs=true, $a_attrs=null)
Creates an XML material tag from a plain text or xhtml text.
setObligatory($obligatory=1)
Sets the obligatory state of the question.
static _replaceMediaObjectImageSrc($a_text, $a_direction=0, $nic=IL_INST_ID)
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
xmlHeader()
Writes xml header @access public.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc