ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
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 
24 include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
25 
38 {
44  public $categories;
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  {
80  $ilDB = $this->db;
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  {
106  $ilDB = $this->db;
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  {
132  $ilDB = $this->db;
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  {
154  $ilDB = $this->db;
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  {
219  $ilDB = $this->db;
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  {
245  $ilDB = $this->db;
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  {
414  $ilDB = $this->db;
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  {
534  $ilDB = $this->db;
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"]) ? $post_data[$this->getId() . "_" . $entered_value . "_other"] : null);
554  $fields['tstamp'] = array("integer", time());
555 
556  $affectedRows = $ilDB->insert("svy_answer", $fields);
557 
558  $debug_value = (strlen($entered_value)) ? $entered_value : "NULL";
559  $debug_answer = ($post_data[$this->getId() . "_" . $entered_value . "_other"]) ? $post_data[$this->getId() . "_" . $entered_value . "_other"] : "NULL";
560  $this->log->debug("INSERT svy_answer answer_id=" . $next_id . " question_fi=" . $this->getId() . " active_fi=" . $active_id . " value=" . $debug_value . " textanswer=" . $debug_answer);
561  }
562 
569  public function importResponses($a_data)
570  {
571  foreach ($a_data as $id => $data) {
572  $categorytext = "";
573  foreach ($data["material"] as $material) {
574  $categorytext .= $material["text"];
575  }
576  $this->categories->addCategory(
577  $categorytext,
578  strlen($data['other']) ? $data['other'] : 0,
579  strlen($data['neutral']) ? $data['neutral'] : 0,
580  strlen($data['label']) ? $data['label'] : null,
581  strlen($data['scale']) ? $data['scale'] : null
582  );
583  }
584  }
585 
592  public function usableForPrecondition()
593  {
594  return true;
595  }
596 
603  public function getAvailableRelations()
604  {
605  return array("<", "<=", "=", "<>", ">=", ">");
606  }
607 
613  public function getPreconditionOptions()
614  {
615  $lng = $this->lng;
616 
617  $options = array();
618  for ($i = 0; $i < $this->categories->getCategoryCount(); $i++) {
619  $category = $this->categories->getCategory($i);
620  $options[$category->scale-1] = $category->scale . " - " . $category->title;
621  }
622  return $options;
623  }
624 
631  public function getPreconditionSelectValue($default = "", $title, $variable)
632  {
633  include_once "./Services/Form/classes/class.ilSelectInputGUI.php";
634  $step3 = new ilSelectInputGUI($title, $variable);
635  $options = $this->getPreconditionOptions();
636  $step3->setOptions($options);
637  $step3->setValue($default);
638  return $step3;
639  }
640 
648  public function getPreconditionValueOutput($value)
649  {
650  // #18136
651  $category = $this->categories->getCategoryForScale($value+1);
652 
653  // #17895 - see getPreconditionOptions()
654  return $category->scale .
655  " - " .
656  ((strlen($category->title)) ? $category->title : $this->lng->txt('other_answer'));
657  }
658 
659  public function getCategories()
660  {
661  return $this->categories;
662  }
663 }
& getWorkingDataFromUserInput($post_data)
Creates the user data of the svy_answer table from the POST data.
saveUserInput($post_data, $active_id, $a_return=false)
saveCategoryToDb($categorytext, $neutral=0)
Saves a category to the database.
saveCompletionStatus($original_id="")
Saves the complete flag to the database.
getPreconditionValueOutput($value)
Returns the output for a precondition value.
getAuthor()
Gets the authors name of the SurveyQuestion object.
getTitle()
Gets the title string of the SurveyQuestion object.
usableForPrecondition()
Returns if the question is usable for preconditions.
$_SESSION["AccountId"]
This class represents a selection list property in a property form.
$result
getObligatory($survey_id="")
Gets the obligatory state of the question.
global $DIC
Definition: saml.php:7
setObligatory($obligatory=1)
Sets the obligatory state of the question.
setOrientation($orientation=0)
Sets the orientation of the question output.
importAdditionalMetadata($a_meta)
Import additional meta data from the question import file.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
setId($id=-1)
Sets the id of the SurveyQuestion object.
isComplete()
Returns true if the question is complete for use.
savePhrase($title)
Saves a set of categories to a default phrase.
XML writer class.
getQuestiontext()
Gets the questiontext of the SurveyQuestion object.
getOrientation()
Gets the orientation of the question output.
addStandardNumbers($lower_limit, $upper_limit)
Adds standard numbers as categories.
importResponses($a_data)
Import response data from the question import file.
saveToDb($original_id="")
Saves a SurveySingleChoiceQuestion object to a database.
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...
setOwner($owner="")
Sets the creator/owner ID of the SurveyQuestion object.
user()
Definition: user.php:4
setComplete($a_complete)
Sets the complete state of the question.
$counter
setOriginalId($original_id)
$xml
Definition: metadata.php:240
setQuestiontext($questiontext="")
Sets the questiontext of the SurveyQuestion object.
Class SurveyCategories.
getPreconditionOptions()
Returns the options for preconditions.
toXML($a_include_header=true, $obligatory_state="")
Returns an xml representation of the question.
getId()
Gets the id of the SurveyQuestion object.
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.
Basic class for all survey question types.
saveMaterial()
save material to db
$ilUser
Definition: imgupload.php:18
insertXML(&$a_xml_writer, $a_include_header=true)
Adds the question XML to a given XMLWriter object.
xmlHeader()
Writes xml header public.
& getCategoriesForPhrase($phrase_id)
Gets the available categories for a given phrase.
getQuestionDataArray($id)
Returns the question data fields from the database.
Create styles array
The data for the language used.
setAuthor($author="")
Sets the authors name of the SurveyQuestion object.
loadFromDb($id)
Loads a SurveySingleChoiceQuestion object from the database.
setDescription($description="")
Sets the description string of the SurveyQuestion object.
global $ilDB
checkUserInput($post_data, $survey_id)
Checks the input of the active user for obligatory status and entered values.
$i
Definition: disco.tpl.php:19
addPhrase($phrase_id)
Adds a phrase to the question.
getQuestionType()
Returns the question type of the question.
getDescription()
Gets the description string of the SurveyQuestion object.
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
setObjId($obj_id=0)
Set the reference id of the container object.
$key
Definition: croninfo.php:18
__construct($title="", $description="", $author="", $questiontext="", $owner=-1, $orientation=1)
SurveySingleChoiceQuestion constructor.
getPreconditionSelectValue($default="", $title, $variable)
Creates a form property for the precondition value.
getAvailableRelations()
Returns the available relations for the question.
if(!isset($_REQUEST['ReturnTo'])) if(!isset($_REQUEST['AuthId'])) $options
Definition: as_login.php:20
setTitle($title="")
Sets the title string of the SurveyQuestion object.