ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.SurveyMatrixQuestion.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
36{
43
49 var $rows;
50
57
64
72
80
88
89 /*
90 * Layout of the matrix question
91 *
92 * @var array
93 */
95
96 /*
97 * Use placeholders for the column titles
98 *
99 * @var boolean
100 */
102
103 /*
104 * Show a legend
105 *
106 * @var boolean
107 */
109
111
113
115
116 /*
117 * Use random order for rows
118 *
119 * @var boolean
120 */
122
124
126
128
130
131
147
159 $title = "",
160 $description = "",
161 $author = "",
162 $questiontext = "",
163 $owner = -1
164 )
165 {
167 $this->subtype = 0;
168 include_once "./Modules/SurveyQuestionPool/classes/class.SurveyCategories.php";
169 $this->columns = new SurveyCategories();
170 $this->rows = new SurveyCategories();
171 $this->bipolar_adjective1 = "";
172 $this->bipolar_adjective2 = "";
173 $this->rowSeparators = 0;
174 $this->columnSeparators = 0;
175 $this->neutralColumnSeparator = 1;
176 }
177
185 function getColumnCount()
186 {
187 return $this->columns->getCategoryCount();
188 }
189
197 function removeColumn($index)
198 {
199 $this->columns->removeCategory($index);
200 }
201
209 function removeColumns($array)
210 {
211 $this->columns->removeCategories($array);
212 }
213
221 function removeColumnWithName($name)
222 {
223 $this->columns->removeCategoryWithName($name);
224 }
225
229 public function getColumns()
230 {
231 return $this->columns;
232 }
233
242 function getColumn($index)
243 {
244 return $this->columns->getCategory($index);
245 }
246
247 function getColumnForScale($scale)
248 {
249 return $this->columns->getCategoryForScale($scale);
250 }
251
259 function getColumnIndex($name)
260 {
261 return $this->columns->getCategoryIndex($name);
262 }
263
264
271 function flushColumns()
272 {
273 $this->columns->flushCategories();
274 }
275
282 function getRowCount()
283 {
284 return $this->rows->getCategoryCount();
285 }
286
292 function addRow($a_text, $a_other, $a_label)
293 {
294 $this->rows->addCategory($a_text, $a_other, 0, $a_label);
295 }
296
303 function addRowAtPosition($a_text, $a_other, $a_position)
304 {
305 $this->rows->addCategoryAtPosition($a_text, $a_position, $a_other);
306 }
307
314 function flushRows()
315 {
316 $this->rows = new SurveyCategories();
317 }
318
325 function getRow($a_index)
326 {
327 return $this->rows->getCategory($a_index);
328 }
329
330 function moveRowUp($index)
331 {
332 $this->rows->moveCategoryUp($index);
333 }
334
335 function moveRowDown($index)
336 {
337 $this->rows->moveCategoryDown($index);
338 }
339
347 function removeRows($array)
348 {
349 $this->rows->removeCategories($array);
350 }
351
357 public function removeRow($index)
358 {
359 $this->rows->removeCategory($index);
360 }
361
369 function getBipolarAdjective($a_index)
370 {
371 switch ($a_index)
372 {
373 case 1:
374 return (strlen($this->bipolar_adjective2)) ? $this->bipolar_adjective2 : NULL;
375 break;
376 case 0:
377 default:
378 return (strlen($this->bipolar_adjective1)) ? $this->bipolar_adjective1 : NULL;
379 break;
380 }
381 return NULL;
382 }
383
391 function setBipolarAdjective($a_index, $a_value)
392 {
393 switch ($a_index)
394 {
395 case 1:
396 $this->bipolar_adjective2 = $a_value;
397 break;
398 case 0:
399 default:
400 $this->bipolar_adjective1 = $a_value;
401 break;
402 }
403 }
404
411 function addPhrase($phrase_id)
412 {
413 global $ilUser;
414 global $ilDB;
415
416 $result = $ilDB->queryF("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 = %s OR svy_category.owner_fi = %s) ORDER BY svy_phrase_cat.sequence",
417 array('integer', 'integer', 'integer'),
418 array($phrase_id, 0, $ilUser->getId())
419 );
420 while ($row = $ilDB->fetchAssoc($result))
421 {
422 $neutral = $row["neutral"];
423 if (($row["defaultvalue"] == 1) && ($row["owner_fi"] == 0))
424 {
425 $this->columns->addCategory($this->lng->txt($row["title"]), 0, $neutral);
426 }
427 else
428 {
429 $this->columns->addCategory($row["title"], 0, $neutral);
430 }
431 }
432 }
433
442 {
443 global $ilDB;
444
445 $result = $ilDB->queryF("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",
446 array('integer'),
447 array($id)
448 );
449 if ($result->numRows() == 1)
450 {
451 return $ilDB->fetchAssoc($result);
452 }
453 else
454 {
455 return array();
456 }
457 }
458
465 function loadFromDb($id)
466 {
467 global $ilDB;
468 $result = $ilDB->queryF("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",
469 array('integer'),
470 array($id)
471 );
472 if ($result->numRows() == 1)
473 {
474 $data = $ilDB->fetchAssoc($result);
475 $this->setId($data["question_id"]);
476 $this->setTitle($data["title"]);
477 $this->label = $data['label'];
478 $this->setDescription($data["description"]);
479 $this->setObjId($data["obj_fi"]);
480 $this->setAuthor($data["author"]);
481 $this->setOwner($data["owner_fi"]);
482 include_once("./Services/RTE/classes/class.ilRTE.php");
483 $this->setQuestiontext(ilRTE::_replaceMediaObjectImageSrc($data["questiontext"], 1));
484 $this->setObligatory($data["obligatory"]);
485 $this->setComplete($data["complete"]);
486 $this->setOriginalId($data["original_id"]);
487 $this->setSubtype($data["subtype"]);
488 $this->setRowSeparators($data["row_separators"]);
489 $this->setNeutralColumnSeparator($data["neutral_column_separator"]);
490 $this->setColumnSeparators($data["column_separators"]);
491 $this->setColumnPlaceholders($data["column_placeholders"]);
492 $this->setLegend($data["legend"]);
493 $this->setSingleLineRowCaption($data["singleline_row_caption"]);
494 $this->setRepeatColumnHeader($data["repeat_column_header"]);
495 $this->setColumnHeaderPosition($data["column_header_position"]);
496 $this->setRandomRows($data["random_rows"]);
497 $this->setColumnOrder($data["column_order"]);
498 $this->setColumnImages($data["column_images"]);
499 $this->setRowImages($data["row_images"]);
500 $this->setBipolarAdjective(0, $data["bipolar_adjective1"]);
501 $this->setBipolarAdjective(1, $data["bipolar_adjective2"]);
502 $this->setLayout($data["layout"]);
503 $this->flushColumns();
504
505 $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",
506 array('integer'),
507 array($id)
508 );
509 if ($result->numRows() > 0)
510 {
511 while ($data = $ilDB->fetchAssoc($result))
512 {
513 $this->columns->addCategory($data["title"], $data["other"], $data["neutral"], null, ($data['scale']) ? $data['scale'] : ($data['sequence'] + 1));
514 }
515 }
516
517 $result = $ilDB->queryF("SELECT * FROM svy_qst_matrixrows WHERE question_fi = %s ORDER BY sequence",
518 array('integer'),
519 array($id)
520 );
521 while ($row = $ilDB->fetchAssoc($result))
522 {
523 $this->addRow($row["title"], $row['other'], $row['label']);
524 }
525 }
526 parent::loadFromDb($id);
527 }
528
535 function isComplete()
536 {
537 if (
538 strlen($this->getTitle()) &&
539 strlen($this->getAuthor()) &&
540 strlen($this->getQuestiontext()) &&
541 $this->getColumnCount() &&
542 $this->getRowCount()
543 )
544 {
545 return 1;
546 }
547 else
548 {
549 return 0;
550 }
551 }
552
558 function saveToDb($original_id = NULL, $withanswers = true)
559 {
560 global $ilDB;
561
562 $affectedRows = parent::saveToDb($original_id);
563
564 if ($affectedRows == 1)
565 {
566 $affectedRows = $ilDB->manipulateF("DELETE FROM " . $this->getAdditionalTableName() . " WHERE question_fi = %s",
567 array('integer'),
568 array($this->getId())
569 );
570 $affectedRows = $ilDB->manipulateF("INSERT INTO " . $this->getAdditionalTableName() . " (
571 question_fi, subtype, column_separators, row_separators, neutral_column_separator,column_placeholders,
572 legend, singleline_row_caption, repeat_column_header, column_header_position, random_rows,
573 column_order, column_images, row_images, bipolar_adjective1, bipolar_adjective2, layout, tstamp)
574 VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
575 array(
576 'integer', 'integer', 'text', 'text', 'text', 'integer', 'text', 'text', 'text',
577 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'integer'
578 ),
579 array(
580 $this->getId(),
581 $this->getSubtype(),
582 $this->getColumnSeparators(),
583 $this->getRowSeparators(),
585 $this->getColumnPlaceholders(),
586 $this->getLegend(),
588 $this->getRepeatColumnHeader(),
590 $this->getRandomRows(),
591 $this->getColumnOrder(),
592 $this->getColumnImages(),
593 $this->getRowImages(),
594 $this->getBipolarAdjective(0),
595 $this->getBipolarAdjective(1),
596 serialize($this->getLayout()),
597 time()
598 )
599 );
600
601 // saving material uris in the database
602 $this->saveMaterial();
603
604 $this->saveColumnsToDb();
605 $this->saveRowsToDb();
606 }
607 }
608
609 function saveBipolarAdjectives($adjective1, $adjective2)
610 {
611 global $ilDB;
612
613 $affectedRows = $ilDB->manipulateF("UPDATE " . $this->getAdditionalTableName() . " SET bipolar_adjective1 = %s, bipolar_adjective2 = %s WHERE question_fi = %s",
614 array('text', 'text', 'integer'),
615 array((strlen($adjective1)) ? $adjective1 : NULL, (strlen($adjective2)) ? $adjective2 : NULL, $this->getId())
616 );
617 }
618
627 function saveColumnToDb($columntext, $neutral = 0)
628 {
629 global $ilUser, $ilDB;
630
631 $result = $ilDB->queryF("SELECT title, category_id FROM svy_category WHERE title = %s AND neutral = %s AND owner_fi = %s",
632 array('text', 'text', 'integer'),
633 array($columntext, $neutral, $ilUser->getId())
634 );
635 $insert = FALSE;
636 $returnvalue = "";
637 if ($result->numRows())
638 {
639 $insert = TRUE;
640 while ($row = $ilDB->fetchAssoc($result))
641 {
642 if (strcmp($row["title"], $columntext) == 0)
643 {
644 $returnvalue = $row["category_id"];
645 $insert = FALSE;
646 }
647 }
648 }
649 else
650 {
651 $insert = TRUE;
652 }
653 if ($insert)
654 {
655 $next_id = $ilDB->nextId('svy_category');
656 $affectedRows = $ilDB->manipulateF("INSERT INTO svy_category (category_id, title, defaultvalue, owner_fi, neutral, tstamp) VALUES (%s, %s, %s, %s, %s, %s)",
657 array('integer', 'text', 'text', 'integer', 'text', 'integer'),
658 array($next_id, $columntext, 0, $ilUser->getId(), $neutral, time())
659 );
660 $returnvalue = $next_id;
661 }
662 return $returnvalue;
663 }
664
665 function saveColumnsToDb($original_id = "")
666 {
667 global $ilDB;
668
669 // save columns
670 $question_id = $this->getId();
671 if (strlen($original_id))
672 {
673 $question_id = $original_id;
674 }
675
676 // delete existing column relations
677 $affectedRows = $ilDB->manipulateF("DELETE FROM svy_variable WHERE question_fi = %s",
678 array('integer'),
679 array($question_id)
680 );
681 // create new column relations
682 for ($i = 0; $i < $this->getColumnCount(); $i++)
683 {
684 $cat = $this->getColumn($i);
685 $column_id = $this->saveColumnToDb($cat->title, $cat->neutral);
686 $next_id = $ilDB->nextId('svy_variable');
687 $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)",
688 array('integer','integer','integer','float','integer','integer', 'integer','integer'),
689 array($next_id, $column_id, $question_id, ($i + 1), $cat->other, $i, ($cat->scale > 0) ? $cat->scale : null, time())
690 );
691 }
692 $this->saveCompletionStatus($original_id);
693 }
694
695 function saveRowsToDb($original_id = "")
696 {
697 global $ilDB;
698
699 // save rows
700 $question_id = $this->getId();
701 if (strlen($original_id))
702 {
703 $question_id = $original_id;
704 }
705
706 // delete existing rows
707 $affectedRows = $ilDB->manipulateF("DELETE FROM svy_qst_matrixrows WHERE question_fi = %s",
708 array('integer'),
709 array($question_id)
710 );
711 // create new rows
712 for ($i = 0; $i < $this->getRowCount(); $i++)
713 {
714 $row = $this->getRow($i);
715 $next_id = $ilDB->nextId('svy_qst_matrixrows');
716 $affectedRows = $ilDB->manipulateF("INSERT INTO svy_qst_matrixrows (id_svy_qst_matrixrows, title, label, other, sequence, question_fi) VALUES (%s, %s, %s, %s, %s, %s)",
717 array('integer','text','text','integer','integer','integer'),
718 array($next_id, $row->title, $row->label, ($row->other) ? 1 : 0, $i, $question_id)
719 );
720 }
721 $this->saveCompletionStatus($original_id);
722 }
723
730 function toXML($a_include_header = TRUE, $obligatory_state = "")
731 {
732 include_once("./Services/Xml/classes/class.ilXmlWriter.php");
733 $a_xml_writer = new ilXmlWriter;
734 $a_xml_writer->xmlHeader();
735 $this->insertXML($a_xml_writer, $a_include_header, $obligatory_state);
736 $xml = $a_xml_writer->xmlDumpMem(FALSE);
737 if (!$a_include_header)
738 {
739 $pos = strpos($xml, "?>");
740 $xml = substr($xml, $pos + 2);
741 }
742 return $xml;
743 }
744
753 function insertXML(&$a_xml_writer, $a_include_header = TRUE, $obligatory_state = "")
754 {
755 $attrs = array(
756 "id" => $this->getId(),
757 "title" => $this->getTitle(),
758 "type" => $this->getQuestiontype(),
759 "subtype" => $this->getSubtype(),
760 "obligatory" => $this->getObligatory()
761 );
762 $a_xml_writer->xmlStartTag("question", $attrs);
763
764 $a_xml_writer->xmlElement("description", NULL, $this->getDescription());
765 $a_xml_writer->xmlElement("author", NULL, $this->getAuthor());
766 $a_xml_writer->xmlStartTag("questiontext");
767 $this->addMaterialTag($a_xml_writer, $this->getQuestiontext());
768 $a_xml_writer->xmlEndTag("questiontext");
769
770 $a_xml_writer->xmlStartTag("matrix");
771 $a_xml_writer->xmlStartTag("matrixrows");
772 for ($i = 0; $i < $this->getRowCount(); $i++)
773 {
774 $attrs = array(
775 "id" => $i
776 );
777 if (strlen($this->getRow($i)->label))
778 {
779 $attrs['label'] = $this->getRow($i)->label;
780 }
781 if ($this->getRow($i)->other)
782 {
783 $attrs['other'] = 1;
784 }
785 $a_xml_writer->xmlStartTag("matrixrow", $attrs);
786 $this->addMaterialTag($a_xml_writer, $this->getRow($i)->title);
787 $a_xml_writer->xmlEndTag("matrixrow");
788 }
789 $a_xml_writer->xmlEndTag("matrixrows");
790
791 $a_xml_writer->xmlStartTag("responses");
792 if (strlen($this->getBipolarAdjective(0)) && (strlen($this->getBipolarAdjective(1))))
793 {
794 $a_xml_writer->xmlStartTag("bipolar_adjectives");
795 $attribs = array(
796 "label" => "0"
797 );
798 $a_xml_writer->xmlElement("adjective", $attribs, $this->getBipolarAdjective(0));
799 $attribs = array(
800 "label" => "1"
801 );
802 $a_xml_writer->xmlElement("adjective", $attribs, $this->getBipolarAdjective(1));
803 $a_xml_writer->xmlEndTag("bipolar_adjectives");
804 }
805 for ($i = 0; $i < $this->getColumnCount(); $i++)
806 {
807 $attrs = array(
808 "id" => $i
809 );
810 if ($this->getColumn($i)->neutral)
811 {
812 $attrs['label'] = 'neutral';
813 }
814 switch ($this->getSubtype())
815 {
816 case 0:
817 $a_xml_writer->xmlStartTag("response_single", $attrs);
818 break;
819 case 1:
820 $a_xml_writer->xmlStartTag("response_multiple", $attrs);
821 break;
822 }
823 $this->addMaterialTag($a_xml_writer, $this->getColumn($i)->title);
824 switch ($this->getSubtype())
825 {
826 case 0:
827 $a_xml_writer->xmlEndTag("response_single");
828 break;
829 case 1:
830 $a_xml_writer->xmlEndTag("response_multiple");
831 break;
832 }
833 }
834
835 $a_xml_writer->xmlEndTag("responses");
836 $a_xml_writer->xmlEndTag("matrix");
837
838 if (count($this->material))
839 {
840 if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $this->material["internal_link"], $matches))
841 {
842 $attrs = array(
843 "label" => $this->material["title"]
844 );
845 $a_xml_writer->xmlStartTag("material", $attrs);
846 $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
847 if (strcmp($matches[1], "") != 0)
848 {
849 $intlink = $this->material["internal_link"];
850 }
851 $a_xml_writer->xmlElement("mattext", NULL, $intlink);
852 $a_xml_writer->xmlEndTag("material");
853 }
854 }
855
856 $a_xml_writer->xmlStartTag("metadata");
857 $a_xml_writer->xmlStartTag("metadatafield");
858 $a_xml_writer->xmlElement("fieldlabel", NULL, "column_separators");
859 $a_xml_writer->xmlElement("fieldentry", NULL, $this->getColumnSeparators());
860 $a_xml_writer->xmlEndTag("metadatafield");
861
862 $a_xml_writer->xmlStartTag("metadatafield");
863 $a_xml_writer->xmlElement("fieldlabel", NULL, "row_separators");
864 $a_xml_writer->xmlElement("fieldentry", NULL, $this->getRowSeparators());
865 $a_xml_writer->xmlEndTag("metadatafield");
866
867 $a_xml_writer->xmlStartTag("metadatafield");
868 $a_xml_writer->xmlElement("fieldlabel", NULL, "neutral_column_separator");
869 $a_xml_writer->xmlElement("fieldentry", NULL, $this->getNeutralColumnSeparator());
870 $a_xml_writer->xmlEndTag("metadatafield");
871
872 $a_xml_writer->xmlStartTag("metadatafield");
873 $a_xml_writer->xmlElement("fieldlabel", NULL, "layout");
874 $a_xml_writer->xmlElement("fieldentry", NULL, serialize($this->getLayout()));
875 $a_xml_writer->xmlEndTag("metadatafield");
876
877 $a_xml_writer->xmlEndTag("metadata");
878
879 $a_xml_writer->xmlEndTag("question");
880 }
881
883 {
884 if ($this->getOriginalId())
885 {
886 parent::syncWithOriginal();
887 $this->saveColumnsToDb($this->getOriginalId());
888 $this->saveRowsToDb($this->getOriginalId());
889 }
890 }
891
892
900 function addStandardNumbers($lower_limit, $upper_limit)
901 {
902 for ($i = $lower_limit; $i <= $upper_limit; $i++)
903 {
904 $this->columns->addCategory($i);
905 }
906 }
907
916 {
917 global $ilUser;
918 global $ilDB;
919
920 $next_id = $ilDB->nextId('svy_phrase');
921 $affectedRows = $ilDB->manipulateF("INSERT INTO svy_phrase (phrase_id, title, defaultvalue, owner_fi, tstamp) VALUES (%s, %s, %s, %s, %s)",
922 array('integer','text','text','integer','integer'),
923 array($next_id, $title, 1, $ilUser->getId(), time())
924 );
925 $phrase_id = $next_id;
926
927 $counter = 1;
928 foreach ($_SESSION['save_phrase_data'] as $data)
929 {
930 $next_id = $ilDB->nextId('svy_category');
931 $affectedRows = $ilDB->manipulateF("INSERT INTO svy_category (category_id, title, defaultvalue, owner_fi, tstamp, neutral) VALUES (%s, %s, %s, %s, %s, %s)",
932 array('integer','text','text','integer','integer','text'),
933 array($next_id, $data['answer'], 1, $ilUser->getId(), time(), $data['neutral'])
934 );
935 $category_id = $next_id;
936 $next_id = $ilDB->nextId('svy_phrase_cat');
937 $affectedRows = $ilDB->manipulateF("INSERT INTO svy_phrase_cat (phrase_category_id, phrase_fi, category_fi, sequence, other, scale) VALUES (%s, %s, %s, %s, %s, %s)",
938 array('integer', 'integer', 'integer','integer', 'integer', 'integer'),
939 array($next_id, $phrase_id, $category_id, $counter, ($data['other']) ? 1 : 0, $data['scale'])
940 );
941 $counter++;
942 }
943 }
944
952 {
953 return "SurveyMatrixQuestion";
954 }
955
963 {
964 return "svy_qst_matrix";
965 }
966
973 function &getWorkingDataFromUserInput($post_data)
974 {
975 $data = array();
976 foreach ($post_data as $key => $value)
977 {
978 switch ($this->getSubtype())
979 {
980 case 0:
981 if (preg_match("/matrix_" . $this->getId() . "_(\d+)/", $key, $matches))
982 {
983 if (is_array($value))
984 {
985 foreach ($value as $val)
986 {
987 array_push($data, array("value" => $val, "rowvalue" => $matches[1], "textanswer" => $post_data['matrix_other_' . $this->getId() . '_' . $matches[1]]));
988 }
989 }
990 else
991 {
992 array_push($data, array("value" => $value, "rowvalue" => $matches[1], "textanswer" => $post_data['matrix_other_' . $this->getId() . '_' . $matches[1]]));
993 }
994 }
995 break;
996 case 1:
997 if (preg_match("/matrix_" . $this->getId() . "_(\d+)/", $key, $matches))
998 {
999 if (is_array($value))
1000 {
1001 foreach ($value as $val)
1002 {
1003 array_push($data, array("value" => $val, "rowvalue" => $matches[1], "textanswer" => $post_data['matrix_other_' . $this->getId() . '_' . $matches[1]]));
1004 }
1005 }
1006 else
1007 {
1008 array_push($data, array("value" => $value, "rowvalue" => $matches[1], "textanswer" => $post_data['matrix_other_' . $this->getId() . '_' . $matches[1]]));
1009 }
1010 }
1011 break;
1012 }
1013 }
1014 return $data;
1015 }
1016
1026 function checkUserInput($post_data, $survey_id)
1027 {
1028 if (!$this->getObligatory($survey_id)) return "";
1029 switch ($this->getSubtype())
1030 {
1031 case 0:
1032 $counter = 0;
1033 foreach ($post_data as $key => $value)
1034 {
1035 if (preg_match("/matrix_" . $this->getId() . "_(\d+)/", $key, $matches))
1036 {
1037 if (array_key_exists('matrix_other_' . $this->getId() . "_" . $matches[1], $post_data) && strlen($post_data['matrix_other_' . $this->getId() . "_" . $matches[1]]) == 0)
1038 {
1039 return $this->lng->txt("question_mr_no_other_answer");
1040 }
1041 $counter++;
1042 }
1043 }
1044 if ($counter != $this->getRowCount()) return $this->lng->txt("matrix_question_radio_button_not_checked");
1045 break;
1046 case 1:
1047 $counter = 0;
1048 foreach ($post_data as $key => $value)
1049 {
1050 if (preg_match("/matrix_" . $this->getId() . "_(\d+)/", $key, $matches))
1051 {
1052 if (array_key_exists('matrix_other_' . $this->getId() . "_" . $matches[1], $post_data) && strlen($post_data['matrix_other_' . $this->getId() . "_" . $matches[1]]) == 0)
1053 {
1054 return $this->lng->txt("question_mr_no_other_answer");
1055 }
1056 $counter++;
1057 if ((!is_array($value)) || (count($value) < 1))
1058 {
1059 return $this->lng->txt("matrix_question_checkbox_not_checked");
1060 }
1061 }
1062 }
1063 if ($counter != $this->getRowCount()) return $this->lng->txt("matrix_question_checkbox_not_checked");
1064 break;
1065 }
1066 return "";
1067 }
1068
1074 public function saveRandomData($active_id)
1075 {
1076 global $ilDB;
1077 $columncount = $this->getColumnCount();
1078 for ($row = 0; $row < $this->getRowCount(); $row++)
1079 {
1080 if ($this->getSubType() == 1)
1081 {
1082 // multiple responses
1083 for ($i = 0; $i < $columncount; $i++)
1084 {
1085 if (rand(0,1))
1086 {
1087 $next_id = $ilDB->nextId('svy_answer');
1088 $affectedRows = $ilDB->manipulateF("INSERT INTO svy_answer (answer_id, question_fi, active_fi, value, textanswer, rowvalue, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s)",
1089 array('integer','integer','integer','float','text','integer','integer'),
1090 array($next_id, $this->getId(), $active_id, $i, NULL, $row, time())
1091 );
1092 }
1093 }
1094 }
1095 else
1096 {
1097 // single responses
1098 $category = rand(0, $columncount-1);
1099 $next_id = $ilDB->nextId('svy_answer');
1100 $affectedRows = $ilDB->manipulateF("INSERT INTO svy_answer (answer_id, question_fi, active_fi, value, textanswer, rowvalue, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s)",
1101 array('integer','integer','integer','float','text','integer','integer'),
1102 array($next_id, $this->getId(), $active_id, $category, NULL, $row, time())
1103 );
1104 }
1105 }
1106 }
1107
1108 function saveUserInput($post_data, $active_id, $a_return = false)
1109 {
1110 global $ilDB;
1111
1112 $answer_data = array();
1113
1114 // gather data
1115 switch ($this->getSubtype())
1116 {
1117 case 0:
1118 foreach ($post_data as $key => $value)
1119 {
1120 if (preg_match("/matrix_" . $this->getId() . "_(\d+)/", $key, $matches))
1121 {
1122 if(strlen($value))
1123 {
1124 $other_value = (array_key_exists('matrix_other_' . $this->getId() . '_' . $matches[1], $post_data))
1125 ? ($post_data['matrix_other_' . $this->getId() . '_' . $matches[1]])
1126 : null;
1127 $answer_data[] = array("value"=>$value,
1128 "textanswer"=>$other_value,
1129 "rowvalue"=>$matches[1]);
1130 }
1131 }
1132 }
1133 break;
1134
1135 case 1:
1136 foreach ($post_data as $key => $value)
1137 {
1138 if (preg_match("/matrix_" . $this->getId() . "_(\d+)/", $key, $matches))
1139 {
1140 $other_value = (array_key_exists('matrix_other_' . $this->getId() . '_' . $matches[1], $post_data))
1141 ? ($post_data['matrix_other_' . $this->getId() . '_' . $matches[1]])
1142 : null;
1143 foreach ($value as $checked)
1144 {
1145 $answer_data[] = array("value"=>$checked,
1146 "textanswer"=>$other_value,
1147 "rowvalue"=>$matches[1]);
1148 }
1149 }
1150 }
1151 break;
1152 }
1153
1154 if ($a_return)
1155 {
1156 return $answer_data;
1157 }
1158
1159 // #16387 - only if any input
1160 if(sizeof($answer_data))
1161 {
1162 // save data
1163 foreach ($answer_data as $item)
1164 {
1165 $next_id = $ilDB->nextId('svy_answer');
1166 #20216
1167 $fields = array();
1168 $fields['answer_id'] = array("integer", $next_id);
1169 $fields['question_fi'] = array("integer", $this->getId());
1170 $fields['active_fi'] = array("integer", $active_id);
1171 $fields['value'] = array("float", $item['value']);
1172 $fields['textanswer'] = array("clob", $item['textanswer']);
1173 $fields['rowvalue'] = array("integer", $item['rowvalue']);
1174 $fields['tstamp'] = array("integer", time());
1175
1176 $affectedRows = $ilDB->insert("svy_answer", $fields);
1177
1178 }
1179 }
1180 }
1181
1188 function deleteAdditionalTableData($question_id)
1189 {
1190 parent::deleteAdditionalTableData($question_id);
1191
1192 global $ilDB;
1193 $affectedRows = $ilDB->manipulateF("DELETE FROM svy_qst_matrixrows WHERE question_fi = %s",
1194 array('integer'),
1195 array($question_id)
1196 );
1197 }
1198
1206 function getNrOfUsersAnswered($survey_id, $finished_ids = null, $rowindex = null)
1207 {
1208 global $ilDB;
1209
1210 $sql = "SELECT svy_answer.active_fi, svy_answer.question_fi".
1211 " FROM svy_answer".
1212 " JOIN svy_finished ON (svy_finished.finished_id = svy_answer.active_fi)".
1213 " WHERE svy_answer.question_fi = ".$ilDB->quote($this->getId(), "integer").
1214 " AND svy_finished.survey_fi = ".$ilDB->quote($survey_id, "integer");
1215 if($finished_ids)
1216 {
1217 $sql .= " AND ".$ilDB->in("svy_finished.finished_id", $finished_ids, "", "integer");
1218 }
1219 if($rowindex)
1220 {
1221 $sql .= " AND rowvalue = ".$ilDB->quote($rowindex, "integer");
1222 }
1223
1224 $result = $ilDB->query($sql);
1225 $found = array();
1226 while ($row = $ilDB->fetchAssoc($result))
1227 {
1228 $found[$row["active_fi"].$row["question_fi"]] = 1;
1229 }
1230 return count($found);
1231 }
1232
1241 function &getCumulatedResultsForRow($rowindex, $survey_id, $nr_of_users, $finished_ids)
1242 {
1243 global $ilDB;
1244
1245 $question_id = $this->getId();
1246
1247 $result_array = array();
1248 $cumulated = array();
1249
1250 $sql = "SELECT svy_answer.* FROM svy_answer".
1251 " JOIN svy_finished ON (svy_finished.finished_id = svy_answer.active_fi)".
1252 " WHERE svy_answer.question_fi = ".$ilDB->quote($question_id, "integer").
1253 " AND svy_answer.rowvalue = ".$ilDB->quote($rowindex, "integer").
1254 " AND svy_finished.survey_fi = ".$ilDB->quote($survey_id, "integer");
1255 if($finished_ids)
1256 {
1257 $sql .= " AND ".$ilDB->in("svy_finished.finished_id", $finished_ids, "", "integer");
1258 }
1259 $result = $ilDB->query($sql);
1260
1261 switch ($this->getSubtype())
1262 {
1263 case 0:
1264 case 1:
1265 while ($row = $ilDB->fetchAssoc($result))
1266 {
1267 $cumulated[$row["value"]]++;
1268
1269 // add text value to result array
1270 if ($row["textanswer"])
1271 {
1272 $result_array["textanswers"][$row["value"]][] = $row["textanswer"];
1273 }
1274 }
1275 // sort textanswers by value
1276 if (is_array($result_array["textanswers"]))
1277 {
1278 ksort($result_array["textanswers"], SORT_NUMERIC);
1279 }
1280 asort($cumulated, SORT_NUMERIC);
1281 end($cumulated);
1282 break;
1283 }
1284 $numrows = $result->numRows();
1285 $result_array["USERS_ANSWERED"] = $this->getNrOfUsersAnswered($survey_id, $finished_ids, $rowindex);
1286 $result_array["USERS_SKIPPED"] = $nr_of_users - $result_array["USERS_ANSWERED"];
1287
1288 if(sizeof($cumulated))
1289 {
1290 $prefix = "";
1291 if (strcmp(key($cumulated), "") != 0)
1292 {
1293 $prefix = (key($cumulated)+1) . " - ";
1294 }
1295 $cat = $this->getColumnForScale(key($cumulated)+1);
1296 $result_array["MODE"] = $prefix . $cat->title;
1297 $result_array["MODE_VALUE"] = key($cumulated)+1;
1298 $result_array["MODE_NR_OF_SELECTIONS"] = $cumulated[key($cumulated)];
1299 }
1300 for ($key = 0; $key < $this->getColumnCount(); $key++)
1301 {
1302 $cat = $this->getColumn($key);
1303 $scale = $cat->scale-1;
1304
1305 $percentage = 0;
1306 if ($numrows > 0)
1307 {
1308 $percentage = (float)((int)$cumulated[$scale]/$numrows);
1309 }
1310
1311 $result_array["variables"][$key] = array("title" => $cat->title, "selected" => (int)$cumulated[$scale], "percentage" => $percentage);
1312 }
1313 ksort($cumulated, SORT_NUMERIC);
1314 $median = array();
1315 $total = 0;
1316 foreach ($cumulated as $value => $key)
1317 {
1318 $total += $key;
1319 for ($i = 0; $i < $key; $i++)
1320 {
1321 array_push($median, $value+1);
1322 }
1323 }
1324 if ($total > 0)
1325 {
1326 if (($total % 2) == 0)
1327 {
1328 $median_value = 0.5 * ($median[($total/2)-1] + $median[($total/2)]);
1329 if (round($median_value) != $median_value)
1330 {
1331 $cat = $this->getColumnForScale((int)floor($median_value));
1332 $cat2 = $this->getColumnForScale((int)ceil($median_value));
1333 $median_value = $median_value . "<br />" . "(" . $this->lng->txt("median_between") . " " . (floor($median_value)) . "-" . $cat->title . " " . $this->lng->txt("and") . " " . (ceil($median_value)) . "-" . $cat2->title . ")";
1334 }
1335 }
1336 else
1337 {
1338 $median_value = $median[(($total+1)/2)-1];
1339 }
1340 }
1341 else
1342 {
1343 $median_value = "";
1344 }
1345 $result_array["ARITHMETIC_MEAN"] = "";
1346 $result_array["MEDIAN"] = $median_value;
1347 $result_array["QUESTION_TYPE"] = "SurveyMatrixQuestion";
1348 $result_array["ROW"] = $this->getRow($rowindex)->title;
1349 return $result_array;
1350 }
1351
1359 function &getCumulatedResults($survey_id, $nr_of_users, $finished_ids)
1360 {
1361 global $ilDB;
1362
1363 $question_id = $this->getId();
1364
1365 $result_array = array();
1366 $cumulated = array();
1367
1368 $sql = "SELECT svy_answer.* FROM svy_answer".
1369 " JOIN svy_finished ON (svy_finished.finished_id = svy_answer.active_fi)".
1370 " WHERE svy_answer.question_fi = ".$ilDB->quote($question_id, "integer").
1371 " AND svy_finished.survey_fi = ".$ilDB->quote($survey_id, "integer");
1372 if($finished_ids)
1373 {
1374 $sql .= " AND ".$ilDB->in("svy_finished.finished_id", $finished_ids, "", "integer");
1375 }
1376 $result = $ilDB->query($sql);
1377
1378 switch ($this->getSubtype())
1379 {
1380 case 0:
1381 case 1:
1382 while ($row = $ilDB->fetchAssoc($result))
1383 {
1384 $cumulated[$row["value"]]++;
1385 }
1386 asort($cumulated, SORT_NUMERIC);
1387 end($cumulated);
1388 break;
1389 }
1390 $numrows = $result->numRows();
1391 $result_array["USERS_ANSWERED"] = $this->getNrOfUsersAnswered($survey_id, $finished_ids);
1392 $result_array["USERS_SKIPPED"] = $nr_of_users - $this->getNrOfUsersAnswered($survey_id, $finished_ids);
1393
1394 if(sizeof($cumulated))
1395 {
1396 $prefix = "";
1397 if (strcmp(key($cumulated), "") != 0)
1398 {
1399 $prefix = (key($cumulated)+1) . " - ";
1400 }
1401 $cat = $this->getColumnForScale(key($cumulated)+1);
1402 $result_array["MODE"] = $prefix . $cat->title;
1403 $result_array["MODE_VALUE"] = key($cumulated)+1;
1404 $result_array["MODE_NR_OF_SELECTIONS"] = $cumulated[key($cumulated)];
1405 }
1406 for ($key = 0; $key < $this->getColumnCount(); $key++)
1407 {
1408 $cat = $this->getColumn($key);
1409 $scale = $cat->scale-1;
1410
1411 $percentage = 0;
1412 if ($numrows > 0)
1413 {
1414 $percentage = (float)((int)$cumulated[$scale]/$numrows);
1415 }
1416
1417 $result_array["variables"][$key] = array("title" => $cat->title, "selected" => (int)$cumulated[$scale], "percentage" => $percentage);
1418 }
1419 ksort($cumulated, SORT_NUMERIC);
1420 $median = array();
1421 $total = 0;
1422 foreach ($cumulated as $value => $key)
1423 {
1424 $total += $key;
1425 for ($i = 0; $i < $key; $i++)
1426 {
1427 array_push($median, $value+1);
1428 }
1429 }
1430 if ($total > 0)
1431 {
1432 if (($total % 2) == 0)
1433 {
1434 $median_value = 0.5 * ($median[($total/2)-1] + $median[($total/2)]);
1435 if (round($median_value) != $median_value)
1436 {
1437 $cat = $this->getColumnForScale((int)floor($median_value));
1438 $cat2 = $this->getColumnForScale((int)ceil($median_value));
1439 $median_value = $median_value . "<br />" . "(" . $this->lng->txt("median_between") . " " . (floor($median_value)) . "-" . $cat->title . " " . $this->lng->txt("and") . " " . (ceil($median_value)) . "-" . $cat2->title . ")";
1440 }
1441 }
1442 else
1443 {
1444 $median_value = $median[(($total+1)/2)-1];
1445 }
1446 }
1447 else
1448 {
1449 $median_value = "";
1450 }
1451 $result_array["ARITHMETIC_MEAN"] = "";
1452 $result_array["MEDIAN"] = $median_value;
1453 $result_array["QUESTION_TYPE"] = "SurveyMatrixQuestion";
1454
1455 $cumulated_results = array();
1456 $cumulated_results["TOTAL"] = $result_array;
1457 for ($i = 0; $i < $this->getRowCount(); $i++)
1458 {
1459 $rowresult =& $this->getCumulatedResultsForRow($i, $survey_id, $nr_of_users, $finished_ids);
1460 $cumulated_results[$i] = $rowresult;
1461 }
1462 return $cumulated_results;
1463 }
1464
1476 function setExportCumulatedXLS(&$worksheet, &$format_title, &$format_bold, &$eval_data, $row, $export_label)
1477 {
1478 include_once ("./Services/Excel/classes/class.ilExcelUtils.php");
1479 $column = 0;
1480 switch ($export_label)
1481 {
1482 case 'label_only':
1483 $worksheet->writeString($row, $column, ilExcelUtils::_convert_text($this->label));
1484 break;
1485 case 'title_only':
1486 $worksheet->writeString($row, $column, ilExcelUtils::_convert_text($this->getTitle()));
1487 break;
1488 default:
1489 $worksheet->writeString($row, $column, ilExcelUtils::_convert_text($this->getTitle()));
1490 $column++;
1491 $worksheet->writeString($row, $column, ilExcelUtils::_convert_text($this->label));
1492 break;
1493 }
1494 $column++;
1495 $worksheet->writeString($row, $column, ilExcelUtils::_convert_text(strip_tags($this->getQuestiontext())));
1496 $column++;
1497 $worksheet->writeString($row, $column, ilExcelUtils::_convert_text($this->lng->txt($eval_data["TOTAL"]["QUESTION_TYPE"])));
1498 $column++;
1499 $worksheet->write($row, $column, $eval_data["TOTAL"]["USERS_ANSWERED"]);
1500 $column++;
1501 $worksheet->write($row, $column, $eval_data["TOTAL"]["USERS_SKIPPED"]);
1502 $column++;
1503 $worksheet->write($row, $column, ilExcelUtils::_convert_text($eval_data["TOTAL"]["MODE_VALUE"]));
1504 $column++;
1505 $worksheet->write($row, $column, ilExcelUtils::_convert_text($eval_data["TOTAL"]["MODE"]));
1506 $column++;
1507 $worksheet->write($row, $column, $eval_data["TOTAL"]["MODE_NR_OF_SELECTIONS"]);
1508 $column++;
1509 $worksheet->write($row, $column, ilExcelUtils::_convert_text(str_replace("<br />", " ", $eval_data["TOTAL"]["MEDIAN"])));
1510 $column++;
1511 $worksheet->write($row, $column, $eval_data["TOTAL"]["ARITHMETIC_MEAN"]);
1512 $row++;
1513 $add = 0;
1514 switch ($export_label)
1515 {
1516 case 'label_only':
1517 case 'title_only':
1518 break;
1519 default:
1520 $add = 1;
1521 break;
1522 }
1523 foreach ($eval_data as $evalkey => $evalvalue)
1524 {
1525 if (is_numeric($evalkey))
1526 {
1527 $worksheet->writeString($row, 1+$add, ilExcelUtils::_convert_text($evalvalue["ROW"]));
1528 $worksheet->write($row, 3+$add, $evalvalue["USERS_ANSWERED"]);
1529 $worksheet->write($row, 4+$add, $evalvalue["USERS_SKIPPED"]);
1530 $worksheet->write($row, 5+$add, ilExcelUtils::_convert_text($evalvalue["MODE_VALUE"]));
1531 $worksheet->write($row, 6+$add, ilExcelUtils::_convert_text($evalvalue["MODE"]));
1532 $worksheet->write($row, 7+$add, $evalvalue["MODE_NR_OF_SELECTIONS"]);
1533 $worksheet->write($row, 8+$add, ilExcelUtils::_convert_text(str_replace("<br />", " ", $evalvalue["MEDIAN"])));
1534 $worksheet->write($row, 9+$add, $evalvalue["ARITHMETIC_MEAN"]);
1535 $row++;
1536 }
1537 }
1538 return $row;
1539 }
1540
1552 function &setExportCumulatedCVS(&$eval_data, $export_label)
1553 {
1554 $result = array();
1555 foreach ($eval_data as $evalkey => $evalvalue)
1556 {
1557 $csvrow = array();
1558 if (is_numeric($evalkey))
1559 {
1560 array_push($csvrow, "");
1561 array_push($csvrow, $evalvalue["ROW"]);
1562 array_push($csvrow, "");
1563 }
1564 else
1565 {
1566 switch ($export_label)
1567 {
1568 case 'label_only':
1569 array_push($csvrow, $this->label);
1570 break;
1571 case 'title_only':
1572 array_push($csvrow, $this->getTitle());
1573 break;
1574 default:
1575 array_push($csvrow, $this->getTitle());
1576 array_push($csvrow, $this->label);
1577 break;
1578 }
1579 array_push($csvrow, strip_tags($this->getQuestiontext()));
1580 array_push($csvrow, $this->lng->txt($evalvalue["QUESTION_TYPE"]));
1581 }
1582 array_push($csvrow, $evalvalue["USERS_ANSWERED"]);
1583 array_push($csvrow, $evalvalue["USERS_SKIPPED"]);
1584 array_push($csvrow, $evalvalue["MODE"]);
1585 array_push($csvrow, $evalvalue["MODE_NR_OF_SELECTIONS"]);
1586 array_push($csvrow, str_replace("<br />", " ", $evalvalue["MEDIAN"])); // #17214
1587 array_push($csvrow, $evalvalue["ARITHMETIC_MEAN"]);
1588 array_push($result, $csvrow);
1589 }
1590 return $result;
1591 }
1592
1602 function setExportDetailsXLS(&$workbook, &$format_title, &$format_bold, &$eval_data, $export_label)
1603 {
1604 include_once ("./Services/Excel/classes/class.ilExcelUtils.php");
1605 $worksheet =& $workbook->addWorksheet();
1606 $rowcounter = 0;
1607 switch ($export_label)
1608 {
1609 case 'label_only':
1610 $worksheet->writeString(0, 0, ilExcelUtils::_convert_text($this->lng->txt("label")), $format_bold);
1611 $worksheet->writeString(0, 1, ilExcelUtils::_convert_text($this->label));
1612 break;
1613 case 'title_only':
1614 $worksheet->writeString(0, 0, ilExcelUtils::_convert_text($this->lng->txt("title")), $format_bold);
1615 $worksheet->writeString(0, 1, ilExcelUtils::_convert_text($this->getTitle()));
1616 break;
1617 default:
1618 $worksheet->writeString(0, 0, ilExcelUtils::_convert_text($this->lng->txt("title")), $format_bold);
1619 $worksheet->writeString(0, 1, ilExcelUtils::_convert_text($this->getTitle()));
1620 $rowcounter++;
1621 $worksheet->writeString($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("label")), $format_bold);
1622 $worksheet->writeString($rowcounter, 1, ilExcelUtils::_convert_text($this->label));
1623 break;
1624 }
1625 $rowcounter++;
1626 $worksheet->writeString($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("question")), $format_bold);
1627 $worksheet->writeString($rowcounter, 1, ilExcelUtils::_convert_text($this->getQuestiontext()));
1628 $rowcounter++;
1629 $worksheet->writeString($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("question_type")), $format_bold);
1630 $worksheet->writeString($rowcounter, 1, ilExcelUtils::_convert_text($this->lng->txt($this->getQuestionType())));
1631 $rowcounter++;
1632 $worksheet->writeString($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("users_answered")), $format_bold);
1633 $worksheet->write($rowcounter, 1, $eval_data["TOTAL"]["USERS_ANSWERED"]);
1634 $rowcounter++;
1635 $worksheet->writeString($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("users_skipped")), $format_bold);
1636 $worksheet->write($rowcounter, 1, $eval_data["TOTAL"]["USERS_SKIPPED"]);
1637 $rowcounter++;
1638
1639 preg_match("/(.*?)\s+-\s+(.*)/", $eval_data["TOTAL"]["MODE"], $matches);
1640 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("mode")), $format_bold);
1641 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text($matches[1]));
1642 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("mode_text")), $format_bold);
1643 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text($matches[2]));
1644 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("mode_nr_of_selections")), $format_bold);
1645 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text($eval_data["TOTAL"]["MODE_NR_OF_SELECTIONS"]));
1646 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("median")), $format_bold);
1647 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text(str_replace("<br />", " ", $eval_data["TOTAL"]["MEDIAN"])));
1648 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("categories")), $format_bold);
1649 $worksheet->write($rowcounter, 1, ilExcelUtils::_convert_text($this->lng->txt("title")), $format_title);
1650 $worksheet->write($rowcounter, 2, ilExcelUtils::_convert_text($this->lng->txt("value")), $format_title);
1651 $worksheet->write($rowcounter, 3, ilExcelUtils::_convert_text($this->lng->txt("category_nr_selected")), $format_title);
1652 $worksheet->write($rowcounter++, 4, ilExcelUtils::_convert_text($this->lng->txt("svy_fraction_of_selections")), $format_title);
1653
1654 foreach ($eval_data["TOTAL"]["variables"] as $key => $value)
1655 {
1656 $worksheet->write($rowcounter, 1, ilExcelUtils::_convert_text($value["title"]));
1657 $worksheet->write($rowcounter, 2, $key+1);
1658 $worksheet->write($rowcounter, 3, ilExcelUtils::_convert_text($value["selected"]));
1659 $worksheet->write($rowcounter++, 4, ilExcelUtils::_convert_text($value["percentage"]), $format_percent);
1660 }
1661
1662 foreach ($eval_data as $evalkey => $evalvalue)
1663 {
1664 if (is_numeric($evalkey))
1665 {
1666 $worksheet->writeString($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("row")), $format_bold);
1667 $worksheet->writeString($rowcounter, 1, ilExcelUtils::_convert_text($evalvalue["ROW"]));
1668 $worksheet->writeString($rowcounter + 1, 0, ilExcelUtils::_convert_text($this->lng->txt("users_answered")), $format_bold);
1669 $worksheet->write($rowcounter + 1, 1, $evalvalue["USERS_ANSWERED"]);
1670 $worksheet->writeString($rowcounter + 2, 0, ilExcelUtils::_convert_text($this->lng->txt("users_skipped")), $format_bold);
1671 $worksheet->write($rowcounter + 2, 1, $evalvalue["USERS_SKIPPED"]);
1672 $rowcounter = $rowcounter + 3;
1673
1674 preg_match("/(.*?)\s+-\s+(.*)/", $evalvalue["MODE"], $matches);
1675 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("mode")), $format_bold);
1676 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text($matches[1]));
1677 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("mode_text")), $format_bold);
1678 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text($matches[2]));
1679 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("mode_nr_of_selections")), $format_bold);
1680 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text($evalvalue["MODE_NR_OF_SELECTIONS"]));
1681 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("median")), $format_bold);
1682 $worksheet->write($rowcounter++, 1, ilExcelUtils::_convert_text(str_replace("<br />", " ", $evalvalue["MEDIAN"])));
1683 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("categories")), $format_bold);
1684 $worksheet->write($rowcounter, 1, ilExcelUtils::_convert_text($this->lng->txt("title")), $format_title);
1685 $worksheet->write($rowcounter, 2, ilExcelUtils::_convert_text($this->lng->txt("value")), $format_title);
1686 $worksheet->write($rowcounter, 3, ilExcelUtils::_convert_text($this->lng->txt("category_nr_selected")), $format_title);
1687 $worksheet->write($rowcounter++, 4, ilExcelUtils::_convert_text($this->lng->txt("svy_fraction_of_selections")), $format_title);
1688
1689 foreach ($evalvalue["variables"] as $key => $value)
1690 {
1691 $worksheet->write($rowcounter, 1, ilExcelUtils::_convert_text($value["title"]));
1692 $worksheet->write($rowcounter, 2, $key+1);
1693 $worksheet->write($rowcounter, 3, ilExcelUtils::_convert_text($value["selected"]));
1694 $worksheet->write($rowcounter++, 4, ilExcelUtils::_convert_text($value["percentage"]), $format_percent);
1695 }
1696
1697 // add text answers to detailed results
1698 if (is_array($evalvalue["textanswers"]))
1699 {
1700 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("freetext_answers")), $format_bold);
1701 $worksheet->write($rowcounter, 1, ilExcelUtils::_convert_text($this->lng->txt("title")), $format_title);
1702 $worksheet->write($rowcounter++, 2, ilExcelUtils::_convert_text($this->lng->txt("answer")), $format_title);
1703
1704 foreach ($evalvalue["textanswers"] as $key => $answers)
1705 {
1706 $title = $evalvalue["variables"][$key]["title"];
1707 foreach ($answers as $answer)
1708 {
1709 $worksheet->write($rowcounter, 1, ilExcelUtils::_convert_text($title));
1710 $worksheet->write($rowcounter++, 2, ilExcelUtils::_convert_text($answer));
1711 }
1712 }
1713 }
1714 }
1715 }
1716 // out compressed 2D-Matrix
1717 $format_center =& $workbook->addFormat();
1718 $format_center->setColor('black');
1719 $format_center->setAlign('center');
1720
1721 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($this->lng->txt("overview")), $format_bold);
1722 // title row with variables
1723 $rowcounter++;
1724 $counter = 0;
1725 $worksheet->write($rowcounter, $counter, "", $format_title);
1726 foreach ($eval_data["TOTAL"]["variables"] as $variable)
1727 {
1728 $worksheet->write($rowcounter, 1+$counter, ilExcelUtils::_convert_text($variable["title"]), $format_title);
1729 $counter++;
1730 }
1731 $rowcounter++;
1732 // rows with variable values
1733 foreach ($eval_data as $index => $data)
1734 {
1735 if (is_numeric($index))
1736 {
1737 $worksheet->write($rowcounter, 0, ilExcelUtils::_convert_text($data["ROW"]), $format_title);
1738 $counter = 1;
1739 foreach ($data["variables"] as $vardata)
1740 {
1741 $worksheet->write($rowcounter, $counter, $vardata["selected"], $format_center);
1742 $counter++;
1743 }
1744 $rowcounter++;
1745 }
1746 }
1747 }
1748
1755 function addUserSpecificResultsExportTitles(&$a_array, $a_use_label = false, $a_substitute = true)
1756 {
1757 parent::addUserSpecificResultsExportTitles($a_array, $a_use_label, $a_substitute);
1758
1759 for ($i = 0; $i < $this->getRowCount(); $i++)
1760 {
1761 // create row title according label, add 'other column'
1762 $row = $this->getRow($i);
1763
1764 if(!$a_use_label)
1765 {
1766 $title = $row->title;
1767 }
1768 else
1769 {
1770 if($a_substitute)
1771 {
1772 $title = $row->label ? $row->label : $row->title;
1773 }
1774 else
1775 {
1776 $title = $row->label;
1777 }
1778 }
1779 array_push($a_array, $title);
1780
1781 if ($row->other)
1782 {
1783 if(!$a_use_label || $a_substitute)
1784 {
1785 array_push($a_array, $title. ' - '. $this->lng->txt('other'));
1786 }
1787 else
1788 {
1789 array_push($a_array, "");
1790 }
1791 }
1792
1793 switch ($this->getSubtype())
1794 {
1795 case 0:
1796 break;
1797 case 1:
1798 for ($index = 0; $index < $this->getColumnCount(); $index++)
1799 {
1800 $col = $this->getColumn($index);
1801 if(!$a_use_label || $a_substitute)
1802 {
1803 array_push($a_array, ($index+1) . " - " . $col->title);
1804 }
1805 else
1806 {
1807 array_push($a_array, "");
1808 }
1809 }
1810 break;
1811 }
1812 }
1813 }
1814
1822 function addUserSpecificResultsData(&$a_array, &$resultset)
1823 {
1824 if (count($resultset["answers"][$this->getId()]))
1825 {
1826 array_push($a_array, "");
1827 switch ($this->getSubtype())
1828 {
1829 case 0:
1830 for ($i = 0; $i < $this->getRowCount(); $i++)
1831 {
1832 // add textanswer column for single choice mode
1833 $row = $this->getRow($i);
1834 $textanswer = "";
1835 $checked = FALSE;
1836 foreach ($resultset["answers"][$this->getId()] as $result)
1837 {
1838 if ($result["rowvalue"] == $i)
1839 {
1840 $checked = TRUE;
1841 array_push($a_array, $result["value"] + 1);
1842
1843 if ($result["textanswer"])
1844 {
1845 $textanswer = $result["textanswer"];
1846 }
1847 }
1848 }
1849 if (!$checked)
1850 {
1851 array_push($a_array, $this->getSkippedValue());
1852 }
1853 if ($row->other)
1854 {
1855 array_push($a_array, $textanswer);
1856 }
1857 }
1858 break;
1859 case 1:
1860 for ($i = 0; $i < $this->getRowCount(); $i++)
1861 {
1862 // add textanswer column for multiple choice mode
1863 $row = $this->getRow($i);
1864 $textanswer = "";
1865 $checked = FALSE;
1866 $checked_values = array();
1867 foreach ($resultset["answers"][$this->getId()] as $result)
1868 {
1869 if ($result["rowvalue"] == $i)
1870 {
1871 $checked = TRUE;
1872 array_push($checked_values, $result["value"] + 1);
1873
1874 if ($result["textanswer"])
1875 {
1876 $textanswer = $result["textanswer"];
1877 }
1878 }
1879 }
1880 if (!$checked)
1881 {
1882 array_push($a_array, $this->getSkippedValue());
1883 }
1884 else
1885 {
1886 array_push($a_array, "");
1887 }
1888 if ($row->other)
1889 {
1890 array_push($a_array, $textanswer);
1891 }
1892 for ($index = 0; $index < $this->getColumnCount(); $index++)
1893 {
1894 if (!$checked)
1895 {
1896 array_push($a_array, "");
1897 }
1898 else
1899 {
1900 $cat = $this->getColumn($index);
1901 $scale = $cat->scale;
1902 if (in_array($scale, $checked_values))
1903 {
1904 array_push($a_array, $scale);
1905 }
1906 else
1907 {
1908 array_push($a_array, 0);
1909 }
1910 }
1911 }
1912 }
1913 break;
1914 }
1915 }
1916 else
1917 {
1918 array_push($a_array, $this->getSkippedValue());
1919 for ($i = 0; $i < $this->getRowCount(); $i++)
1920 {
1921 array_push($a_array, "");
1922
1923 // add empty "other" column if not answered
1924 $row = $this->getRow($i);
1925 if ($row->other)
1926 {
1927 array_push($a_array, "");
1928 }
1929
1930 switch ($this->getSubtype())
1931 {
1932 case 0:
1933 break;
1934 case 1:
1935 for ($index = 0; $index < $this->getColumnCount(); $index++)
1936 {
1937 array_push($a_array, "");
1938 }
1939 break;
1940 }
1941 }
1942 }
1943 }
1944
1952 function &getUserAnswers($survey_id, $finished_ids)
1953 {
1954 global $ilDB;
1955
1956 $answers = array();
1957
1958 $sql = "SELECT svy_answer.* FROM svy_answer".
1959 " JOIN svy_finished ON (svy_finished.finished_id = svy_answer.active_fi)".
1960 " WHERE svy_answer.question_fi = ".$ilDB->quote($this->getId(), "integer").
1961 " AND svy_finished.survey_fi = ".$ilDB->quote($survey_id, "integer");
1962 if($finished_ids)
1963 {
1964 $sql .= " AND ".$ilDB->in("svy_finished.finished_id", $finished_ids, "", "integer");
1965 }
1966 $sql .= " ORDER BY rowvalue, value";
1967 $result = $ilDB->query($sql);
1968
1969 while ($row = $ilDB->fetchAssoc($result))
1970 {
1971 $column = $this->getColumnForScale($row["value"]+1);
1972 if (!is_array($answers[$row["active_fi"]])) $answers[$row["active_fi"]] = array();
1973 $rowobj = $this->getRow($row["rowvalue"]);
1974 array_push($answers[$row["active_fi"]], $rowobj->title . (($rowobj->other) ? (" " . $row["textanswer"]) : "") . ": " . ($row["value"] + 1) . " - " . $column->title);
1975 }
1976 foreach ($answers as $key => $value)
1977 {
1978 $answers[$key] = implode("<br />", $value);
1979 }
1980 return $answers;
1981 }
1982
1989 function getSubtype()
1990 {
1991 return $this->subtype;
1992 }
1993
2000 function setSubtype($a_subtype = 0)
2001 {
2002 switch ($a_subtype)
2003 {
2004 case 1:
2005 case 2:
2006 case 3:
2007 case 4:
2008 case 5:
2009 case 6:
2010 $this->subtype = $a_subtype;
2011 break;
2012 case 0:
2013 default:
2014 $this->subtype = 0;
2015 break;
2016 }
2017 }
2018
2025 function setColumnSeparators($enable = 0)
2026 {
2027 switch ($enable)
2028 {
2029 case 1:
2030 $this->columnSeparators = 1;
2031 break;
2032 case 0:
2033 default:
2034 $this->columnSeparators = 0;
2035 break;
2036 }
2037 }
2038
2046 {
2047 return ($this->columnSeparators) ? 1 : 0;
2048 }
2049
2056 function setRowSeparators($enable = 0)
2057 {
2058 switch ($enable)
2059 {
2060 case 1:
2061 $this->rowSeparators = 1;
2062 break;
2063 case 0:
2064 default:
2065 $this->rowSeparators = 0;
2066 break;
2067 }
2068 }
2069
2077 {
2078 return ($this->rowSeparators) ? 1 : 0;
2079 }
2080
2087 function setNeutralColumnSeparator($enable = 0)
2088 {
2089 switch ($enable)
2090 {
2091 case 1:
2092 $this->neutralColumnSeparator = 1;
2093 break;
2094 case 0:
2095 default:
2096 $this->neutralColumnSeparator = 0;
2097 break;
2098 }
2099 }
2100
2108 {
2109 return ($this->neutralColumnSeparator) ? 1 : 0;
2110 }
2111
2121 {
2122 foreach ($a_meta as $key => $value)
2123 {
2124 switch ($value["label"])
2125 {
2126 case "column_separators":
2127 $this->setColumnSeparators($value["entry"]);
2128 break;
2129 case "row_separators":
2130 $this->setRowSeparators($value["entry"]);
2131 break;
2132 case "layout":
2133 $this->setLayout($value["entry"]);
2134 break;
2135 case "neutral_column_separator":
2136 $this->setNeutralColumnSeparator($value["entry"]);
2137 break;
2138 }
2139 }
2140 }
2141
2148 function importAdjectives($a_data)
2149 {
2150 $i = 0;
2151 foreach ($a_data as $adjective)
2152 {
2153 if (is_numeric($adjective["label"]))
2154 {
2155 $this->setBipolarAdjective($adjective["label"], $adjective["text"]);
2156 }
2157 else
2158 {
2159 $this->setBipolarAdjective($i, $adjective["text"]);
2160 }
2161 $i++;
2162 }
2163 }
2164
2171 function importMatrix($a_data)
2172 {
2173 foreach ($a_data as $row)
2174 {
2175 $this->addRow($row['title'], $row['other'], $row['label']);
2176 }
2177 }
2178
2185 function importResponses($a_data)
2186 {
2187 foreach ($a_data as $id => $data)
2188 {
2189 $column = "";
2190 foreach ($data["material"] as $material)
2191 {
2192 $column .= $material["text"];
2193 }
2194 $this->columns->addCategory($column, null, (strcmp($data["label"], "neutral") == 0) ? true : false);
2195 }
2196 }
2197
2205 {
2206 return FALSE;
2207 }
2208
2217 {
2218 return $value;
2219 }
2220
2227 public function getPreconditionSelectValue($default = "", $title, $variable)
2228 {
2229 include_once "./Services/Form/classes/class.ilSelectInputGUI.php";
2230 $step3 = new ilSelectInputGUI($title, $variable);
2232 $step3->setOptions($options);
2233 $step3->setValue($default);
2234 return $step3;
2235 }
2236
2246 function saveLayout($percent_row, $percent_columns, $percent_bipolar_adjective1 = "", $percent_bipolar_adjective2 = "", $percent_neutral)
2247 {
2248 global $ilDB;
2249
2250 $layout = array(
2251 "percent_row" => $percent_row,
2252 "percent_columns" => $percent_columns,
2253 "percent_bipolar_adjective1" => $percent_bipolar_adjective1,
2254 "percent_bipolar_adjective2" => $percent_bipolar_adjective2,
2255 "percent_neutral" => $percent_neutral
2256 );
2257 $affectedRows = $ilDB->manipulateF("UPDATE " . $this->getAdditionalTableName() . " SET layout = %s WHERE question_fi = %s",
2258 array('text', 'integer'),
2259 array(serialize($layout), $this->getId())
2260 );
2261 }
2262
2263 function getLayout()
2264 {
2265 if (!is_array($this->layout) || count($this->layout) == 0)
2266 {
2267 if ($this->hasBipolarAdjectives() && $this->hasNeutralColumn())
2268 {
2269 $this->layout = array(
2270 "percent_row" => 30,
2271 "percent_columns" => 40,
2272 "percent_bipolar_adjective1" => 10,
2273 "percent_bipolar_adjective2" => 10,
2274 "percent_neutral" => 10
2275 );
2276 }
2277 elseif ($this->hasBipolarAdjectives())
2278 {
2279 $this->layout = array(
2280 "percent_row" => 30,
2281 "percent_columns" => 50,
2282 "percent_bipolar_adjective1" => 10,
2283 "percent_bipolar_adjective2" => 10,
2284 "percent_neutral" => 0
2285 );
2286 }
2287 elseif ($this->hasNeutralColumn())
2288 {
2289 $this->layout = array(
2290 "percent_row" => 30,
2291 "percent_columns" => 50,
2292 "percent_bipolar_adjective1" => 0,
2293 "percent_bipolar_adjective2" => 0,
2294 "percent_neutral" => 20
2295 );
2296 }
2297 else
2298 {
2299 $this->layout = array(
2300 "percent_row" => 30,
2301 "percent_columns" => 70,
2302 "percent_bipolar_adjective1" => 0,
2303 "percent_bipolar_adjective2" => 0,
2304 "percent_neutral" => 0
2305 );
2306 }
2307 }
2308 return $this->layout;
2309 }
2310
2312 {
2313 if (is_array($layout))
2314 {
2315 $this->layout = $layout;
2316 }
2317 else
2318 {
2319 $this->layout = unserialize($layout);
2320 }
2321 }
2322
2329 {
2330 if ((strlen($this->getBipolarAdjective(0))) && (strlen($this->getBipolarAdjective(1))))
2331 {
2332 return TRUE;
2333 }
2334 else
2335 {
2336 return FALSE;
2337 }
2338 }
2339
2346 {
2347 for ($i = 0; $i < $this->getColumnCount(); $i++)
2348 {
2349 $column = $this->getColumn($i);
2350 if ($column->neutral && strlen($column->title)) return true;
2351 }
2352 return FALSE;
2353 }
2354
2360 function setColumnPlaceholders($a_value = 0)
2361 {
2362 $this->columnPlaceholders = ($a_value) ? 1 : 0;
2363 }
2364
2371 {
2372 return ($this->columnPlaceholders) ? 1 : 0;
2373 }
2374
2380 function setLegend($a_value = 0)
2381 {
2382 $this->legend = ($a_value) ? 1 : 0;
2383 }
2384
2390 function getLegend()
2391 {
2392 return ($this->legend) ? 1 : 0;
2393 }
2394
2395 function setSingleLineRowCaption($a_value = 0)
2396 {
2397 $this->singleLineRowCaption = ($a_value) ? 1 : 0;
2398 }
2399
2401 {
2402 return ($this->singleLineRowCaption) ? 1 : 0;
2403 }
2404
2405 function setRepeatColumnHeader($a_value = 0)
2406 {
2407 $this->repeatColumnHeader = ($a_value) ? 1 : 0;
2408 }
2409
2411 {
2412 return ($this->repeatColumnHeader) ? 1 : 0;
2413 }
2414
2415 function setColumnHeaderPosition($a_value)
2416 {
2417 $this->columnHeaderPosition = $a_value;
2418 }
2419
2421 {
2422 return ($this->columnHeaderPosition) ? $this->columnHeaderPosition : 0;
2423 }
2424
2425 function setRandomRows($a_value = 0)
2426 {
2427 $this->randomRows = ($a_value) ? 1 : 0;
2428 }
2429
2430 function getRandomRows()
2431 {
2432 return ($this->randomRows) ? 1 : 0;
2433 }
2434
2435 function setColumnOrder($a_value)
2436 {
2437 $this->columnOrder = $a_value;
2438 }
2439
2441 {
2442 return ($this->columnOrder) ? $this->columnOrder : 0;
2443 }
2444
2445 function setColumnImages($a_value = 0)
2446 {
2447 $this->columnImages = ($a_value) ? 1 : 0;
2448 }
2449
2451 {
2452 return ($this->columnImages) ? 1 : 0;
2453 }
2454
2455 function setRowImages($a_value = 0)
2456 {
2457 $this->rowImages = ($a_value) ? 1 : 0;
2458 }
2459
2460 function getRowImages()
2461 {
2462 return ($this->rowImages) ? 1 : 0;
2463 }
2464
2465 public function getRows()
2466 {
2467 return $this->rows;
2468 }
2469
2475 public function getCumulatedResultData($survey_id, $counter, $finished_ids)
2476 {
2477 $cumulated =& $this->calculateCumulatedResults($survey_id, $finished_ids);
2478 $questiontext = preg_replace("/<[^>]+?>/ims", "", $this->getQuestiontext());
2479
2480 include_once "./Services/Utilities/classes/class.ilStr.php";
2481 $maxlen = 75;
2482 if (strlen($questiontext) > $maxlen + 3)
2483 {
2484 $questiontext = ilStr::substr($questiontext, 0, $maxlen) . "...";
2485 }
2486
2487 $result = array();
2488 $row = array(
2489 'counter' => $counter,
2490 'title' => $counter.'. '.$this->getTitle(),
2491 'question' => $questiontext,
2492 'users_answered' => $cumulated['TOTAL']['USERS_ANSWERED'],
2493 'users_skipped' => $cumulated['TOTAL']['USERS_SKIPPED'],
2494 'question_type' => $this->lng->txt($cumulated['TOTAL']['QUESTION_TYPE']),
2495 'mode' => $cumulated['TOTAL']['MODE'],
2496 'mode_nr_of_selections' => $cumulated['TOTAL']['MODE_NR_OF_SELECTIONS'],
2497 'median' => $cumulated['TOTAL']['MEDIAN'],
2498 'arithmetic_mean' => $cumulated['TOTAL']['ARITHMETIC_MEAN']
2499 );
2500 array_push($result, $row);
2501 $maxlen -= 3;
2502 foreach ($cumulated as $key => $value)
2503 {
2504 if (is_numeric($key))
2505 {
2506 if (strlen($value['ROW']) > $maxlen + 3)
2507 {
2508 $value['ROW'] = ilStr::substr($value['ROW'], 0, $maxlen) . "...";
2509 }
2510
2511 $row = array(
2512 'title' => '',
2513 'question' => ($key+1) . ". " . $value['ROW'],
2514 'users_answered' => $value['USERS_ANSWERED'],
2515 'users_skipped' => $value['USERS_SKIPPED'],
2516 'question_type' => '',
2517 'mode' => $value["MODE"],
2518 'mode_nr_of_selections' => $value["MODE_NR_OF_SELECTIONS"],
2519 'median' => $value["MEDIAN"],
2520 'arithmetic_mean' => $value["ARITHMETIC_MEAN"]
2521 );
2522 array_push($result, $row);
2523 }
2524 }
2525 return $result;
2526 }
2527}
2528?>
$result
$_SESSION["AccountId"]
Class SurveyCategories.
The SurveyMatrixQuestion class defines and encapsulates basic methods and attributes for matrix quest...
& getUserAnswers($survey_id, $finished_ids)
Returns an array containing all answers to this question in a given survey.
& getCumulatedResults($survey_id, $nr_of_users, $finished_ids)
Returns the cumulated results for the question.
hasNeutralColumn()
Returns TRUE if a neutral column exists.
addRow($a_text, $a_other, $a_label)
Adds a row to the question.
SurveyMatrixQuestion( $title="", $description="", $author="", $questiontext="", $owner=-1)
SurveyMatrixQuestion constructor The constructor takes possible arguments an creates an instance of t...
addStandardNumbers($lower_limit, $upper_limit)
Adds standard numbers as columns.
& getCumulatedResultsForRow($rowindex, $survey_id, $nr_of_users, $finished_ids)
Returns the cumulated results for a given row.
setSubtype($a_subtype=0)
Sets the subtype of the matrix question.
getAdditionalTableName()
Returns the name of the additional question data table in the database.
setRowSeparators($enable=0)
Enables/Disables separators for the matrix rows.
setBipolarAdjective($a_index, $a_value)
Sets one of the bipolar adjectives.
setExportCumulatedXLS(&$worksheet, &$format_title, &$format_bold, &$eval_data, $row, $export_label)
Creates the Excel output for the cumulated results of this question.
importMatrix($a_data)
Import matrix rows from the question import file.
removeRow($index)
Removes a row.
saveToDb($original_id=NULL, $withanswers=true)
Saves a SurveyMatrixQuestion object to a database.
importAdjectives($a_data)
Import bipolar adjectives from the question import file.
saveRandomData($active_id)
Saves random answers for a given active user in the database.
saveLayout($percent_row, $percent_columns, $percent_bipolar_adjective1="", $percent_bipolar_adjective2="", $percent_neutral)
Saves the layout of a matrix question.
getColumnIndex($name)
Returns the index of a column with a given name.
removeRows($array)
Removes rows from the question.
flushRows()
Empties the row list.
getBipolarAdjective($a_index)
Returns one of the bipolar adjectives.
saveUserInput($post_data, $active_id, $a_return=false)
removeColumnWithName($name)
Removes a column from the list of columns.
setColumnSeparators($enable=0)
Enables/Disables separators for the matrix columns.
getSubtype()
Returns the subtype of the matrix question.
savePhrase($title)
Saves a set of columns to a default phrase.
getNeutralColumnSeparator()
Gets the separator enable state for the neutral column.
getLegend()
Get whether the legend should be shown or not.
saveColumnToDb($columntext, $neutral=0)
Saves a column to the database.
getNrOfUsersAnswered($survey_id, $finished_ids=null, $rowindex=null)
Returns the number of users that answered the question for a given survey.
& getWorkingDataFromUserInput($post_data)
Creates the user data of the svy_answer table from the POST data.
getCumulatedResultData($survey_id, $counter, $finished_ids)
Creates a the cumulated results data for the question.
getQuestionType()
Returns the question type of the question.
getColumn($index)
Returns the name of a column for a given index.
& setExportCumulatedCVS(&$eval_data, $export_label)
Creates the CSV output for the cumulated results of this question.
flushColumns()
Empties the columns list.
usableForPrecondition()
Returns if the question is usable for preconditions.
checkUserInput($post_data, $survey_id)
Checks the input of the active user for obligatory status and entered values.
addUserSpecificResultsExportTitles(&$a_array, $a_use_label=false, $a_substitute=true)
Adds the entries for the title row of the user specific results.
setNeutralColumnSeparator($enable=0)
Enables/Disables a separator for the neutral column.
addPhrase($phrase_id)
Adds a phrase to the question.
importAdditionalMetadata($a_meta)
Import additional meta data from the question import file.
setColumnPlaceholders($a_value=0)
Set whether placeholders should be used for the column titles or not.
getColumnSeparators()
Gets the separators enable state for the matrix columns.
setLegend($a_value=0)
Set whether the legend should be shown or not.
removeColumn($index)
Removes a column from the list of columns.
toXML($a_include_header=TRUE, $obligatory_state="")
Returns an xml representation of the question.
removeColumns($array)
Removes many columns from the list of columns.
getColumnPlaceholders()
Get whether placeholders should be used for the column titles or not.
saveBipolarAdjectives($adjective1, $adjective2)
getColumnCount()
Returns the number of columns.
hasBipolarAdjectives()
Returns TRUE if bipolar adjectives exist.
getPreconditionValueOutput($value)
Returns the output for a precondition value.
loadFromDb($id)
Loads a SurveyMatrixQuestion object from the database.
getRow($a_index)
Returns a specific row.
_getQuestionDataArray($id)
Returns the question data fields from the database.
importResponses($a_data)
Import response data from the question import file.
deleteAdditionalTableData($question_id)
Deletes datasets from the additional question table in the database.
getPreconditionSelectValue($default="", $title, $variable)
Creates a form property for the precondition value.
addUserSpecificResultsData(&$a_array, &$resultset)
Adds the values for the user specific results export for a given user.
getRowCount()
Returns the number of rows in the question.
addRowAtPosition($a_text, $a_other, $a_position)
Adds a row at a given position.
getRowSeparators()
Gets the separators enable state for the matrix rows.
insertXML(&$a_xml_writer, $a_include_header=TRUE, $obligatory_state="")
Adds the question XML to a given XMLWriter object.
isComplete()
Returns 1 if the question is complete for use.
setExportDetailsXLS(&$workbook, &$format_title, &$format_bold, &$eval_data, $export_label)
Creates an Excel worksheet for the detailed cumulated results of this question.
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.
getTitle()
Gets the title string of the SurveyQuestion object.
setComplete($a_complete)
Sets the complete state of the question.
& calculateCumulatedResults($survey_id, $finished_ids)
getPreconditionOptions()
Returns the options for preconditions.
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.
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...
This class represents a selection list property in a property form.
XML writer class.
xmlHeader()
Writes xml header @access public.
$data
global $ilDB
if(!is_array($argv)) $options
global $ilUser
Definition: imgupload.php:15