ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilObjSurveyQuestionPool.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (c) 1998-2019 ILIAS open source, Extended GPL, see docs/LICENSE */
4
11{
15 protected $user;
16
20 protected $plugin_admin;
21
27 public $online;
28
35 public function __construct($a_id = 0, $a_call_by_reference = true)
36 {
37 global $DIC;
38
39 $this->log = $DIC["ilLog"];
40 $this->db = $DIC->database();
41 $this->user = $DIC->user();
42 $this->plugin_admin = $DIC["ilPluginAdmin"];
43 $this->type = "spl";
44 parent::__construct($a_id, $a_call_by_reference);
45 }
46
50 public function create($a_upload = false)
51 {
52 parent::create();
53 if (!$a_upload) {
54 $this->createMetaData();
55 }
56 }
57
64 public function update()
65 {
66 $this->updateMetaData();
67 if (!parent::update()) {
68 return false;
69 }
70
71 // put here object specific stuff
72
73 return true;
74 }
75
80 public function read()
81 {
82 parent::read();
83 $this->loadFromDb();
84 }
85
91 public function cloneObject($a_target_id, $a_copy_id = 0, $a_omit_tree = false)
92 {
93 $ilLog = $this->log;
94 $newObj = parent::cloneObject($a_target_id, $a_copy_id, $a_omit_tree);
95
96 //copy online status if object is not the root copy object
97 $cp_options = ilCopyWizardOptions::_getInstance($a_copy_id);
98
99 if (!$cp_options->isRootNode($this->getRefId())) {
100 $newObj->setOnline($this->getOnline());
101 }
102
103 $newObj->saveToDb();
104 // clone the questions in the question pool
105 $questions = &$this->getQuestions();
106 foreach ($questions as $question_id) {
107 $newObj->copyQuestion($question_id, $newObj->getId());
108 }
109
110 // clone meta data
111 $md = new ilMD($this->getId(), 0, $this->getType());
112 $new_md = &$md->cloneMD($newObj->getId(), 0, $newObj->getType());
113
114 // update the metadata with the new title of the question pool
115 $newObj->updateMetaData();
116 return $newObj;
117 }
118
119 public function &createQuestion($question_type, $question_id = -1)
120 {
121 if ((!$question_type) and ($question_id > 0)) {
122 $question_type = $this->getQuestiontype($question_id);
123 }
124
125 $question_type_gui = $question_type . "GUI";
126 $question = new $question_type_gui();
127
128 if ($question_id > 0) {
129 $question->object->loadFromDb($question_id);
130 }
131
132 return $question;
133 }
134
142 public function copyQuestion($question_id, $questionpool_to)
143 {
144 $question_gui = &$this->createQuestion("", $question_id);
145 if ($question_gui->object->getObjId() == $questionpool_to) {
146 // the question is copied into the same question pool
147 $this->duplicateQuestion($question_id);
148 } else {
149 // the question is copied into another question pool
150 $newtitle = $question_gui->object->getTitle();
151 if ($question_gui->object->questionTitleExists($question_gui->object->getTitle(), $questionpool_to)) {
152 $counter = 2;
153 while ($question_gui->object->questionTitleExists($question_gui->object->getTitle() . " ($counter)", $questionpool_to)) {
154 $counter++;
155 }
156 $newtitle = $question_gui->object->getTitle() . " ($counter)";
157 }
158 $question_gui->object->copyObject($this->getId(), $newtitle);
159 }
160 }
161
167 public function loadFromDb()
168 {
170
171 $result = $ilDB->queryF(
172 "SELECT * FROM svy_qpl WHERE obj_fi = %s",
173 array('integer'),
174 array($this->getId())
175 );
176 if ($result->numRows() == 1) {
177 $row = $ilDB->fetchAssoc($result);
178 $this->setOnline($row["isonline"]);
179 }
180 }
181
187 public function saveToDb()
188 {
190
191 parent::update();
192
193 $result = $ilDB->queryF(
194 "SELECT * FROM svy_qpl WHERE obj_fi = %s",
195 array('integer'),
196 array($this->getId())
197 );
198 if ($result->numRows() == 1) {
199 $affectedRows = $ilDB->manipulateF(
200 "UPDATE svy_qpl SET isonline = %s, tstamp = %s WHERE obj_fi = %s",
201 array('text','integer','integer'),
202 array($this->getOnline(), time(), $this->getId())
203 );
204 } else {
205 $next_id = $ilDB->nextId('svy_qpl');
206 $query = $ilDB->manipulateF(
207 "INSERT INTO svy_qpl (id_questionpool, isonline, obj_fi, tstamp) VALUES (%s, %s, %s, %s)",
208 array('integer', 'text', 'integer', 'integer'),
209 array($next_id, $this->getOnline(), $this->getId(), time())
210 );
211 }
212 }
213
220 public function delete()
221 {
222 $remove = parent::delete();
223 // always call parent delete function first!!
224 if (!$remove) {
225 return false;
226 }
227
228 // delete all related questions
229 $this->deleteAllData();
230
231 // delete meta data
232 $this->deleteMetaData();
233
234 return true;
235 }
236
237 public function deleteAllData()
238 {
240 $result = $ilDB->queryF(
241 "SELECT question_id FROM svy_question WHERE obj_fi = %s AND original_id IS NULL",
242 array('integer'),
243 array($this->getId())
244 );
245 $found_questions = array();
246 while ($row = $ilDB->fetchAssoc($result)) {
247 $this->removeQuestion($row["question_id"]);
248 }
249
250 // delete export files
251 $spl_data_dir = ilUtil::getDataDir() . "/spl_data";
252 $directory = $spl_data_dir . "/spl_" . $this->getId();
253 if (is_dir($directory)) {
254 ilUtil::delDir($directory);
255 }
256 }
257
264 public function removeQuestion($question_id)
265 {
266 if ($question_id < 1) {
267 return;
268 }
269 $question = &SurveyQuestion::_instanciateQuestion($question_id);
270 $question->delete($question_id);
271 }
272
280 public function getQuestiontype($question_id)
281 {
283 if ($question_id < 1) {
284 return;
285 }
286 $result = $ilDB->queryF(
287 "SELECT svy_qtype.type_tag FROM svy_question, svy_qtype WHERE svy_question.questiontype_fi = svy_qtype.questiontype_id AND svy_question.question_id = %s",
288 array('integer'),
289 array($question_id)
290 );
291 if ($result->numRows() == 1) {
292 $data = $ilDB->fetchAssoc($result);
293 return $data["type_tag"];
294 } else {
295 return;
296 }
297 }
298
306 public function isInUse($question_id)
307 {
309 // check out the already answered questions
310 $result = $ilDB->queryF(
311 "SELECT answer_id FROM svy_answer WHERE question_fi = %s",
312 array('integer'),
313 array($question_id)
314 );
315 $answered = $result->numRows();
316
317 // check out the questions inserted in surveys
318 $result = $ilDB->queryF(
319 "SELECT svy_svy.* FROM svy_svy, svy_svy_qst WHERE svy_svy_qst.survey_fi = svy_svy.survey_id AND svy_svy_qst.question_fi = %s",
320 array('integer'),
321 array($question_id)
322 );
323 $inserted = $result->numRows();
324 if (($inserted + $answered) == 0) {
325 return false;
326 }
327 $result_array = array();
328 while ($row = $ilDB->fetchObject($result)) {
329 array_push($result_array, $row);
330 }
331 return $result_array;
332 }
333
340 public function paste($question_id)
341 {
342 $this->duplicateQuestion($question_id, $this->getId());
343 }
344
352 public function &getQuestionsInfo($question_array)
353 {
355 $result_array = array();
356 $result = $ilDB->query("SELECT svy_question.*, svy_qtype.type_tag, svy_qtype.plugin FROM svy_question, svy_qtype WHERE svy_question.questiontype_fi = svy_qtype.questiontype_id AND svy_question.tstamp > 0 AND " . $ilDB->in('svy_question.question_id', $question_array, false, 'integer'));
357 while ($row = $ilDB->fetchAssoc($result)) {
358 if ($row["plugin"]) {
359 if ($this->isPluginActive($row["type_tag"])) {
360 array_push($result_array, $row);
361 }
362 } else {
363 array_push($result_array, $row);
364 }
365 }
366 return $result_array;
367 }
368
375 public function duplicateQuestion($question_id, $obj_id = "")
376 {
378 $question = SurveyQuestion::_instanciateQuestion($question_id);
379 $suffix = "";
380 $counter = 1;
381 while ($question->questionTitleExists($question->getTitle() . $suffix, $obj_id)) {
382 $counter++;
383 if ($counter > 1) {
384 $suffix = " ($counter)";
385 }
386 }
387 if ($obj_id) {
388 $question->setObjId($obj_id);
389 }
390 $question->duplicate(false, $question->getTitle() . $suffix, $ilUser->fullname, $ilUser->id);
391 }
392
398 public function getQuestionsData($arrFilter)
399 {
402 $where = "";
403 if (is_array($arrFilter)) {
404 foreach ($arrFilter as $key => $value) {
405 $arrFilter[$key] = str_replace('%', '', $arrFilter[$key]);
406 }
407 if (array_key_exists('title', $arrFilter) && strlen($arrFilter['title'])) {
408 $where .= " AND " . $ilDB->like('svy_question.title', 'text', "%%" . $arrFilter['title'] . "%%");
409 }
410 if (array_key_exists('description', $arrFilter) && strlen($arrFilter['description'])) {
411 $where .= " AND " . $ilDB->like('svy_question.description', 'text', "%%" . $arrFilter['description'] . "%%");
412 }
413 if (array_key_exists('author', $arrFilter) && strlen($arrFilter['author'])) {
414 $where .= " AND " . $ilDB->like('svy_question.author', 'text', "%%" . $arrFilter['author'] . "%%");
415 }
416 if (array_key_exists('type', $arrFilter) && strlen($arrFilter['type'])) {
417 $where .= " AND svy_qtype.type_tag = " . $ilDB->quote($arrFilter['type'], 'text');
418 }
419 }
420 $query_result = $ilDB->queryF(
421 "SELECT svy_question.*, svy_qtype.type_tag, svy_qtype.plugin FROM svy_question, svy_qtype WHERE svy_question.original_id IS NULL AND svy_question.tstamp > 0 AND svy_question.questiontype_fi = svy_qtype.questiontype_id AND svy_question.obj_fi = %s" . $where,
422 array('integer'),
423 array($this->getId())
424 );
425 $rows = array();
426 if ($query_result->numRows()) {
427 while ($row = $ilDB->fetchAssoc($query_result)) {
428 if ($row["plugin"]) {
429 if ($this->isPluginActive($row["type_tag"])) {
430 array_push($rows, $row);
431 }
432 } else {
433 array_push($rows, $row);
434 }
435 }
436 }
437 return $rows;
438 }
439
447 public function createExportDirectory()
448 {
449 $spl_data_dir = ilUtil::getDataDir() . "/spl_data";
450 ilUtil::makeDir($spl_data_dir);
451 if (!is_writable($spl_data_dir)) {
452 throw new ilSurveyException("Survey Questionpool Data Directory (" . $spl_data_dir . ") not writeable.");
453 }
454
455 // create learning module directory (data_dir/lm_data/lm_<id>)
456 $spl_dir = $spl_data_dir . "/spl_" . $this->getId();
457 ilUtil::makeDir($spl_dir);
458 if (!@is_dir($spl_dir)) {
459 throw new ilSurveyException("Creation of Survey Questionpool Directory failed.");
460 }
461 // create Export subdirectory (data_dir/lm_data/lm_<id>/Export)
462 $export_dir = $spl_dir . "/export";
463 ilUtil::makeDir($export_dir);
464 if (!@is_dir($export_dir)) {
465 throw new ilSurveyException("Creation of Survey Questionpool Export Directory failed.");
466 }
467 }
468
472 public function getExportDirectory()
473 {
474 $export_dir = ilUtil::getDataDir() . "/spl_data" . "/spl_" . $this->getId() . "/export";
475 return $export_dir;
476 }
477
481 public function getExportFiles($dir)
482 {
483 // quit if import dir not available
484 if (!@is_dir($dir) or
485 !is_writeable($dir)) {
486 return array();
487 }
488
489 // open directory
490 $dir = dir($dir);
491
492 // initialize array
493 $file = array();
494
495 // get files and save the in the array
496 while ($entry = $dir->read()) {
497 if ($entry != "." &&
498 $entry != ".." &&
499 preg_match("/^[0-9]{10}__[0-9]+__(spl_)*[0-9]+\.[A-Za-z]{3}$/", $entry)) {
500 $file[] = $entry;
501 }
502 }
503
504 // close import directory
505 $dir->close();
506 // sort files
507 sort($file);
508 reset($file);
509
510 return $file;
511 }
512
520 public function createImportDirectory()
521 {
522 $spl_data_dir = ilUtil::getDataDir() . "/spl_data";
523 ilUtil::makeDir($spl_data_dir);
524
525 if (!is_writable($spl_data_dir)) {
526 throw new ilSurveyException("Survey Questionpool Data Directory (" . $spl_data_dir . ") not writeable.");
527 }
528
529 // create test directory (data_dir/spl_data/spl_<id>)
530 $spl_dir = $spl_data_dir . "/spl_" . $this->getId();
531 ilUtil::makeDir($spl_dir);
532 if (!@is_dir($spl_dir)) {
533 throw new ilSurveyException("Creation of Survey Questionpool Directory failed.");
534 }
535
536 // create import subdirectory (data_dir/spl_data/spl_<id>/import)
537 $import_dir = $spl_dir . "/import";
538 ilUtil::makeDir($import_dir);
539 if (!@is_dir($import_dir)) {
540 throw new ilSurveyException("Creation of Survey Questionpool Import Directory failed.");
541 }
542 }
543
547 public function getImportDirectory()
548 {
549 $import_dir = ilUtil::getDataDir() . "/spl_data" .
550 "/spl_" . $this->getId() . "/import";
551 if (@is_dir($import_dir)) {
552 return $import_dir;
553 } else {
554 return false;
555 }
556 }
557
561 public function toXML($questions)
562 {
563 if (!is_array($questions)) {
564 $questions = &$this->getQuestions();
565 }
566 if (count($questions) == 0) {
567 $questions = &$this->getQuestions();
568 }
569 $xml = "";
570
571 $a_xml_writer = new ilXmlWriter;
572 // set xml header
573 $a_xml_writer->xmlHeader();
574 $attrs = array(
575 "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
576 "xsi:noNamespaceSchemaLocation" => "http://www.ilias.de/download/xsd/ilias_survey_4_2.xsd"
577 );
578 $a_xml_writer->xmlStartTag("surveyobject", $attrs);
579 $attrs = array(
580 "id" => "qpl_" . $this->getId(),
581 "label" => $this->getTitle(),
582 "online" => $this->getOnline()
583 );
584 $a_xml_writer->xmlStartTag("surveyquestions", $attrs);
585 $a_xml_writer->xmlElement("dummy", null, "dummy");
586 // add ILIAS specific metadata
587 $a_xml_writer->xmlStartTag("metadata");
588 $a_xml_writer->xmlStartTag("metadatafield");
589 $a_xml_writer->xmlElement("fieldlabel", null, "SCORM");
590 $md = new ilMD($this->getId(), 0, $this->getType());
591 $writer = new ilXmlWriter();
592 $md->toXml($writer);
593 $metadata = $writer->xmlDumpMem();
594 $a_xml_writer->xmlElement("fieldentry", null, $metadata);
595 $a_xml_writer->xmlEndTag("metadatafield");
596 $a_xml_writer->xmlEndTag("metadata");
597
598 $a_xml_writer->xmlEndTag("surveyquestions");
599 $a_xml_writer->xmlEndTag("surveyobject");
600
601 $xml = $a_xml_writer->xmlDumpMem(false);
602
603 $questionxml = "";
604 foreach ($questions as $key => $value) {
605 $questiontype = $this->getQuestiontype($value);
606 SurveyQuestion::_includeClass($questiontype);
607 $question = new $questiontype();
608 $question->loadFromDb($value);
609 $questionxml .= $question->toXML(false);
610 }
611
612 $xml = str_replace("<dummy>dummy</dummy>", $questionxml, $xml);
613 return $xml;
614 }
615
616 public function &getQuestions()
617 {
619 $questions = array();
620 $result = $ilDB->queryF(
621 "SELECT question_id FROM svy_question WHERE obj_fi = %s AND svy_question.tstamp > 0 AND original_id IS NULL",
622 array('integer'),
623 array($this->getId())
624 );
625 if ($result->numRows()) {
626 while ($row = $ilDB->fetchAssoc($result)) {
627 array_push($questions, $row["question_id"]);
628 }
629 }
630 return $questions;
631 }
632
639 public function importObject($source, $spl_exists = false)
640 {
641 if (is_file($source)) {
642 $isZip = (strcmp(strtolower(substr($source, -3)), 'zip') == 0);
643 if ($isZip) {
644 // unzip file
646
647 // determine filenames of xml files
648 $subdir = basename($source, ".zip");
649 $source = dirname($source) . "/" . $subdir . "/" . $subdir . ".xml";
650 }
651
652 $fh = fopen($source, "r") or die("");
653 $xml = fread($fh, filesize($source));
654 fclose($fh) or die("");
655 if ($isZip) {
656 $subdir = basename($source, ".zip");
657 if (@is_dir(dirname($source) . "/" . $subdir)) {
658 ilUtil::delDir(dirname($source) . "/" . $subdir);
659 }
660 }
661 if (strpos($xml, "questestinterop") > 0) {
662 throw new ilInvalidSurveyImportFileException("Unsupported survey version (< 3.8) found.");
663 } else {
664 // survey questions for ILIAS >= 3.8
665 $import = new SurveyImportParser($this->getId(), "", $spl_exists);
666 $import->setXMLContent($xml);
667 $import->startParsing();
668 }
669 }
670 }
671
672 public static function _setOnline($a_obj_id, $a_online_status)
673 {
674 global $DIC;
675
676 $ilDB = $DIC->database();
677
678 $status = "0";
679 switch ($a_online_status) {
680 case 0:
681 case 1:
682 $status = "$a_online_status";
683 break;
684 }
685 $affectedRows = $ilDB->manipulateF(
686 "UPDATE svy_qpl SET isonline = %s WHERE obj_fi = %s",
687 array('text','integer'),
688 array($status, $a_obj_id)
689 );
690 }
691
699 public function setOnline($a_online_status)
700 {
701 switch ($a_online_status) {
702 case 0:
703 case 1:
704 $this->online = $a_online_status;
705 break;
706 default:
707 $this->online = 0;
708 break;
709 }
710 }
711
712 public function getOnline()
713 {
714 if (strcmp($this->online, "") == 0) {
715 $this->online = "0";
716 }
717 return $this->online;
718 }
719
720 public static function _lookupOnline($a_obj_id)
721 {
722 global $DIC;
723
724 $ilDB = $DIC->database();
725
726 $result = $ilDB->queryF(
727 "SELECT isonline FROM svy_qpl WHERE obj_fi = %s",
728 array('integer'),
729 array($a_obj_id)
730 );
731 if ($result->numRows() == 1) {
732 $row = $ilDB->fetchAssoc($result);
733 return $row["isonline"];
734 }
735 return 0;
736 }
737
745 public static function _isWriteable($object_id, $user_id)
746 {
747 global $DIC;
748
749 $rbacsystem = $DIC->rbac()->system();
750 global $DIC;
751
752 $ilDB = $DIC->database();
753
754 $refs = ilObject::_getAllReferences($object_id);
755 $result = false;
756 foreach ($refs as $ref) {
757 if ($rbacsystem->checkAccess("write", $ref) && (ilObject::_hasUntrashedReference($object_id))) {
758 $result = true;
759 }
760 }
761 return $result;
762 }
763
770 public static function _getQuestiontypes()
771 {
772 global $DIC;
773
774 $ilDB = $DIC->database();
775 global $DIC;
776
777 $lng = $DIC->language();
778
779 $lng->loadLanguageModule("survey");
780 $types = array();
781 $query_result = $ilDB->query("SELECT * FROM svy_qtype ORDER BY type_tag");
782 while ($row = $ilDB->fetchAssoc($query_result)) {
783 //array_push($questiontypes, $row["type_tag"]);
784 if ($row["plugin"] == 0) {
785 $types[$lng->txt($row["type_tag"])] = $row;
786 } else {
787 global $DIC;
788
789 $ilPluginAdmin = $DIC["ilPluginAdmin"];
790 $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
791 foreach ($pl_names as $pl_name) {
792 $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
793 if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0) {
794 $types[$pl->getQuestionTypeTranslation()] = $row;
795 }
796 }
797 }
798 }
799 ksort($types);
800
801
802 // #14263 - default sorting
803
804 $default_sorting = array_flip(array(
805 "SurveySingleChoiceQuestion",
806 "SurveyMultipleChoiceQuestion",
807 "SurveyMatrixQuestion",
808 "SurveyMetricQuestion",
809 "SurveyTextQuestion"
810 ));
811
812 $sorted = array();
813 $idx = sizeof($default_sorting);
814 foreach ($types as $caption => $item) {
815 $type = $item["type_tag"];
816 $item["caption"] = $caption;
817
818 // default
819 if (array_key_exists($type, $default_sorting)) {
820 $sorted[$default_sorting[$type]] = $item;
821 }
822 // plugin (append alphabetically sorted)
823 else {
824 $sorted[$idx] = $item;
825 $idx++;
826 }
827 }
828 ksort($sorted);
829
830 // redo captions as index
831 $types = array();
832 foreach ($sorted as $item) {
833 $types[$item["caption"]] = $item;
834 }
835
836 return $types;
837 }
838
844 public static function _getQuestionClasses() : array
845 {
846 $classes = array_map(
847 function ($c) {
848 return $c["type_tag"];
849 },
851 );
852 return $classes;
853 }
854
855 public static function _getQuestionTypeTranslations()
856 {
857 global $DIC;
858
859 $ilDB = $DIC->database();
860 global $DIC;
861
862 $lng = $DIC->language();
863 global $DIC;
864
865 $ilLog = $DIC["ilLog"];
866 global $DIC;
867
868 $ilPluginAdmin = $DIC["ilPluginAdmin"];
869
870 $lng->loadLanguageModule("survey");
871 $result = $ilDB->query("SELECT * FROM svy_qtype");
872 $types = array();
873 while ($row = $ilDB->fetchAssoc($result)) {
874 if ($row["plugin"] == 0) {
875 $types[$row['type_tag']] = $lng->txt($row["type_tag"]);
876 } else {
877 $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
878 foreach ($pl_names as $pl_name) {
879 $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
880 if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0) {
881 $types[$row['type_tag']] = $pl->getQuestionTypeTranslation();
882 }
883 }
884 }
885 }
886 ksort($types);
887 return $types;
888 }
889
896 public static function _getAvailableQuestionpools($use_object_id = false, $could_be_offline = false, $showPath = false, $permission = "read")
897 {
898 global $DIC;
899
900 $ilUser = $DIC->user();
901 global $DIC;
902
903 $ilDB = $DIC->database();
904
905 $result_array = array();
906 $qpls = ilUtil::_getObjectsByOperations("spl", $permission, $ilUser->getId(), -1);
907 $titles = ilObject::_prepareCloneSelection($qpls, "spl", $showPath);
908 $allqpls = array();
909 $result = $ilDB->query("SELECT obj_fi, isonline FROM svy_qpl");
910 while ($row = $ilDB->fetchAssoc($result)) {
911 $allqpls[$row['obj_fi']] = $row['isonline'];
912 }
913 foreach ($qpls as $ref_id) {
915 if ($could_be_offline || $allqpls[$obj_id] == 1) {
916 if ($use_object_id) {
917 $result_array[$obj_id] = $titles[$ref_id];
918 } else {
919 $result_array[$ref_id] = $titles[$ref_id];
920 }
921 }
922 }
923 return $result_array;
924 }
925
932 public function isPluginActive($a_pname)
933 {
934 $ilPluginAdmin = $this->plugin_admin;
935 if ($ilPluginAdmin->isActive(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $a_pname)) {
936 return true;
937 } else {
938 return false;
939 }
940 }
941
948 public function getQuestionInfos($question_ids)
949 {
951
952 $found = array();
953 $query_result = $ilDB->query("SELECT svy_question.*, svy_qtype.type_tag FROM svy_question, svy_qtype " .
954 "WHERE svy_question.questiontype_fi = svy_qtype.questiontype_id " .
955 "AND svy_question.tstamp > 0 AND " . $ilDB->in('svy_question.question_id', $question_ids, false, 'integer') . " " .
956 "ORDER BY svy_question.title");
957 if ($query_result->numRows() > 0) {
958 while ($data = $ilDB->fetchAssoc($query_result)) {
959 if (in_array($data["question_id"], $question_ids)) {
960 array_push($found, array('id' => $data["question_id"],
961 'title' => $data["title"],
962 'description' => $data["description"],
963 'type_tag' => $data["type_tag"]));
964 }
965 }
966 }
967 return $found;
968 }
969
970 /*
971 * Remove all questions with tstamp = 0
972 */
973 public function purgeQuestions()
974 {
977
978 $result = $ilDB->queryF(
979 "SELECT question_id FROM svy_question WHERE owner_fi = %s AND tstamp = %s",
980 array("integer", "integer"),
981 array($ilUser->getId(), 0)
982 );
983 while ($data = $ilDB->fetchAssoc($result)) {
984 $this->removeQuestion($data["question_id"]);
985 }
986 }
987
993 public function copyToClipboard($question_id)
994 {
995 if (!array_key_exists("spl_clipboard", $_SESSION)) {
996 $_SESSION["spl_clipboard"] = array();
997 }
998 $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "copy");
999 }
1000
1006 public function moveToClipboard($question_id)
1007 {
1008 if (!array_key_exists("spl_clipboard", $_SESSION)) {
1009 $_SESSION["spl_clipboard"] = array();
1010 }
1011 $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "move");
1012 }
1013
1017 public function pasteFromClipboard()
1018 {
1019 $ilDB = $this->db;
1020
1021 if (array_key_exists("spl_clipboard", $_SESSION)) {
1022 foreach ($_SESSION["spl_clipboard"] as $question_object) {
1023 if (strcmp($question_object["action"], "move") == 0) {
1024 $result = $ilDB->queryF(
1025 "SELECT obj_fi FROM svy_question WHERE question_id = %s",
1026 array('integer'),
1027 array($question_object["question_id"])
1028 );
1029 if ($result->numRows() == 1) {
1030 $row = $ilDB->fetchAssoc($result);
1031 $source_questionpool = $row["obj_fi"];
1032 if ($this->getId() != $source_questionpool) {
1033 // change the questionpool id in the qpl_questions table
1034 $affectedRows = $ilDB->manipulateF(
1035 "UPDATE svy_question SET obj_fi = %s WHERE question_id = %s",
1036 array('integer','integer'),
1037 array($this->getId(), $question_object["question_id"])
1038 );
1039
1040 // move question data to the new target directory
1041 $source_path = CLIENT_WEB_DIR . "/survey/" . $source_questionpool . "/" . $question_object["question_id"] . "/";
1042 if (@is_dir($source_path)) {
1043 $target_path = CLIENT_WEB_DIR . "/survey/" . $this->getId() . "/";
1044 if (!@is_dir($target_path)) {
1045 ilUtil::makeDirParents($target_path);
1046 }
1047 @rename($source_path, $target_path . $question_object["question_id"]);
1048 }
1049 } else {
1050 ilUtil::sendFailure($this->lng->txt("spl_move_same_pool"), true);
1051 return;
1052 }
1053 }
1054 } else {
1055 $this->copyQuestion($question_object["question_id"], $this->getId());
1056 }
1057 }
1058 }
1059 ilUtil::sendSuccess($this->lng->txt("spl_paste_success"), true);
1060 unset($_SESSION["spl_clipboard"]);
1061 }
1062
1069 public function setObligatoryStates($obligatory_questions)
1070 {
1071 $ilDB = $this->db;
1072
1073 foreach ($this->getQuestions() as $question_id) {
1074 $status = (int) (in_array($question_id, $obligatory_questions));
1075
1076 $ilDB->manipulate("UPDATE svy_question" .
1077 " SET obligatory = " . $ilDB->quote($status, "integer") .
1078 " WHERE question_id = " . $ilDB->quote($question_id, "integer"));
1079 }
1080 }
1081} // END class.ilSurveyObjQuestionPool
$result
user()
Definition: user.php:4
$_SESSION["AccountId"]
An exception for terminatinating execution or to throw for unit testing.
Survey Question Import Parser.
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
static _includeClass($question_type, $gui=0)
Include the php class file for a given question type.
const IL_COMP_MODULE
static _getInstance($a_copy_id)
Get instance of copy wizard options.
Class ilObjSurveyQuestionPool.
moveToClipboard($question_id)
Moves a question to the clipboard.
getQuestionsData($arrFilter)
Calculates the data for the output of the questionpool.
setOnline($a_online_status)
Sets the questionpool online status.
removeQuestion($question_id)
Removes a question from the question pool.
createImportDirectory()
creates data directory for import files (data_dir/spl_data/spl_<id>/import, depending on data directo...
loadFromDb()
Loads a ilObjQuestionpool object from a database.
getQuestionInfos($question_ids)
Returns title, description and type for an array of question id's.
cloneObject($a_target_id, $a_copy_id=0, $a_omit_tree=false)
Creates a 1:1 copy of the object and places the copy in a given repository.
paste($question_id)
Pastes a question in the question pool.
copyToClipboard($question_id)
Copies a question to the clipboard.
static _getAvailableQuestionpools($use_object_id=false, $could_be_offline=false, $showPath=false, $permission="read")
Returns the available question pools for the active user.
importObject($source, $spl_exists=false)
Imports survey questions into ILIAS.
static _getQuestionClasses()
Get question classes.
createExportDirectory()
creates data directory for export files (data_dir/spl_data/spl_<id>/export, depending on data directo...
copyQuestion($question_id, $questionpool_to)
Copies a question into another question pool.
static _isWriteable($object_id, $user_id)
Returns true, if the question pool is writeable by a given user.
static _getQuestiontypes()
Creates a list of all available question types.
create($a_upload=false)
create question pool object
getExportDirectory()
get export directory of survey
isPluginActive($a_pname)
Checks whether or not a question plugin with a given name is active.
read()
read object data from db into object @access public
pasteFromClipboard()
Copies/Moves a question from the clipboard.
& createQuestion($question_type, $question_id=-1)
toXML($questions)
export questions to xml
saveToDb()
Saves a ilObjSurveyQuestionPool object to a database.
static _setOnline($a_obj_id, $a_online_status)
getImportDirectory()
get import directory of survey
& getQuestionsInfo($question_array)
Retrieves the datase entries for questions from a given array.
isInUse($question_id)
Checks if a question is in use by a survey.
__construct($a_id=0, $a_call_by_reference=true)
Constructor @access public.
getQuestiontype($question_id)
Returns the question type of a question with a given id.
duplicateQuestion($question_id, $obj_id="")
Duplicates a question for a questionpool.
setObligatoryStates($obligatory_questions)
Sets the obligatory states for questions in a survey from the questions form.
Class ilObject Basic functions for all objects.
getType()
get object type @access public
static _lookupObjectId($a_ref_id)
lookup object id
deleteMetaData()
delete meta data entry
updateMetaData()
update meta data entry
createMetaData()
create meta data entry
static _getAllReferences($a_id)
get all reference ids of object
getId()
get object id @access public
static _hasUntrashedReference($a_obj_id)
checks wether an object has at least one reference that is not in trash
static _prepareCloneSelection($a_ref_ids, $new_type, $show_path=true)
Prepare copy wizard object selection.
getTitle()
get object title @access public
static getPluginObject(string $a_ctype, string $a_cname, string $a_slot_id, string $a_pname)
Survey exception class.
static getDataDir()
get data directory (outside webspace)
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static _getObjectsByOperations($a_obj_type, $a_operation, $a_usr_id=0, $limit=0)
Get all objects of a specific type and check access This function is not recursive,...
static unzip(string $path_to_zip_file, bool $overwrite_existing=false, bool $unpack_flat=false)
static makeDirParents($a_dir)
Create a new directory and all parent directories.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
XML writer class.
xmlHeader()
Writes xml header @access public.
$c
Definition: cli.php:37
const CLIENT_WEB_DIR
Definition: constants.php:45
global $DIC
Definition: goto.php:24
$ilUser
Definition: imgupload.php:18
$source
Definition: metadata.php:76
$xml
Definition: metadata.php:332
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
$query
global $ilDB
$data
Definition: storeScorm.php:23
$rows
Definition: xhr_table.php:10