ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
class.SurveySingleChoiceQuestion.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (c) 1998-2019 ILIAS open source, Extended GPL, see docs/LICENSE */
4
14{
21
33 public function __construct($title = "", $description = "", $author = "", $questiontext = "", $owner = -1, $orientation = 1)
34 {
35 global $DIC;
36
37 $this->db = $DIC->database();
38 $this->user = $DIC->user();
39 $this->lng = $DIC->language();
41
42 $this->orientation = $orientation;
43 $this->categories = new SurveyCategories();
44 }
45
53 public function &getCategoriesForPhrase($phrase_id)
54 {
56 $categories = array();
57 $result = $ilDB->queryF(
58 "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",
59 array('integer'),
60 array($phrase_id)
61 );
62 while ($row = $ilDB->fetchAssoc($result)) {
63 if (($row["defaultvalue"] == 1) and ($row["owner_fi"] == 0)) {
64 $categories[$row["category_id"]] = $this->lng->txt($row["title"]);
65 } else {
66 $categories[$row["category_id"]] = $row["title"];
67 }
68 }
69 return $categories;
70 }
71
78 public function addPhrase($phrase_id)
79 {
82
83 $result = $ilDB->queryF(
84 "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",
85 array('integer', 'integer'),
86 array($phrase_id, $ilUser->getId())
87 );
88 while ($row = $ilDB->fetchAssoc($result)) {
89 $neutral = $row["neutral"];
90 if (($row["defaultvalue"] == 1) and ($row["owner_fi"] == 0)) {
91 $this->categories->addCategory($this->lng->txt($row["title"]), 0, $neutral);
92 } else {
93 $this->categories->addCategory($row["title"], 0, $neutral);
94 }
95 }
96 }
97
105 public function getQuestionDataArray($id)
106 {
108
109 $result = $ilDB->queryF(
110 "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",
111 array('integer'),
112 array($id)
113 );
114 if ($result->numRows() == 1) {
115 return $ilDB->fetchAssoc($result);
116 } else {
117 return array();
118 }
119 }
120
127 public function loadFromDb($id)
128 {
130
131 $result = $ilDB->queryF(
132 "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",
133 array('integer'),
134 array($id)
135 );
136 if ($result->numRows() == 1) {
137 $data = $ilDB->fetchAssoc($result);
138 $this->setId($data["question_id"]);
139 $this->setTitle($data["title"]);
140 $this->label = $data['label'];
141 $this->setDescription($data["description"]);
142 $this->setObjId($data["obj_fi"]);
143 $this->setAuthor($data["author"]);
144 $this->setOwner($data["owner_fi"]);
145 $this->setQuestiontext(ilRTE::_replaceMediaObjectImageSrc($data["questiontext"], 1));
146 $this->setObligatory($data["obligatory"]);
147 $this->setComplete($data["complete"]);
148 $this->setOriginalId($data["original_id"]);
149 $this->setOrientation($data["orientation"]);
150
151 $this->categories->flushCategories();
152 $result = $ilDB->queryF(
153 "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",
154 array('integer'),
155 array($id)
156 );
157 if ($result->numRows() > 0) {
158 while ($data = $ilDB->fetchAssoc($result)) {
159 $this->categories->addCategory($data["title"], $data["other"], $data["neutral"], null, ($data['scale']) ? $data['scale'] : ($data['sequence'] + 1));
160 }
161 }
162 }
163 parent::loadFromDb($id);
164 }
165
172 public function isComplete()
173 {
174 if (
175 strlen($this->getTitle()) &&
176 strlen($this->getAuthor()) &&
177 strlen($this->getQuestiontext()) &&
178 $this->categories->getCategoryCount()
179 ) {
180 return 1;
181 } else {
182 return 0;
183 }
184 }
185
191 public function saveToDb($original_id = "")
192 {
194
195 $affectedRows = parent::saveToDb($original_id);
196 if ($affectedRows == 1) {
197 $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");
198 $affectedRows = $ilDB->manipulateF(
199 "DELETE FROM " . $this->getAdditionalTableName() . " WHERE question_fi = %s",
200 array('integer'),
201 array($this->getId())
202 );
203 $affectedRows = $ilDB->manipulateF(
204 "INSERT INTO " . $this->getAdditionalTableName() . " (question_fi, orientation) VALUES (%s, %s)",
205 array('integer', 'text'),
206 array(
207 $this->getId(),
208 $this->getOrientation()
209 )
210 );
211
212 $this->saveMaterial();
213 $this->saveCategoriesToDb();
214 }
215 }
216
217 public function saveCategoriesToDb()
218 {
220
221 $this->log->debug("DELETE from svy_variable before the INSERT into svy_variable. if scale > 0 we get scale value else we get null");
222
223 $affectedRows = $ilDB->manipulateF(
224 "DELETE FROM svy_variable WHERE question_fi = %s",
225 array('integer'),
226 array($this->getId())
227 );
228
229 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
230 $cat = $this->categories->getCategory($i);
231 $category_id = $this->saveCategoryToDb($cat->title, $cat->neutral);
232 $next_id = $ilDB->nextId('svy_variable');
233 $affectedRows = $ilDB->manipulateF(
234 "INSERT INTO svy_variable (variable_id, category_fi, question_fi, value1, other, sequence, scale, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
235 array('integer','integer','integer','float','integer','integer', 'integer','integer'),
236 array($next_id, $category_id, $this->getId(), ($i + 1), $cat->other, $i, ($cat->scale > 0) ? $cat->scale : null, time())
237 );
238
239 $debug_scale = ($cat->scale > 0) ? $cat->scale : null;
240 $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);
241 }
242 $this->saveCompletionStatus();
243 }
244
251 public function toXML($a_include_header = true, $obligatory_state = "")
252 {
253 $a_xml_writer = new ilXmlWriter;
254 $a_xml_writer->xmlHeader();
255 $this->insertXML($a_xml_writer, $a_include_header, $obligatory_state);
256 $xml = $a_xml_writer->xmlDumpMem(false);
257 if (!$a_include_header) {
258 $pos = strpos($xml, "?>");
259 $xml = substr($xml, $pos + 2);
260 }
261 return $xml;
262 }
263
271 public function insertXML(&$a_xml_writer, $a_include_header = true)
272 {
273 $attrs = array(
274 "id" => $this->getId(),
275 "title" => $this->getTitle(),
276 "type" => $this->getQuestiontype(),
277 "obligatory" => $this->getObligatory()
278 );
279 $a_xml_writer->xmlStartTag("question", $attrs);
280
281 $a_xml_writer->xmlElement("description", null, $this->getDescription());
282 $a_xml_writer->xmlElement("author", null, $this->getAuthor());
283 if (strlen($this->label)) {
284 $attrs = array(
285 "label" => $this->label,
286 );
287 } else {
288 $attrs = array();
289 }
290 $a_xml_writer->xmlStartTag("questiontext", $attrs);
291 $this->addMaterialTag($a_xml_writer, $this->getQuestiontext());
292 $a_xml_writer->xmlEndTag("questiontext");
293
294 $a_xml_writer->xmlStartTag("responses");
295
296 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
297 $attrs = array(
298 "id" => $i
299 );
300 if (strlen($this->categories->getCategory($i)->other)) {
301 $attrs['other'] = $this->categories->getCategory($i)->other;
302 }
303 if (strlen($this->categories->getCategory($i)->neutral)) {
304 $attrs['neutral'] = $this->categories->getCategory($i)->neutral;
305 }
306 if (strlen($this->categories->getCategory($i)->label)) {
307 $attrs['label'] = $this->categories->getCategory($i)->label;
308 }
309 if (strlen($this->categories->getCategory($i)->scale)) {
310 $attrs['scale'] = $this->categories->getCategory($i)->scale;
311 }
312 $a_xml_writer->xmlStartTag("response_single", $attrs);
313 $this->addMaterialTag($a_xml_writer, $this->categories->getCategory($i)->title);
314 $a_xml_writer->xmlEndTag("response_single");
315 }
316
317 $a_xml_writer->xmlEndTag("responses");
318
319 if (count($this->material)) {
320 if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $this->material["internal_link"], $matches)) {
321 $attrs = array(
322 "label" => $this->material["title"]
323 );
324 $a_xml_writer->xmlStartTag("material", $attrs);
325 $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
326 if (strcmp($matches[1], "") != 0) {
327 $intlink = $this->material["internal_link"];
328 }
329 $a_xml_writer->xmlElement("mattext", null, $intlink);
330 $a_xml_writer->xmlEndTag("material");
331 }
332 }
333
334 $a_xml_writer->xmlStartTag("metadata");
335 $a_xml_writer->xmlStartTag("metadatafield");
336 $a_xml_writer->xmlElement("fieldlabel", null, "orientation");
337 $a_xml_writer->xmlElement("fieldentry", null, $this->getOrientation());
338 $a_xml_writer->xmlEndTag("metadatafield");
339 $a_xml_writer->xmlEndTag("metadata");
340
341 $a_xml_writer->xmlEndTag("question");
342 }
343
352 public function importAdditionalMetadata($a_meta)
353 {
354 foreach ($a_meta as $key => $value) {
355 switch ($value["label"]) {
356 case "orientation":
357 $this->setOrientation($value["entry"]);
358 break;
359 }
360 }
361 }
362
370 public function addStandardNumbers($lower_limit, $upper_limit)
371 {
372 for ($i = $lower_limit; $i <= $upper_limit; $i++) {
373 $this->categories->addCategory($i);
374 }
375 }
376
384 public function savePhrase($title)
385 {
388
389 $next_id = $ilDB->nextId('svy_phrase');
390 $affectedRows = $ilDB->manipulateF(
391 "INSERT INTO svy_phrase (phrase_id, title, defaultvalue, owner_fi, tstamp) VALUES (%s, %s, %s, %s, %s)",
392 array('integer','text','text','integer','integer'),
393 array($next_id, $title, 1, $ilUser->getId(), time())
394 );
395 $phrase_id = $next_id;
396
397 $counter = 1;
398 foreach ($_SESSION['save_phrase_data'] as $data) {
399 $next_id = $ilDB->nextId('svy_category');
400 $affectedRows = $ilDB->manipulateF(
401 "INSERT INTO svy_category (category_id, title, defaultvalue, owner_fi, tstamp, neutral) VALUES (%s, %s, %s, %s, %s, %s)",
402 array('integer','text','text','integer','integer','text'),
403 array($next_id, $data['answer'], 1, $ilUser->getId(), time(), $data['neutral'])
404 );
405 $category_id = $next_id;
406 $next_id = $ilDB->nextId('svy_phrase_cat');
407 $affectedRows = $ilDB->manipulateF(
408 "INSERT INTO svy_phrase_cat (phrase_category_id, phrase_fi, category_fi, sequence, other, scale) VALUES (%s, %s, %s, %s, %s, %s)",
409 array('integer', 'integer', 'integer','integer', 'integer', 'integer'),
410 array($next_id, $phrase_id, $category_id, $counter, ($data['other']) ? 1 : 0, $data['scale'])
411 );
412 $counter++;
413 }
414 }
415
422 public function getQuestionType()
423 {
424 return "SurveySingleChoiceQuestion";
425 }
426
433 public function getAdditionalTableName()
434 {
435 return "svy_qst_sc";
436 }
437
444 public function &getWorkingDataFromUserInput($post_data)
445 {
446 $entered_value = $post_data[$this->getId() . "_value"];
447 $data = array();
448 if (strlen($entered_value)) {
449 array_push($data, array("value" => $entered_value, "textanswer" => $post_data[$this->getId() . '_' . $entered_value . '_other']));
450 }
451 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
452 $cat = $this->categories->getCategory($i);
453 if ($cat->other) {
454 if ($i != $entered_value) {
455 if (strlen($post_data[$this->getId() . "_" . $i . "_other"])) {
456 array_push($data, array("value" => $i, "textanswer" => $post_data[$this->getId() . '_' . $i . '_other'], "uncheck" => true));
457 }
458 }
459 }
460 }
461 return $data;
462 }
463
473 public function checkUserInput($post_data, $survey_id)
474 {
475 $entered_value = $post_data[$this->getId() . "_value"];
476
477 $this->log->debug("Entered value = " . $entered_value);
478
479 if ((!$this->getObligatory($survey_id)) && (strlen($entered_value) == 0)) {
480 return "";
481 }
482
483 if (strlen($entered_value) == 0) {
484 return $this->lng->txt("question_not_checked");
485 }
486
487 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
488 $cat = $this->categories->getCategory($i);
489 if ($cat->other) {
490 if ($i == $entered_value) {
491 if (array_key_exists($this->getId() . "_" . $entered_value . "_other", $post_data) && !strlen($post_data[$this->getId() . "_" . $entered_value . "_other"])) {
492 return $this->lng->txt("question_mr_no_other_answer");
493 }
494 } else {
495 if (strlen($post_data[$this->getId() . "_" . $i . "_other"])) {
496 return $this->lng->txt("question_sr_no_other_answer_checked");
497 }
498 }
499 }
500 }
501
502 return "";
503 }
504
505 public function saveUserInput($post_data, $active_id, $a_return = false)
506 {
508
509 $entered_value = $post_data[$this->getId() . "_value"];
510
511 if ($a_return) {
512 return array(array("value" => $entered_value,
513 "textanswer" => $post_data[$this->getId() . "_" . $entered_value . "_other"]));
514 }
515 if (strlen($entered_value) == 0) {
516 return;
517 }
518
519 $next_id = $ilDB->nextId('svy_answer');
520 #20216
521 $fields = array();
522 $fields['answer_id'] = array("integer", $next_id);
523 $fields['question_fi'] = array("integer", $this->getId());
524 $fields['active_fi'] = array("integer", $active_id);
525 $fields['value'] = array("float", (strlen($entered_value)) ? $entered_value : null);
526 $fields['textanswer'] = array("clob", ($post_data[$this->getId() . "_" . $entered_value . "_other"]) ?
527 $this->stripSlashesAddSpaceFallback($post_data[$this->getId() . "_" . $entered_value . "_other"]) : null);
528 $fields['tstamp'] = array("integer", time());
529
530 $affectedRows = $ilDB->insert("svy_answer", $fields);
531
532 $debug_value = (strlen($entered_value)) ? $entered_value : "NULL";
533 $debug_answer = ($post_data[$this->getId() . "_" . $entered_value . "_other"]) ? $post_data[$this->getId() . "_" . $entered_value . "_other"] : "NULL";
534 $this->log->debug("INSERT svy_answer answer_id=" . $next_id . " question_fi=" . $this->getId() . " active_fi=" . $active_id . " value=" . $debug_value . " textanswer=" . $debug_answer);
535 }
536
543 public function importResponses($a_data)
544 {
545 foreach ($a_data as $id => $data) {
546 $categorytext = "";
547 foreach ($data["material"] as $material) {
548 $categorytext .= $material["text"];
549 }
550 $this->categories->addCategory(
551 $categorytext,
552 strlen($data['other']) ? $data['other'] : 0,
553 strlen($data['neutral']) ? $data['neutral'] : 0,
554 strlen($data['label']) ? $data['label'] : null,
555 strlen($data['scale']) ? $data['scale'] : null
556 );
557 }
558 }
559
566 public function usableForPrecondition()
567 {
568 return true;
569 }
570
577 public function getAvailableRelations()
578 {
579 return array("<", "<=", "=", "<>", ">=", ">");
580 }
581
587 public function getPreconditionOptions()
588 {
590
591 $options = array();
592 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
593 $category = $this->categories->getCategory($i);
594 $options[$category->scale - 1] = $category->scale . " - " . $category->title;
595 }
596 return $options;
597 }
598
605 public function getPreconditionSelectValue($default = "", $title, $variable)
606 {
607 $step3 = new ilSelectInputGUI($title, $variable);
608 $options = $this->getPreconditionOptions();
609 $step3->setOptions($options);
610 $step3->setValue($default);
611 return $step3;
612 }
613
621 public function getPreconditionValueOutput($value)
622 {
623 // #18136
624 $category = $this->categories->getCategoryForScale($value + 1);
625
626 // #17895 - see getPreconditionOptions()
627 return $category->scale .
628 " - " .
629 ((strlen($category->title)) ? $category->title : $this->lng->txt('other_answer'));
630 }
631
632 public function getCategories()
633 {
634 return $this->categories;
635 }
636}
$result
user()
Definition: user.php:4
$_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.
$i
Definition: metadata.php:24
$xml
Definition: metadata.php:332
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $ilDB
$data
Definition: storeScorm.php:23
$ilUser
Definition: imgupload.php:18
$DIC
Definition: xapitoken.php:46