24include_once
"./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
66 include_once
"./Modules/SurveyQuestionPool/classes/class.SurveyCategories.php";
114 $this->label =
$data[
'label'];
119 include_once(
"./Services/RTE/classes/class.ilRTE.php");
125 $this->use_min_answers = (
$data[
'use_min_answers']) ?
true :
false;
126 $this->nr_min_answers =
$data[
'nr_min_answers'];
127 $this->nr_max_answers =
$data[
'nr_max_answers'];
129 $this->categories->flushCategories();
130 $result =
$ilDB->queryF(
"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",
138 $this->categories->addCategory(
$data[
"title"],
$data[
"other"],
$data[
"neutral"],
null, (
$data[
'scale']) ?
$data[
'scale'] : (
$data[
'sequence'] + 1));
142 parent::loadFromDb(
$id);
157 $this->categories->getCategoryCount()
177 $affectedRows = parent::saveToDb($original_id);
178 if ($affectedRows == 1)
182 array($this->
getId())
184 $affectedRows =
$ilDB->manipulateF(
"INSERT INTO " . $this->
getAdditionalTableName() .
" (question_fi, orientation, use_min_answers, nr_min_answers, nr_max_answers) VALUES (%s, %s, %s, %s, %s)",
185 array(
'integer',
'text',
'integer',
'integer',
'integer'),
189 ($this->use_min_answers) ? 1 : 0,
190 ($this->nr_min_answers > 0) ? $this->nr_min_answers :
null,
191 ($this->nr_max_answers > 0) ? $this->nr_max_answers :
null
205 $affectedRows =
$ilDB->manipulateF(
"DELETE FROM svy_variable WHERE question_fi = %s",
207 array($this->
getId())
210 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++)
212 $cat = $this->categories->getCategory($i);
214 $next_id =
$ilDB->nextId(
'svy_variable');
215 $affectedRows =
$ilDB->manipulateF(
"INSERT INTO svy_variable (variable_id, category_fi, question_fi, value1, other, sequence, scale, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
216 array(
'integer',
'integer',
'integer',
'float',
'integer',
'integer',
'integer',
'integer'),
217 array($next_id, $category_id, $this->
getId(), ($i + 1), $cat->other, $i, ($cat->scale > 0) ? $cat->scale :
null, time())
229 function toXML($a_include_header = TRUE, $obligatory_state =
"")
231 include_once(
"./Services/Xml/classes/class.ilXmlWriter.php");
234 $this->
insertXML($a_xml_writer, $a_include_header, $obligatory_state);
235 $xml = $a_xml_writer->xmlDumpMem(FALSE);
236 if (!$a_include_header)
238 $pos = strpos($xml,
"?>");
239 $xml = substr($xml, $pos + 2);
252 function insertXML(&$a_xml_writer, $a_include_header = TRUE, $obligatory_state =
"")
255 "id" => $this->
getId(),
257 "type" => $this->getQuestiontype(),
260 $a_xml_writer->xmlStartTag(
"question", $attrs);
262 $a_xml_writer->xmlElement(
"description", NULL, $this->
getDescription());
263 $a_xml_writer->xmlElement(
"author", NULL, $this->
getAuthor());
264 if (strlen($this->label))
267 "label" => $this->label,
274 $a_xml_writer->xmlStartTag(
"questiontext", $attrs);
276 $a_xml_writer->xmlEndTag(
"questiontext");
278 $a_xml_writer->xmlStartTag(
"responses");
280 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++)
285 if (strlen($this->categories->getCategory($i)->other)) $attrs[
'other'] = $this->categories->getCategory($i)->other;
286 if (strlen($this->categories->getCategory($i)->neutral)) $attrs[
'neutral'] = $this->categories->getCategory($i)->neutral;
287 if (strlen($this->categories->getCategory($i)->label)) $attrs[
'label'] = $this->categories->getCategory($i)->label;
288 if (strlen($this->categories->getCategory($i)->scale)) $attrs[
'scale'] = $this->categories->getCategory($i)->scale;
289 $a_xml_writer->xmlStartTag(
"response_multiple", $attrs);
290 $this->
addMaterialTag($a_xml_writer, $this->categories->getCategory($i)->title);
291 $a_xml_writer->xmlEndTag(
"response_multiple");
294 $a_xml_writer->xmlEndTag(
"responses");
296 if (count($this->material))
298 if (preg_match(
"/il_(\d*?)_(\w+)_(\d+)/", $this->material[
"internal_link"], $matches))
301 "label" => $this->material[
"title"]
303 $a_xml_writer->xmlStartTag(
"material", $attrs);
304 $intlink =
"il_" . IL_INST_ID .
"_" . $matches[2] .
"_" . $matches[3];
305 if (strcmp($matches[1],
"") != 0)
307 $intlink = $this->material[
"internal_link"];
309 $a_xml_writer->xmlElement(
"mattext", NULL, $intlink);
310 $a_xml_writer->xmlEndTag(
"material");
314 $a_xml_writer->xmlStartTag(
"metadata");
315 $a_xml_writer->xmlStartTag(
"metadatafield");
316 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"orientation");
317 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->
getOrientation());
318 $a_xml_writer->xmlEndTag(
"metadatafield");
319 $a_xml_writer->xmlStartTag(
"metadatafield");
320 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"use_min_answers");
321 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->use_min_answers);
322 $a_xml_writer->xmlEndTag(
"metadatafield");
323 $a_xml_writer->xmlStartTag(
"metadatafield");
324 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"nr_min_answers");
325 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->nr_min_answers);
326 $a_xml_writer->xmlEndTag(
"metadatafield");
327 $a_xml_writer->xmlStartTag(
"metadatafield");
328 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"nr_max_answers");
329 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->nr_max_answers);
330 $a_xml_writer->xmlEndTag(
"metadatafield");
331 $a_xml_writer->xmlEndTag(
"metadata");
333 $a_xml_writer->xmlEndTag(
"question");
344 return "SurveyMultipleChoiceQuestion";
366 $entered_value = $post_data[$this->
getId() .
"_value"];
368 if (is_array($entered_value))
370 foreach ($entered_value as $idx => $value)
372 array_push(
$data, array(
"value" => $value,
"textanswer" => $post_data[$this->
getId() .
'_' . $value .
'_other']));
375 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++)
377 $cat = $this->categories->getCategory($i);
381 if (!is_array($entered_value) || !in_array($i, $entered_value))
383 if (strlen($post_data[$this->
getId() .
"_" . $i .
"_other"]))
385 array_push(
$data, array(
"value" => $i,
"textanswer" => $post_data[$this->
getId() .
'_' . $i .
'_other'],
"uncheck" =>
true));
404 $entered_value = $post_data[$this->
getId() .
"_value"];
407 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)
409 return sprintf($this->lng->txt(
"err_no_exact_answers"), $this->nr_min_answers);
411 if ($this->use_min_answers && $this->nr_min_answers > 0 && count($entered_value) < $this->nr_min_answers)
413 return sprintf($this->lng->txt(
"err_no_min_answers"), $this->nr_min_answers);
415 if ($this->use_min_answers && $this->nr_max_answers > 0 && count($entered_value) > $this->nr_max_answers)
417 return sprintf($this->lng->txt(
"err_no_max_answers"), $this->nr_max_answers);
419 if (!is_array($entered_value))
421 return $this->lng->txt(
"question_mr_not_checked");
423 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++)
425 $cat = $this->categories->getCategory($i);
428 if (in_array($i, $entered_value))
430 if (array_key_exists($this->
getId() .
"_" . $i .
"_other", $post_data) && !strlen($post_data[$this->
getId() .
"_" . $i .
"_other"]))
432 return $this->lng->txt(
"question_mr_no_other_answer");
437 if (strlen($post_data[$this->
getId() .
"_" . $i .
"_other"]))
439 return $this->lng->txt(
"question_mr_no_other_answer_checked");
456 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++)
460 $cat = $this->categories->getCategory($i);
461 $next_id =
$ilDB->nextId(
'svy_answer');
462 $affectedRows =
$ilDB->manipulateF(
"INSERT INTO svy_answer (answer_id, question_fi, active_fi, value, textanswer, tstamp) VALUES (%s, %s, %s, %s, %s, %s)",
463 array(
'integer',
'integer',
'integer',
'float',
'text',
'integer'),
464 array($next_id, $this->
getId(), $active_id, $i, ($cat->other) ?
"Random Data" :
null, time())
476 $return_data = array();
478 if (is_array($post_data[$this->
getId() .
"_value"]))
480 foreach ($post_data[$this->
getId() .
"_value"] as $entered_value)
482 if (strlen($entered_value) > 0)
486 $next_id =
$ilDB->nextId(
'svy_answer');
490 $fields[
'answer_id'] = array(
"integer", $next_id);
491 $fields[
'question_fi'] = array(
"integer", $this->
getId());
492 $fields[
'active_fi'] = array(
"integer", $active_id);
493 $fields[
'value'] = array(
"float", (strlen($entered_value)) ? $entered_value : NULL);
494 $fields[
'textanswer'] = array(
"clob", ($post_data[$this->
getId() .
"_" . $entered_value .
"_other"]) ? $post_data[$this->
getId() .
"_" . $entered_value .
"_other"] :
null);
495 $fields[
'tstamp'] = array(
"integer", time());
497 $affectedRows =
$ilDB->insert(
"svy_answer", $fields);
501 $return_data[] = array(
"value"=>$entered_value,
502 "textanswer"=>$post_data[$this->
getId() .
"_" . $entered_value .
"_other"]);
517 $question_id = $this->
getId();
519 $result_array = array();
522 $sql =
"SELECT svy_answer.* FROM svy_answer".
523 " JOIN svy_finished ON (svy_finished.finished_id = svy_answer.active_fi)".
524 " WHERE svy_answer.question_fi = ".$ilDB->quote($question_id,
"integer").
525 " AND svy_finished.survey_fi = ".$ilDB->quote(
$survey_id,
"integer");
528 $sql .=
" AND ".$ilDB->in(
"svy_finished.finished_id", $finished_ids,
"",
"integer");
535 $textanswers = array();
541 if (
$row[
"textanswer"])
543 $textanswers[
$row[
"value"]][] =
$row[
"textanswer"];
547 if (is_array($textanswers))
549 ksort($textanswers, SORT_NUMERIC);
554 $sql =
"SELECT svy_answer.answer_id, svy_answer.question_fi, svy_answer.active_fi".
556 " JOIN svy_finished ON (svy_finished.finished_id = svy_answer.active_fi)".
557 " WHERE svy_answer.question_fi = ".$ilDB->quote($question_id,
"integer").
558 " AND svy_finished.survey_fi = ".$ilDB->quote(
$survey_id,
"integer");
561 $sql .=
" AND ".$ilDB->in(
"svy_finished.finished_id", $finished_ids,
"",
"integer");
564 $mcmr_result =
$ilDB->query($sql);
566 while (
$row =
$ilDB->fetchAssoc($mcmr_result))
568 $found[
$row[
"question_fi"] .
"_" .
$row[
"active_fi"]] = 1;
570 $result_array[
"USERS_ANSWERED"] = count($found);
571 $result_array[
"USERS_SKIPPED"] = $nr_of_users - count($found);
572 $numrows = count($found);
574 $result_array[
"MEDIAN"] =
"";
575 $result_array[
"ARITHMETIC_MEAN"] =
"";
583 $category = $this->categories->getCategoryForScale(key(
$cumulated)+1);
584 $result_array[
"MODE"] = $prefix . $category->title;
585 $result_array[
"MODE_VALUE"] = key(
$cumulated)+1;
588 $result_array[
"QUESTION_TYPE"] =
"SurveyMultipleChoiceQuestion";
590 for ($key = 0; $key < $this->categories->getCategoryCount(); $key++)
592 $cat = $this->categories->getCategory($key);
595 for ($key = 0; $key < $this->categories->getCategoryCount(); $key++)
597 $cat = $this->categories->getCategory($key);
603 $percentage = ($maxvalues > 0) ? (
float)((int)
$cumulated[$cat->scale-1]/$maxvalues) : 0;
606 if(isset($textanswers[$cat->scale-1]))
609 $result_array[
"textanswers"][$key] = $textanswers[$cat->scale-1];
611 $result_array[
"variables"][$key] = array(
"title" => $cat->title,
"selected" => (
int)
$cumulated[$cat->scale-1],
"percentage" => $percentage);
613 return $result_array;
627 include_once (
"./Services/Excel/classes/class.ilExcelUtils.php");
628 $worksheet =& $workbook->addWorksheet();
630 switch ($export_label)
656 $worksheet->write($rowcounter, 1, $eval_data[
"USERS_ANSWERED"]);
659 $worksheet->write($rowcounter, 1, $eval_data[
"USERS_SKIPPED"]);
673 foreach ($eval_data[
"variables"] as $key => $value)
676 $category = $this->categories->getCategory($key);
677 $worksheet->write($rowcounter, 2, $category->scale);
683 if (is_array($eval_data[
"textanswers"]))
689 foreach ($eval_data[
"textanswers"] as $key => $answers)
691 $title = $eval_data[
"variables"][$key][
"title"];
692 foreach ($answers as $answer)
709 parent::addUserSpecificResultsExportTitles($a_array, $a_use_label, $a_substitute);
711 for ($index = 0; $index < $this->categories->getCategoryCount(); $index++)
713 $category = $this->categories->getCategory($index);
714 $title = $category->title;
716 if(!$a_use_label || $a_substitute)
718 array_push($a_array,
$title);
722 array_push($a_array,
"");
726 if ($category->other)
728 if(!$a_use_label || $a_substitute)
730 array_push($a_array,
$title .
" - ". $this->lng->txt(
"other"));
734 array_push($a_array,
"");
749 if (count($resultset[
"answers"][$this->
getId()]))
751 array_push($a_array,
"");
752 for ($index = 0; $index < $this->categories->getCategoryCount(); $index++)
754 $category = $this->categories->getCategory($index);
755 $incoming_value = $category->scale ? $category->scale-1 : $index;
759 foreach ($resultset[
"answers"][$this->
getId()] as $answerdata)
761 if (strcmp($incoming_value, $answerdata[
"value"]) == 0)
763 $found = $answerdata[
"value"]+1;
764 $textanswer = $answerdata[
"textanswer"];
769 array_push($a_array, $found);
773 array_push($a_array,
"0");
775 if ($category->other)
777 array_push($a_array, $textanswer);
784 for ($index = 0; $index < $this->categories->getCategoryCount(); $index++)
786 array_push($a_array,
"");
789 $category = $this->categories->getCategory($index);
790 if ($category->other)
792 array_push($a_array,
"");
811 $sql =
"SELECT svy_answer.* FROM svy_answer".
812 " JOIN svy_finished ON (svy_finished.finished_id = svy_answer.active_fi)".
813 " WHERE svy_answer.question_fi = ".$ilDB->quote($this->
getId(),
"integer").
814 " AND svy_finished.survey_fi = ".$ilDB->quote(
$survey_id,
"integer");
817 $sql .=
" AND ".$ilDB->in(
"svy_finished.finished_id", $finished_ids,
"",
"integer");
823 $category = $this->categories->getCategoryForScale(
$row[
"value"]+1);
824 if (!is_array($answers[
$row[
"active_fi"]]))
826 $answers[
$row[
"active_fi"]] = array();
828 $title =
$row[
"value"] + 1 .
" - " . $category->title;
829 if ($category->other)
$title .=
": " .
$row[
"textanswer"];
830 $catindex = $this->categories->getIndex($category);
831 if ($catindex !==
null)
833 $answers[
$row[
"active_fi"]][$catindex] =
$title;
837 array_push($answers[
$row[
"active_fi"]],
$title);
839 ksort($answers[
$row[
"active_fi"]], SORT_NUMERIC);
854 foreach ($a_meta as $key => $value)
856 switch ($value[
"label"])
861 case "use_min_answers":
862 $this->use_min_answers = $value[
"entry"];
864 case "nr_min_answers":
865 $this->nr_min_answers = $value[
"entry"];
867 case "nr_max_answers":
868 $this->nr_max_answers = $value[
"entry"];
889 $this->categories->addCategory(
892 strlen(
$data[
'neutral']) ?
$data[
'neutral'] : 0,
893 strlen(
$data[
'label']) ?
$data[
'label'] :
null,
894 strlen(
$data[
'scale']) ?
$data[
'scale'] :
null
918 return array(
"=",
"<>");
931 for ($i = 0; $i < $this->categories->getCategoryCount(); $i++)
933 $category = $this->categories->getCategory($i);
934 $options[$category->scale-1] = $category->scale .
" - " . $category->title;
947 include_once
"./Services/Form/classes/class.ilSelectInputGUI.php";
951 $step3->setValue($default);
965 $category = $this->categories->getCategoryForScale($value+1);
968 return $category->scale .
970 ((strlen($category->title)) ? $category->title : $this->lng->txt(
'other_answer'));
MultipleChoice survey question.
setExportDetailsXLS(&$workbook, &$format_title, &$format_bold, &$eval_data, $export_label)
Creates an Excel worksheet for the detailed cumulated results of this question.
_getQuestionDataArray($id)
Returns the question data fields from the database.
getPreconditionValueOutput($value)
Returns the output for a precondition value.
SurveyMultipleChoiceQuestion( $title="", $description="", $author="", $questiontext="", $owner=-1, $orientation=0)
The constructor takes possible arguments an creates an instance of the SurveyMultipleChoiceQuestion o...
getAvailableRelations()
Returns the available relations for the question.
getPreconditionSelectValue($default="", $title, $variable)
Creates a form property for the precondition value.
insertXML(&$a_xml_writer, $a_include_header=TRUE, $obligatory_state="")
Adds the question XML to a given XMLWriter object.
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.
addUserSpecificResultsData(&$a_array, &$resultset)
Adds the values for the user specific results export for a given user.
saveToDb($original_id="")
Saves a SurveyMultipleChoiceQuestion object to a database.
toXML($a_include_header=TRUE, $obligatory_state="")
Returns an xml representation of the question.
getPreconditionOptions()
Returns the options for preconditions.
& getUserAnswers($survey_id, $finished_ids)
Returns an array containing all answers to this question in a given survey.
importAdditionalMetadata($a_meta)
Import additional meta data from the question import file.
saveRandomData($active_id)
Saves random answers for a given active user in the database.
addUserSpecificResultsExportTitles(&$a_array, $a_use_label=false, $a_substitute=true)
Adds the entries for the title row of the user specific results.
& getWorkingDataFromUserInput($post_data)
Creates the user data of the svy_answer table from the POST data.
& getCumulatedResults($survey_id, $nr_of_users, $finished_ids)
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.
SurveyQuestion( $title="", $description="", $author="", $questiontext="", $owner=-1)
SurveyQuestion constructor The constructor takes possible arguments an creates an instance of the Sur...
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.
$cumulated
An array containing the cumulated results of the question for a given survey.
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.
getOrientation()
Gets the orientation of the question output.
setObligatory($obligatory=1)
Sets the obligatory state of the question.
_convert_text($a_text, $a_target="has been removed")
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.
if(!is_array($argv)) $options