ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.SurveySingleChoiceQuestion.php
Go to the documentation of this file.
1<?php
2 /*
3 +----------------------------------------------------------------------------+
4 | ILIAS open source |
5 +----------------------------------------------------------------------------+
6 | Copyright (c) 1998-2001 ILIAS open source, University of Cologne |
7 | |
8 | This program is free software; you can redistribute it and/or |
9 | modify it under the terms of the GNU General Public License |
10 | as published by the Free Software Foundation; either version 2 |
11 | of the License, or (at your option) any later version. |
12 | |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU General Public License |
19 | along with this program; if not, write to the Free Software |
20 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21 +----------------------------------------------------------------------------+
22*/
23
24include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
25
38{
45
57 public function __construct($title = "", $description = "", $author = "", $questiontext = "", $owner = -1, $orientation = 1)
58 {
59 global $DIC;
60
61 $this->db = $DIC->database();
62 $this->user = $DIC->user();
63 $this->lng = $DIC->language();
64 parent::__construct($title, $description, $author, $questiontext, $owner);
65
66 include_once "./Modules/SurveyQuestionPool/classes/class.SurveyCategories.php";
67 $this->orientation = $orientation;
68 $this->categories = new SurveyCategories();
69 }
70
78 public function &getCategoriesForPhrase($phrase_id)
79 {
81 $categories = array();
82 $result = $ilDB->queryF(
83 "SELECT svy_category.* FROM svy_category, svy_phrase_cat WHERE svy_phrase_cat.category_fi = svy_category.category_id AND svy_phrase_cat.phrase_fi = %s ORDER BY svy_phrase_cat.sequence",
84 array('integer'),
85 array($phrase_id)
86 );
87 while ($row = $ilDB->fetchAssoc($result)) {
88 if (($row["defaultvalue"] == 1) and ($row["owner_fi"] == 0)) {
89 $categories[$row["category_id"]] = $this->lng->txt($row["title"]);
90 } else {
91 $categories[$row["category_id"]] = $row["title"];
92 }
93 }
94 return $categories;
95 }
96
103 public function addPhrase($phrase_id)
104 {
107
108 $result = $ilDB->queryF(
109 "SELECT svy_category.* FROM svy_category, svy_phrase_cat WHERE svy_phrase_cat.category_fi = svy_category.category_id AND svy_phrase_cat.phrase_fi = %s AND (svy_category.owner_fi = 0 OR svy_category.owner_fi = %s) ORDER BY svy_phrase_cat.sequence",
110 array('integer', 'integer'),
111 array($phrase_id, $ilUser->getId())
112 );
113 while ($row = $ilDB->fetchAssoc($result)) {
114 $neutral = $row["neutral"];
115 if (($row["defaultvalue"] == 1) and ($row["owner_fi"] == 0)) {
116 $this->categories->addCategory($this->lng->txt($row["title"]), 0, $neutral);
117 } else {
118 $this->categories->addCategory($row["title"], 0, $neutral);
119 }
120 }
121 }
122
130 public function getQuestionDataArray($id)
131 {
133
134 $result = $ilDB->queryF(
135 "SELECT svy_question.*, " . $this->getAdditionalTableName() . ".* FROM svy_question, " . $this->getAdditionalTableName() . " WHERE svy_question.question_id = %s AND svy_question.question_id = " . $this->getAdditionalTableName() . ".question_fi",
136 array('integer'),
137 array($id)
138 );
139 if ($result->numRows() == 1) {
140 return $ilDB->fetchAssoc($result);
141 } else {
142 return array();
143 }
144 }
145
152 public function loadFromDb($id)
153 {
155
156 $result = $ilDB->queryF(
157 "SELECT svy_question.*, " . $this->getAdditionalTableName() . ".* FROM svy_question LEFT JOIN " . $this->getAdditionalTableName() . " ON " . $this->getAdditionalTableName() . ".question_fi = svy_question.question_id WHERE svy_question.question_id = %s",
158 array('integer'),
159 array($id)
160 );
161 if ($result->numRows() == 1) {
162 $data = $ilDB->fetchAssoc($result);
163 $this->setId($data["question_id"]);
164 $this->setTitle($data["title"]);
165 $this->label = $data['label'];
166 $this->setDescription($data["description"]);
167 $this->setObjId($data["obj_fi"]);
168 $this->setAuthor($data["author"]);
169 $this->setOwner($data["owner_fi"]);
170 include_once("./Services/RTE/classes/class.ilRTE.php");
171 $this->setQuestiontext(ilRTE::_replaceMediaObjectImageSrc($data["questiontext"], 1));
172 $this->setObligatory($data["obligatory"]);
173 $this->setComplete($data["complete"]);
174 $this->setOriginalId($data["original_id"]);
175 $this->setOrientation($data["orientation"]);
176
177 $this->categories->flushCategories();
178 $result = $ilDB->queryF(
179 "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",
180 array('integer'),
181 array($id)
182 );
183 if ($result->numRows() > 0) {
184 while ($data = $ilDB->fetchAssoc($result)) {
185 $this->categories->addCategory($data["title"], $data["other"], $data["neutral"], null, ($data['scale']) ? $data['scale'] : ($data['sequence'] + 1));
186 }
187 }
188 }
189 parent::loadFromDb($id);
190 }
191
198 public function isComplete()
199 {
200 if (
201 strlen($this->getTitle()) &&
202 strlen($this->getAuthor()) &&
203 strlen($this->getQuestiontext()) &&
204 $this->categories->getCategoryCount()
205 ) {
206 return 1;
207 } else {
208 return 0;
209 }
210 }
211
217 public function saveToDb($original_id = "")
218 {
220
221 $affectedRows = parent::saveToDb($original_id);
222 if ($affectedRows == 1) {
223 $this->log->debug("Before save Category-> DELETE from svy_qst_sc WHERE question_fi = " . $this->getId() . " AND INSERT again the same id and orientation in svy_qst_sc");
224 $affectedRows = $ilDB->manipulateF(
225 "DELETE FROM " . $this->getAdditionalTableName() . " WHERE question_fi = %s",
226 array('integer'),
227 array($this->getId())
228 );
229 $affectedRows = $ilDB->manipulateF(
230 "INSERT INTO " . $this->getAdditionalTableName() . " (question_fi, orientation) VALUES (%s, %s)",
231 array('integer', 'text'),
232 array(
233 $this->getId(),
234 $this->getOrientation()
235 )
236 );
237
238 $this->saveMaterial();
239 $this->saveCategoriesToDb();
240 }
241 }
242
243 public function saveCategoriesToDb()
244 {
246
247 $this->log->debug("DELETE from svy_variable before the INSERT into svy_variable. if scale > 0 we get scale value else we get null");
248
249 $affectedRows = $ilDB->manipulateF(
250 "DELETE FROM svy_variable WHERE question_fi = %s",
251 array('integer'),
252 array($this->getId())
253 );
254
255 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
256 $cat = $this->categories->getCategory($i);
257 $category_id = $this->saveCategoryToDb($cat->title, $cat->neutral);
258 $next_id = $ilDB->nextId('svy_variable');
259 $affectedRows = $ilDB->manipulateF(
260 "INSERT INTO svy_variable (variable_id, category_fi, question_fi, value1, other, sequence, scale, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
261 array('integer','integer','integer','float','integer','integer', 'integer','integer'),
262 array($next_id, $category_id, $this->getId(), ($i + 1), $cat->other, $i, ($cat->scale > 0) ? $cat->scale : null, time())
263 );
264
265 $debug_scale = ($cat->scale > 0) ? $cat->scale : null;
266 $this->log->debug("INSERT INTO svy_variable category_fi= " . $category_id . " question_fi= " . $this->getId() . " value1= " . ($i + 1) . " other= " . $cat->other . " sequence= " . $i . " scale =" . $debug_scale);
267 }
268 $this->saveCompletionStatus();
269 }
270
277 public function toXML($a_include_header = true, $obligatory_state = "")
278 {
279 include_once("./Services/Xml/classes/class.ilXmlWriter.php");
280 $a_xml_writer = new ilXmlWriter;
281 $a_xml_writer->xmlHeader();
282 $this->insertXML($a_xml_writer, $a_include_header, $obligatory_state);
283 $xml = $a_xml_writer->xmlDumpMem(false);
284 if (!$a_include_header) {
285 $pos = strpos($xml, "?>");
286 $xml = substr($xml, $pos + 2);
287 }
288 return $xml;
289 }
290
298 public function insertXML(&$a_xml_writer, $a_include_header = true)
299 {
300 $attrs = array(
301 "id" => $this->getId(),
302 "title" => $this->getTitle(),
303 "type" => $this->getQuestiontype(),
304 "obligatory" => $this->getObligatory()
305 );
306 $a_xml_writer->xmlStartTag("question", $attrs);
307
308 $a_xml_writer->xmlElement("description", null, $this->getDescription());
309 $a_xml_writer->xmlElement("author", null, $this->getAuthor());
310 if (strlen($this->label)) {
311 $attrs = array(
312 "label" => $this->label,
313 );
314 } else {
315 $attrs = array();
316 }
317 $a_xml_writer->xmlStartTag("questiontext", $attrs);
318 $this->addMaterialTag($a_xml_writer, $this->getQuestiontext());
319 $a_xml_writer->xmlEndTag("questiontext");
320
321 $a_xml_writer->xmlStartTag("responses");
322
323 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
324 $attrs = array(
325 "id" => $i
326 );
327 if (strlen($this->categories->getCategory($i)->other)) {
328 $attrs['other'] = $this->categories->getCategory($i)->other;
329 }
330 if (strlen($this->categories->getCategory($i)->neutral)) {
331 $attrs['neutral'] = $this->categories->getCategory($i)->neutral;
332 }
333 if (strlen($this->categories->getCategory($i)->label)) {
334 $attrs['label'] = $this->categories->getCategory($i)->label;
335 }
336 if (strlen($this->categories->getCategory($i)->scale)) {
337 $attrs['scale'] = $this->categories->getCategory($i)->scale;
338 }
339 $a_xml_writer->xmlStartTag("response_single", $attrs);
340 $this->addMaterialTag($a_xml_writer, $this->categories->getCategory($i)->title);
341 $a_xml_writer->xmlEndTag("response_single");
342 }
343
344 $a_xml_writer->xmlEndTag("responses");
345
346 if (count($this->material)) {
347 if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $this->material["internal_link"], $matches)) {
348 $attrs = array(
349 "label" => $this->material["title"]
350 );
351 $a_xml_writer->xmlStartTag("material", $attrs);
352 $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
353 if (strcmp($matches[1], "") != 0) {
354 $intlink = $this->material["internal_link"];
355 }
356 $a_xml_writer->xmlElement("mattext", null, $intlink);
357 $a_xml_writer->xmlEndTag("material");
358 }
359 }
360
361 $a_xml_writer->xmlStartTag("metadata");
362 $a_xml_writer->xmlStartTag("metadatafield");
363 $a_xml_writer->xmlElement("fieldlabel", null, "orientation");
364 $a_xml_writer->xmlElement("fieldentry", null, $this->getOrientation());
365 $a_xml_writer->xmlEndTag("metadatafield");
366 $a_xml_writer->xmlEndTag("metadata");
367
368 $a_xml_writer->xmlEndTag("question");
369 }
370
379 public function importAdditionalMetadata($a_meta)
380 {
381 foreach ($a_meta as $key => $value) {
382 switch ($value["label"]) {
383 case "orientation":
384 $this->setOrientation($value["entry"]);
385 break;
386 }
387 }
388 }
389
397 public function addStandardNumbers($lower_limit, $upper_limit)
398 {
399 for ($i = $lower_limit; $i <= $upper_limit; $i++) {
400 $this->categories->addCategory($i);
401 }
402 }
403
411 public function savePhrase($title)
412 {
415
416 $next_id = $ilDB->nextId('svy_phrase');
417 $affectedRows = $ilDB->manipulateF(
418 "INSERT INTO svy_phrase (phrase_id, title, defaultvalue, owner_fi, tstamp) VALUES (%s, %s, %s, %s, %s)",
419 array('integer','text','text','integer','integer'),
420 array($next_id, $title, 1, $ilUser->getId(), time())
421 );
422 $phrase_id = $next_id;
423
424 $counter = 1;
425 foreach ($_SESSION['save_phrase_data'] as $data) {
426 $next_id = $ilDB->nextId('svy_category');
427 $affectedRows = $ilDB->manipulateF(
428 "INSERT INTO svy_category (category_id, title, defaultvalue, owner_fi, tstamp, neutral) VALUES (%s, %s, %s, %s, %s, %s)",
429 array('integer','text','text','integer','integer','text'),
430 array($next_id, $data['answer'], 1, $ilUser->getId(), time(), $data['neutral'])
431 );
432 $category_id = $next_id;
433 $next_id = $ilDB->nextId('svy_phrase_cat');
434 $affectedRows = $ilDB->manipulateF(
435 "INSERT INTO svy_phrase_cat (phrase_category_id, phrase_fi, category_fi, sequence, other, scale) VALUES (%s, %s, %s, %s, %s, %s)",
436 array('integer', 'integer', 'integer','integer', 'integer', 'integer'),
437 array($next_id, $phrase_id, $category_id, $counter, ($data['other']) ? 1 : 0, $data['scale'])
438 );
439 $counter++;
440 }
441 }
442
449 public function getQuestionType()
450 {
451 return "SurveySingleChoiceQuestion";
452 }
453
460 public function getAdditionalTableName()
461 {
462 return "svy_qst_sc";
463 }
464
471 public function &getWorkingDataFromUserInput($post_data)
472 {
473 $entered_value = $post_data[$this->getId() . "_value"];
474 $data = array();
475 if (strlen($entered_value)) {
476 array_push($data, array("value" => $entered_value, "textanswer" => $post_data[$this->getId() . '_' . $entered_value . '_other']));
477 }
478 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
479 $cat = $this->categories->getCategory($i);
480 if ($cat->other) {
481 if ($i != $entered_value) {
482 if (strlen($post_data[$this->getId() . "_" . $i . "_other"])) {
483 array_push($data, array("value" => $i, "textanswer" => $post_data[$this->getId() . '_' . $i . '_other'], "uncheck" => true));
484 }
485 }
486 }
487 }
488 return $data;
489 }
490
500 public function checkUserInput($post_data, $survey_id)
501 {
502 $entered_value = $post_data[$this->getId() . "_value"];
503
504 $this->log->debug("Entered value = " . $entered_value);
505
506 if ((!$this->getObligatory($survey_id)) && (strlen($entered_value) == 0)) {
507 return "";
508 }
509
510 if (strlen($entered_value) == 0) {
511 return $this->lng->txt("question_not_checked");
512 }
513
514 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
515 $cat = $this->categories->getCategory($i);
516 if ($cat->other) {
517 if ($i == $entered_value) {
518 if (array_key_exists($this->getId() . "_" . $entered_value . "_other", $post_data) && !strlen($post_data[$this->getId() . "_" . $entered_value . "_other"])) {
519 return $this->lng->txt("question_mr_no_other_answer");
520 }
521 } else {
522 if (strlen($post_data[$this->getId() . "_" . $i . "_other"])) {
523 return $this->lng->txt("question_sr_no_other_answer_checked");
524 }
525 }
526 }
527 }
528
529 return "";
530 }
531
532 public function saveUserInput($post_data, $active_id, $a_return = false)
533 {
535
536 $entered_value = $post_data[$this->getId() . "_value"];
537
538 if ($a_return) {
539 return array(array("value" => $entered_value,
540 "textanswer" => $post_data[$this->getId() . "_" . $entered_value . "_other"]));
541 }
542 if (strlen($entered_value) == 0) {
543 return;
544 }
545
546 $next_id = $ilDB->nextId('svy_answer');
547 #20216
548 $fields = array();
549 $fields['answer_id'] = array("integer", $next_id);
550 $fields['question_fi'] = array("integer", $this->getId());
551 $fields['active_fi'] = array("integer", $active_id);
552 $fields['value'] = array("float", (strlen($entered_value)) ? $entered_value : null);
553 $fields['textanswer'] = array("clob", ($post_data[$this->getId() . "_" . $entered_value . "_other"]) ?
554 $this->stripSlashesAddSpaceFallback($post_data[$this->getId() . "_" . $entered_value . "_other"]) : null);
555 $fields['tstamp'] = array("integer", time());
556
557 $affectedRows = $ilDB->insert("svy_answer", $fields);
558
559 $debug_value = (strlen($entered_value)) ? $entered_value : "NULL";
560 $debug_answer = ($post_data[$this->getId() . "_" . $entered_value . "_other"]) ? $post_data[$this->getId() . "_" . $entered_value . "_other"] : "NULL";
561 $this->log->debug("INSERT svy_answer answer_id=" . $next_id . " question_fi=" . $this->getId() . " active_fi=" . $active_id . " value=" . $debug_value . " textanswer=" . $debug_answer);
562 }
563
570 public function importResponses($a_data)
571 {
572 foreach ($a_data as $id => $data) {
573 $categorytext = "";
574 foreach ($data["material"] as $material) {
575 $categorytext .= $material["text"];
576 }
577 $this->categories->addCategory(
578 $categorytext,
579 strlen($data['other']) ? $data['other'] : 0,
580 strlen($data['neutral']) ? $data['neutral'] : 0,
581 strlen($data['label']) ? $data['label'] : null,
582 strlen($data['scale']) ? $data['scale'] : null
583 );
584 }
585 }
586
593 public function usableForPrecondition()
594 {
595 return true;
596 }
597
604 public function getAvailableRelations()
605 {
606 return array("<", "<=", "=", "<>", ">=", ">");
607 }
608
614 public function getPreconditionOptions()
615 {
617
618 $options = array();
619 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
620 $category = $this->categories->getCategory($i);
621 $options[$category->scale - 1] = $category->scale . " - " . $category->title;
622 }
623 return $options;
624 }
625
632 public function getPreconditionSelectValue($default = "", $title, $variable)
633 {
634 include_once "./Services/Form/classes/class.ilSelectInputGUI.php";
635 $step3 = new ilSelectInputGUI($title, $variable);
637 $step3->setOptions($options);
638 $step3->setValue($default);
639 return $step3;
640 }
641
649 public function getPreconditionValueOutput($value)
650 {
651 // #18136
652 $category = $this->categories->getCategoryForScale($value + 1);
653
654 // #17895 - see getPreconditionOptions()
655 return $category->scale .
656 " - " .
657 ((strlen($category->title)) ? $category->title : $this->lng->txt('other_answer'));
658 }
659
660 public function getCategories()
661 {
662 return $this->categories;
663 }
664}
$result
user()
Definition: user.php:4
$default
Definition: build.php:20
$_SESSION["AccountId"]
An exception for terminatinating execution or to throw for unit testing.
Class SurveyCategories.
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.
getPreconditionOptions()
Returns the options for preconditions.
getQuestionType()
Returns the question type of the question.
addPhrase($phrase_id)
Adds a phrase to the question.
__construct($title="", $description="", $author="", $questiontext="", $owner=-1, $orientation=1)
SurveySingleChoiceQuestion constructor.
isComplete()
Returns true if the question is complete for use.
savePhrase($title)
Saves a set of categories to a default phrase.
importAdditionalMetadata($a_meta)
Import additional meta data from the question import file.
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.
saveToDb($original_id="")
Saves a SurveySingleChoiceQuestion object to a database.
usableForPrecondition()
Returns if the question is usable for preconditions.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
getPreconditionSelectValue($default="", $title, $variable)
Creates a form property for the precondition value.
& getWorkingDataFromUserInput($post_data)
Creates the user data of the svy_answer table from the POST data.
insertXML(&$a_xml_writer, $a_include_header=true)
Adds the question XML to a given XMLWriter object.
getAvailableRelations()
Returns the available relations for the question.
addStandardNumbers($lower_limit, $upper_limit)
Adds standard numbers as categories.
& getCategoriesForPhrase($phrase_id)
Gets the available categories for a given phrase.
toXML($a_include_header=true, $obligatory_state="")
Returns an xml representation of the question.
getQuestionDataArray($id)
Returns the question data fields from the database.
loadFromDb($id)
Loads a SurveySingleChoiceQuestion object from the database.
getPreconditionValueOutput($value)
Returns the output for a precondition value.
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...
This class represents a selection list property in a property form.
XML writer class.
xmlHeader()
Writes xml header @access public.
$key
Definition: croninfo.php:18
$i
Definition: disco.tpl.php:19
$row
global $DIC
Definition: saml.php:7
global $ilDB
$ilUser
Definition: imgupload.php:18
$data
Definition: bench.php:6