ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilObjSurveyQuestionPool.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
34include_once "./Services/Object/classes/class.ilObject.php";
35
37{
44
51 function ilObjSurveyQuestionPool($a_id = 0,$a_call_by_reference = true)
52 {
53 $this->type = "spl";
54 $this->ilObject($a_id,$a_call_by_reference);
55 }
56
60 function create($a_upload = false)
61 {
62 parent::create();
63 if(!$a_upload)
64 {
65 $this->createMetaData();
66 }
67 }
68
75 function update()
76 {
77 $this->updateMetaData();
78 if (!parent::update())
79 {
80 return false;
81 }
82
83 // put here object specific stuff
84
85 return true;
86 }
87
93 function read($a_force_db = false)
94 {
95 parent::read($a_force_db);
96 $this->loadFromDb();
97 }
98
104 function cloneObject($a_target_id,$a_copy_id = 0)
105 {
106 global $ilLog;
107 $newObj = parent::cloneObject($a_target_id,$a_copy_id);
108
109 //copy online status if object is not the root copy object
110 $cp_options = ilCopyWizardOptions::_getInstance($a_copy_id);
111
112 if(!$cp_options->isRootNode($this->getRefId()))
113 {
114 $newObj->setOnline($this->getOnline());
115 }
116
117 $newObj->saveToDb();
118 // clone the questions in the question pool
119 $questions =& $this->getQuestions();
120 foreach ($questions as $question_id)
121 {
122 $newObj->copyQuestion($question_id, $newObj->getId());
123 }
124
125 // clone meta data
126 include_once "./Services/MetaData/classes/class.ilMD.php";
127 $md = new ilMD($this->getId(),0,$this->getType());
128 $new_md =& $md->cloneMD($newObj->getId(),0,$newObj->getType());
129
130 // update the metadata with the new title of the question pool
131 $newObj->updateMetaData();
132 return $newObj;
133 }
134
135 function &createQuestion($question_type, $question_id = -1)
136 {
137 if ((!$question_type) and ($question_id > 0))
138 {
139 $question_type = $this->getQuestiontype($question_id);
140 }
141
142 include_once "./Modules/SurveyQuestionPool/classes/class.".$question_type."GUI.php";
143 $question_type_gui = $question_type . "GUI";
144 $question =& new $question_type_gui();
145
146 if ($question_id > 0)
147 {
148 $question->object->loadFromDb($question_id);
149 }
150
151 return $question;
152 }
153
161 function copyQuestion($question_id, $questionpool_to)
162 {
163 $question_gui =& $this->createQuestion("", $question_id);
164 if ($question_gui->object->getObjId() == $questionpool_to)
165 {
166 // the question is copied into the same question pool
167 $this->duplicateQuestion($question_id);
168 }
169 else
170 {
171 // the question is copied into another question pool
172 $newtitle = $question_gui->object->getTitle();
173 if ($question_gui->object->questionTitleExists($question_gui->object->getTitle(), $questionpool_to))
174 {
175 $counter = 2;
176 while ($question_gui->object->questionTitleExists($question_gui->object->getTitle() . " ($counter)", $questionpool_to))
177 {
178 $counter++;
179 }
180 $newtitle = $question_gui->object->getTitle() . " ($counter)";
181 }
182 $question_gui->object->copyObject($this->getId(), $newtitle);
183 }
184 }
185
191 function loadFromDb()
192 {
193 global $ilDB;
194
195 $result = $ilDB->queryF("SELECT * FROM svy_qpl WHERE obj_fi = %s",
196 array('integer'),
197 array($this->getId())
198 );
199 if ($result->numRows() == 1)
200 {
201 $row = $ilDB->fetchAssoc($result);
202 $this->setOnline($row["isonline"]);
203 }
204 }
205
211 function saveToDb()
212 {
213 global $ilDB;
214
215 parent::update();
216
217 $result = $ilDB->queryF("SELECT * FROM svy_qpl WHERE obj_fi = %s",
218 array('integer'),
219 array($this->getId())
220 );
221 if ($result->numRows() == 1)
222 {
223 $affectedRows = $ilDB->manipulateF("UPDATE svy_qpl SET isonline = %s, tstamp = %s WHERE obj_fi = %s",
224 array('text','integer','integer'),
225 array($this->getOnline(), time(), $this->getId())
226 );
227 }
228 else
229 {
230 $next_id = $ilDB->nextId('svy_qpl');
231 $query = $ilDB->manipulateF("INSERT INTO svy_qpl (id_questionpool, isonline, obj_fi, tstamp) VALUES (%s, %s, %s, %s)",
232 array('integer', 'text', 'integer', 'integer'),
233 array($next_id, $this->getOnline(), $this->getId(), time())
234 );
235 }
236 }
237
244 function delete()
245 {
246 $remove = parent::delete();
247 // always call parent delete function first!!
248 if (!$remove)
249 {
250 return false;
251 }
252
253 // delete all related questions
254 $this->deleteAllData();
255
256 // delete meta data
257 $this->deleteMetaData();
258
259 return true;
260 }
261
262 function deleteAllData()
263 {
264 global $ilDB;
265 $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE obj_fi = %s AND original_id IS NULL",
266 array('integer'),
267 array($this->getId())
268 );
269 $found_questions = array();
270 while ($row = $ilDB->fetchAssoc($result))
271 {
272 $this->removeQuestion($row["question_id"]);
273 }
274
275 // delete export files
276 include_once "./Services/Utilities/classes/class.ilUtil.php";
277 $spl_data_dir = ilUtil::getDataDir()."/spl_data";
278 $directory = $spl_data_dir."/spl_".$this->getId();
279 if (is_dir($directory))
280 {
281 include_once "./Services/Utilities/classes/class.ilUtil.php";
282 ilUtil::delDir($directory);
283 }
284 }
285
299 function notify($a_event,$a_ref_id,$a_parent_non_rbac_id,$a_node_id,$a_params = 0)
300 {
301 global $tree;
302
303 switch ($a_event)
304 {
305 case "link":
306
307 //var_dump("<pre>",$a_params,"</pre>");
308 //echo "Module name ".$this->getRefId()." triggered by link event. Objects linked into target object ref_id: ".$a_ref_id;
309 //exit;
310 break;
311
312 case "cut":
313
314 //echo "Module name ".$this->getRefId()." triggered by cut event. Objects are removed from target object ref_id: ".$a_ref_id;
315 //exit;
316 break;
317
318 case "copy":
319
320 //var_dump("<pre>",$a_params,"</pre>");
321 //echo "Module name ".$this->getRefId()." triggered by copy event. Objects are copied into target object ref_id: ".$a_ref_id;
322 //exit;
323 break;
324
325 case "paste":
326
327 //echo "Module name ".$this->getRefId()." triggered by paste (cut) event. Objects are pasted into target object ref_id: ".$a_ref_id;
328 //exit;
329 break;
330
331 case "new":
332
333 //echo "Module name ".$this->getRefId()." triggered by paste (new) event. Objects are applied to target object ref_id: ".$a_ref_id;
334 //exit;
335 break;
336 }
337
338 // At the beginning of the recursive process it avoids second call of the notify function with the same parameter
339 if ($a_node_id==$_GET["ref_id"])
340 {
341 $parent_obj =& $this->ilias->obj_factory->getInstanceByRefId($a_node_id);
342 $parent_type = $parent_obj->getType();
343 if($parent_type == $this->getType())
344 {
345 $a_node_id = (int) $tree->getParentId($a_node_id);
346 }
347 }
348
349 parent::notify($a_event,$a_ref_id,$a_parent_non_rbac_id,$a_node_id,$a_params);
350 }
351
358 function removeQuestion($question_id)
359 {
360 if ($question_id < 1) return;
361 include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
362 $question =& SurveyQuestion::_instanciateQuestion($question_id);
363 $question->delete($question_id);
364 }
365
373 function getQuestiontype($question_id)
374 {
375 global $ilDB;
376 if ($question_id < 1) return;
377 $result = $ilDB->queryF("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",
378 array('integer'),
379 array($question_id)
380 );
381 if ($result->numRows() == 1)
382 {
383 $data = $ilDB->fetchAssoc($result);
384 return $data["type_tag"];
385 }
386 else
387 {
388 return;
389 }
390 }
391
399 function isInUse($question_id)
400 {
401 global $ilDB;
402 // check out the already answered questions
403 $result = $ilDB->queryF("SELECT answer_id FROM svy_answer WHERE question_fi = %s",
404 array('integer'),
405 array($question_id)
406 );
407 $answered = $result->numRows();
408
409 // check out the questions inserted in surveys
410 $result = $ilDB->queryF("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",
411 array('integer'),
412 array($question_id)
413 );
414 $inserted = $result->numRows();
415 if (($inserted + $answered) == 0)
416 {
417 return false;
418 }
419 $result_array = array();
420 while ($row = $ilDB->fetchObject($result))
421 {
422 array_push($result_array, $row);
423 }
424 return $result_array;
425 }
426
433 function paste($question_id)
434 {
435 $this->duplicateQuestion($question_id, $this->getId());
436 }
437
445 function &getQuestionsInfo($question_array)
446 {
447 global $ilDB;
448 $result_array = array();
449 $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'));
450 while ($row = $ilDB->fetchAssoc($result))
451 {
452 if ($row["plugin"])
453 {
454 if ($this->isPluginActive($row["type_tag"]))
455 {
456 array_push($result_array, $row);
457 }
458 }
459 else
460 {
461 array_push($result_array, $row);
462 }
463 }
464 return $result_array;
465 }
466
473 function duplicateQuestion($question_id, $obj_id = "")
474 {
475 global $ilUser;
476 include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
477 $question = SurveyQuestion::_instanciateQuestion($question_id);
478 $suffix = "";
479 $counter = 1;
480 while ($question->questionTitleExists($question->getTitle().$suffix, $obj_id))
481 {
482 $counter++;
483 if ($counter > 1) $suffix = " ($counter)";
484 }
485 if ($obj_id)
486 {
487 $question->setObjId($obj_id);
488 }
489 $question->duplicate(false, $question->getTitle() . $suffix, $ilUser->fullname, $ilUser->id);
490 }
491
497 function getQuestionsData($arrFilter)
498 {
499 global $ilUser;
500 global $ilDB;
501 $where = "";
502 if (is_array($arrFilter))
503 {
504 foreach ($arrFilter as $key => $value)
505 {
506 $arrFilter[$key] = str_replace('%', '', $arrFilter[$key]);
507 }
508 if (array_key_exists('title', $arrFilter) && strlen($arrFilter['title']))
509 {
510 $where .= " AND " . $ilDB->like('svy_question.title', 'text', "%%" . $arrFilter['title'] . "%%");
511 }
512 if (array_key_exists('description', $arrFilter) && strlen($arrFilter['description']))
513 {
514 $where .= " AND " . $ilDB->like('svy_question.description', 'text', "%%" . $arrFilter['description'] . "%%");
515 }
516 if (array_key_exists('author', $arrFilter) && strlen($arrFilter['author']))
517 {
518 $where .= " AND " . $ilDB->like('svy_question.author', 'text', "%%" . $arrFilter['author'] . "%%");
519 }
520 if (array_key_exists('type', $arrFilter) && strlen($arrFilter['type']))
521 {
522 $where .= " AND svy_qtype.type_tag = " . $ilDB->quote($arrFilter['type'], 'text');
523 }
524 }
525 $query_result = $ilDB->queryF("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,
526 array('integer'),
527 array($this->getId())
528 );
529 $rows = array();
530 if ($query_result->numRows())
531 {
532 while ($row = $ilDB->fetchAssoc($query_result))
533 {
534 // first part fix #19469
535 $set = $ilDB->query("SELECT question_fi FROM svy_svy_qst ".
536 " WHERE question_fi = ".$ilDB->quote($row["question_id"], "integer")
537 );
538 if ($temp = $ilDB->fetchAssoc($set))
539 {
540 continue;
541 }
542 if ($row["plugin"])
543 {
544 if ($this->isPluginActive($row["type_tag"]))
545 {
546 array_push($rows, $row);
547 }
548 }
549 else
550 {
551 array_push($rows, $row);
552 }
553 }
554 }
555 return $rows;
556 }
557
564 {
565 include_once "./Services/Utilities/classes/class.ilUtil.php";
566 $spl_data_dir = ilUtil::getDataDir()."/spl_data";
567 ilUtil::makeDir($spl_data_dir);
568 if(!is_writable($spl_data_dir))
569 {
570 $this->ilias->raiseError("Survey Questionpool Data Directory (".$spl_data_dir
571 .") not writeable.",$this->ilias->error_obj->FATAL);
572 }
573
574 // create learning module directory (data_dir/lm_data/lm_<id>)
575 $spl_dir = $spl_data_dir."/spl_".$this->getId();
576 ilUtil::makeDir($spl_dir);
577 if(!@is_dir($spl_dir))
578 {
579 $this->ilias->raiseError("Creation of Survey Questionpool Directory failed.",$this->ilias->error_obj->FATAL);
580 }
581 // create Export subdirectory (data_dir/lm_data/lm_<id>/Export)
582 $export_dir = $spl_dir."/export";
583 ilUtil::makeDir($export_dir);
584 if(!@is_dir($export_dir))
585 {
586 $this->ilias->raiseError("Creation of Export Directory failed.",$this->ilias->error_obj->FATAL);
587 }
588 }
589
594 {
595 include_once "./Services/Utilities/classes/class.ilUtil.php";
596 $export_dir = ilUtil::getDataDir()."/spl_data"."/spl_".$this->getId()."/export";
597 return $export_dir;
598 }
599
603 function getExportFiles($dir)
604 {
605 // quit if import dir not available
606 if (!@is_dir($dir) or
607 !is_writeable($dir))
608 {
609 return array();
610 }
611
612 // open directory
613 $dir = dir($dir);
614
615 // initialize array
616 $file = array();
617
618 // get files and save the in the array
619 while ($entry = $dir->read())
620 {
621 if ($entry != "." &&
622 $entry != ".." &&
623 ereg("^[0-9]{10}_{2}[0-9]+_{2}(spl_)*[0-9]+\.[A-Za-z]{3}\$", $entry))
624 {
625 $file[] = $entry;
626 }
627 }
628
629 // close import directory
630 $dir->close();
631 // sort files
632 sort ($file);
633 reset ($file);
634
635 return $file;
636 }
637
644 {
645 include_once "./Services/Utilities/classes/class.ilUtil.php";
646 $spl_data_dir = ilUtil::getDataDir()."/spl_data";
647 ilUtil::makeDir($spl_data_dir);
648
649 if(!is_writable($spl_data_dir))
650 {
651 $this->ilias->raiseError("Survey Questionpool Data Directory (".$spl_data_dir
652 .") not writeable.",$this->ilias->error_obj->FATAL);
653 }
654
655 // create test directory (data_dir/spl_data/spl_<id>)
656 $spl_dir = $spl_data_dir."/spl_".$this->getId();
657 ilUtil::makeDir($spl_dir);
658 if(!@is_dir($spl_dir))
659 {
660 $this->ilias->raiseError("Creation of Survey Questionpool Directory failed.",$this->ilias->error_obj->FATAL);
661 }
662
663 // create import subdirectory (data_dir/spl_data/spl_<id>/import)
664 $import_dir = $spl_dir."/import";
665 ilUtil::makeDir($import_dir);
666 if(!@is_dir($import_dir))
667 {
668 $this->ilias->raiseError("Creation of Import Directory failed.",$this->ilias->error_obj->FATAL);
669 }
670 }
671
676 {
677 include_once "./Services/Utilities/classes/class.ilUtil.php";
678 $import_dir = ilUtil::getDataDir()."/spl_data".
679 "/spl_".$this->getId()."/import";
680 if(@is_dir($import_dir))
681 {
682 return $import_dir;
683 }
684 else
685 {
686 return false;
687 }
688 }
689
693 function toXML($questions)
694 {
695 if (!is_array($questions))
696 {
697 $questions =& $this->getQuestions();
698 }
699 if (count($questions) == 0)
700 {
701 $questions =& $this->getQuestions();
702 }
703 $xml = "";
704
705 include_once("./Services/Xml/classes/class.ilXmlWriter.php");
706 $a_xml_writer = new ilXmlWriter;
707 // set xml header
708 $a_xml_writer->xmlHeader();
709 $attrs = array(
710 "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
711 "xsi:noNamespaceSchemaLocation" => "http://www.ilias.de/download/xsd/ilias_survey_4_2.xsd"
712 );
713 $a_xml_writer->xmlStartTag("surveyobject", $attrs);
714 $attrs = array(
715 "id" => "qpl_" . $this->getId(),
716 "label" => $this->getTitle(),
717 "online" => $this->getOnline()
718 );
719 $a_xml_writer->xmlStartTag("surveyquestions", $attrs);
720 $a_xml_writer->xmlElement("dummy", NULL, "dummy");
721 // add ILIAS specific metadata
722 $a_xml_writer->xmlStartTag("metadata");
723 $a_xml_writer->xmlStartTag("metadatafield");
724 $a_xml_writer->xmlElement("fieldlabel", NULL, "SCORM");
725 include_once "./Services/MetaData/classes/class.ilMD.php";
726 $md = new ilMD($this->getId(),0, $this->getType());
727 $writer = new ilXmlWriter();
728 $md->toXml($writer);
729 $metadata = $writer->xmlDumpMem();
730 $a_xml_writer->xmlElement("fieldentry", NULL, $metadata);
731 $a_xml_writer->xmlEndTag("metadatafield");
732 $a_xml_writer->xmlEndTag("metadata");
733
734 $a_xml_writer->xmlEndTag("surveyquestions");
735 $a_xml_writer->xmlEndTag("surveyobject");
736
737 $xml = $a_xml_writer->xmlDumpMem(FALSE);
738
739 $questionxml = "";
740 foreach ($questions as $key => $value)
741 {
742 $questiontype = $this->getQuestiontype($value);
743 include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
744 SurveyQuestion::_includeClass($questiontype);
745 $question = new $questiontype();
746 $question->loadFromDb($value);
747 $questionxml .= $question->toXML(false);
748 }
749
750 $xml = str_replace("<dummy>dummy</dummy>", $questionxml, $xml);
751 return $xml;
752 }
753
754 function &getQuestions()
755 {
756 global $ilDB;
757 $questions = array();
758 $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE obj_fi = %s AND svy_question.tstamp > 0 AND original_id IS NULL",
759 array('integer'),
760 array($this->getId())
761 );
762 if ($result->numRows())
763 {
764 while ($row = $ilDB->fetchAssoc($result))
765 {
766 array_push($questions, $row["question_id"]);
767 }
768 }
769 return $questions;
770 }
771
778 function importObject($source, $spl_exists = FALSE)
779 {
780 if (is_file($source))
781 {
782 $isZip = (strcmp(strtolower(substr($source, -3)), 'zip') == 0);
783 if ($isZip)
784 {
785 // unzip file
786 ilUtil::unzip($source);
787
788 // determine filenames of xml files
789 $subdir = basename($source, ".zip");
790 $source = dirname($source)."/".$subdir."/".$subdir.".xml";
791 }
792
793 $fh = fopen($source, "r") or die("");
794 $xml = fread($fh, filesize($source));
795 fclose($fh) or die("");
796 if ($isZip)
797 {
798 $subdir = basename($source, ".zip");
799 if (@is_dir(dirname($source)."/".$subdir))
800 {
801 ilUtil::delDir(dirname($source)."/".$subdir);
802 }
803 }
804 if (strpos($xml, "questestinterop") > 0)
805 {
806 include_once("./Modules/Survey/exceptions/class.ilInvalidSurveyImportFileException.php");
807 throw new ilInvalidSurveyImportFileException("Unsupported survey version (< 3.8) found.");
808
809 // survey questions for ILIAS < 3.8
810 /*
811 include_once "./Services/Survey/classes/class.SurveyImportParserPre38.php";
812 $import = new SurveyImportParserPre38($this->getId(), "", $spl_exists);
813 $import->setXMLContent($xml);
814 $import->startParsing();*/
815 }
816 else
817 {
818 // survey questions for ILIAS >= 3.8
819 include_once "./Services/Survey/classes/class.SurveyImportParser.php";
820 $import = new SurveyImportParser($this->getId(), "", $spl_exists);
821 $import->setXMLContent($xml);
822 $import->startParsing();
823 }
824 }
825 }
826
827 public static function _setOnline($a_obj_id, $a_online_status)
828 {
829 global $ilDB;
830
831 $status = "0";
832 switch ($a_online_status)
833 {
834 case 0:
835 case 1:
836 $status = "$a_online_status";
837 break;
838 }
839 $affectedRows = $ilDB->manipulateF("UPDATE svy_qpl SET isonline = %s WHERE obj_fi = %s",
840 array('text','integer'),
841 array($status, $a_obj_id)
842 );
843 }
844
852 function setOnline($a_online_status)
853 {
854 switch ($a_online_status)
855 {
856 case 0:
857 case 1:
858 $this->online = $a_online_status;
859 break;
860 default:
861 $this->online = 0;
862 break;
863 }
864 }
865
866 function getOnline()
867 {
868 if (strcmp($this->online, "") == 0) $this->online = "0";
869 return $this->online;
870 }
871
872 function _lookupOnline($a_obj_id)
873 {
874 global $ilDB;
875
876 $result = $ilDB->queryF("SELECT isonline FROM svy_qpl WHERE obj_fi = %s",
877 array('integer'),
878 array($a_obj_id)
879 );
880 if ($result->numRows() == 1)
881 {
882 $row = $ilDB->fetchAssoc($result);
883 return $row["isonline"];
884 }
885 return 0;
886 }
887
895 function _isWriteable($object_id, $user_id)
896 {
897 global $rbacsystem;
898 global $ilDB;
899
900 $refs = ilObject::_getAllReferences($object_id);
901 $result = false;
902 foreach ($refs as $ref)
903 {
904 if ($rbacsystem->checkAccess("write", $ref) && (ilObject::_hasUntrashedReference($object_id)))
905 {
906 $result = true;
907 }
908 }
909 return $result;
910 }
911
919 {
920 global $ilDB;
921 global $lng;
922
923 $lng->loadLanguageModule("survey");
924 $types = array();
925 $query_result = $ilDB->query("SELECT * FROM svy_qtype ORDER BY type_tag");
926 while ($row = $ilDB->fetchAssoc($query_result))
927 {
928 //array_push($questiontypes, $row["type_tag"]);
929 if ($row["plugin"] == 0)
930 {
931 $types[$lng->txt($row["type_tag"])] = $row;
932 }
933 else
934 {
935 global $ilPluginAdmin;
936 $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
937 foreach ($pl_names as $pl_name)
938 {
939 $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
940 if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0)
941 {
942 $types[$pl->getQuestionTypeTranslation()] = $row;
943 }
944 }
945 }
946 }
947 ksort($types);
948
949
950 // #14263 - default sorting
951
952 $default_sorting = array_flip(array(
953 "SurveySingleChoiceQuestion",
954 "SurveyMultipleChoiceQuestion",
955 "SurveyMatrixQuestion",
956 "SurveyMetricQuestion",
957 "SurveyTextQuestion"
958 ));
959
960 $sorted = array();
961 $idx = sizeof($default_sorting);
962 foreach($types as $caption => $item)
963 {
964 $type = $item["type_tag"];
965 $item["caption"] = $caption;
966
967 // default
968 if(array_key_exists($type, $default_sorting))
969 {
970 $sorted[$default_sorting[$type]] = $item;
971 }
972 // plugin (append alphabetically sorted)
973 else
974 {
975 $sorted[$idx] = $item;
976 $idx++;
977 }
978 }
979 ksort($sorted);
980
981 // redo captions as index
982 $types = array();
983 foreach($sorted as $item)
984 {
985 $types[$item["caption"]] = $item;
986 }
987
988 return $types;
989 }
990
991 public static function &_getQuestionTypeTranslations()
992 {
993 global $ilDB;
994 global $lng;
995 global $ilLog;
996 global $ilPluginAdmin;
997
998 $lng->loadLanguageModule("survey");
999 $result = $ilDB->query("SELECT * FROM svy_qtype");
1000 $types = array();
1001 while ($row = $ilDB->fetchAssoc($result))
1002 {
1003 if ($row["plugin"] == 0)
1004 {
1005 $types[$row['type_tag']] = $lng->txt($row["type_tag"]);
1006 }
1007 else
1008 {
1009 $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
1010 foreach ($pl_names as $pl_name)
1011 {
1012 $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
1013 if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0)
1014 {
1015 $types[$row['type_tag']] = $pl->getQuestionTypeTranslation();
1016 }
1017 }
1018 }
1019 }
1020 ksort($types);
1021 return $types;
1022 }
1023
1030 function _getAvailableQuestionpools($use_object_id = FALSE, $could_be_offline = FALSE, $showPath = FALSE, $permission = "read")
1031 {
1032 global $ilUser;
1033 global $ilDB;
1034
1035 $result_array = array();
1036 $qpls = ilUtil::_getObjectsByOperations("spl", $permission, $ilUser->getId(), -1);
1037 $titles = ilObject::_prepareCloneSelection($qpls, "spl", $showPath);
1038 $allqpls = array();
1039 $result = $ilDB->query("SELECT obj_fi, isonline FROM svy_qpl");
1040 while ($row = $ilDB->fetchAssoc($result))
1041 {
1042 $allqpls[$row['obj_fi']] = $row['isonline'];
1043 }
1044 foreach ($qpls as $ref_id)
1045 {
1047 if ($could_be_offline || $allqpls[$obj_id] == 1)
1048 {
1049 if ($use_object_id)
1050 {
1051 $result_array[$obj_id] = $titles[$ref_id];
1052 }
1053 else
1054 {
1055 $result_array[$ref_id] = $titles[$ref_id];
1056 }
1057 }
1058 }
1059 return $result_array;
1060 }
1061
1068 function isPluginActive($a_pname)
1069 {
1070 global $ilPluginAdmin;
1071 if ($ilPluginAdmin->isActive(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $a_pname))
1072 {
1073 return TRUE;
1074 }
1075 else
1076 {
1077 return FALSE;
1078 }
1079 }
1080
1087 public function getQuestionInfos($question_ids)
1088 {
1089 global $ilDB;
1090
1091 $found = array();
1092 $query_result = $ilDB->query("SELECT svy_question.*, svy_qtype.type_tag FROM svy_question, svy_qtype " .
1093 "WHERE svy_question.questiontype_fi = svy_qtype.questiontype_id " .
1094 "AND svy_question.tstamp > 0 AND " . $ilDB->in('svy_question.question_id', $question_ids, false, 'integer') . " " .
1095 "ORDER BY svy_question.title");
1096 if ($query_result->numRows() > 0)
1097 {
1098 while ($data = $ilDB->fetchAssoc($query_result))
1099 {
1100 if (in_array($data["question_id"], $question_ids))
1101 {
1102 array_push($found, array('id' => $data["question_id"],
1103 'title' => $data["title"],
1104 'description' => $data["description"],
1105 'type_tag' => $data["type_tag"]));
1106 }
1107 }
1108 }
1109 return $found;
1110 }
1111
1112 /*
1113 * Remove all questions with tstamp = 0
1114 */
1115 public function purgeQuestions()
1116 {
1117 global $ilDB, $ilUser;
1118
1119 $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE owner_fi = %s AND tstamp = %s",
1120 array("integer", "integer"),
1121 array($ilUser->getId(), 0)
1122 );
1123 while ($data = $ilDB->fetchAssoc($result))
1124 {
1125 $this->removeQuestion($data["question_id"]);
1126 }
1127 }
1128
1134 public function copyToClipboard($question_id)
1135 {
1136 if (!array_key_exists("spl_clipboard", $_SESSION))
1137 {
1138 $_SESSION["spl_clipboard"] = array();
1139 }
1140 $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "copy");
1141 }
1142
1148 public function moveToClipboard($question_id)
1149 {
1150 if (!array_key_exists("spl_clipboard", $_SESSION))
1151 {
1152 $_SESSION["spl_clipboard"] = array();
1153 }
1154 $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "move");
1155 }
1156
1160 public function pasteFromClipboard()
1161 {
1162 global $ilDB;
1163
1164 if (array_key_exists("spl_clipboard", $_SESSION))
1165 {
1166 foreach ($_SESSION["spl_clipboard"] as $question_object)
1167 {
1168 if (strcmp($question_object["action"], "move") == 0)
1169 {
1170 $result = $ilDB->queryF("SELECT obj_fi FROM svy_question WHERE question_id = %s",
1171 array('integer'),
1172 array($question_object["question_id"])
1173 );
1174 if ($result->numRows() == 1)
1175 {
1176 $row = $ilDB->fetchAssoc($result);
1177 $source_questionpool = $row["obj_fi"];
1178 if ($this->getId() != $source_questionpool)
1179 {
1180 // change the questionpool id in the qpl_questions table
1181 $affectedRows = $ilDB->manipulateF("UPDATE svy_question SET obj_fi = %s WHERE question_id = %s",
1182 array('integer','integer'),
1183 array($this->getId(), $question_object["question_id"])
1184 );
1185
1186 // move question data to the new target directory
1187 $source_path = CLIENT_WEB_DIR . "/survey/" . $source_questionpool . "/" . $question_object["question_id"] . "/";
1188 if (@is_dir($source_path))
1189 {
1190 $target_path = CLIENT_WEB_DIR . "/survey/" . $this->getId() . "/";
1191 if (!@is_dir($target_path))
1192 {
1193 include_once "./Services/Utilities/classes/class.ilUtil.php";
1194 ilUtil::makeDirParents($target_path);
1195 }
1196 @rename($source_path, $target_path . $question_object["question_id"]);
1197 }
1198 }
1199 else
1200 {
1201 ilUtil::sendFailure($this->lng->txt("spl_move_same_pool"), true);
1202 return;
1203 }
1204 }
1205 }
1206 else
1207 {
1208 $this->copyQuestion($question_object["question_id"], $this->getId());
1209 }
1210 }
1211 }
1212 ilUtil::sendSuccess($this->lng->txt("spl_paste_success"), true);
1213 unset($_SESSION["spl_clipboard"]);
1214 }
1215
1222 function setObligatoryStates($obligatory_questions)
1223 {
1224 global $ilDB;
1225
1226 foreach($this->getQuestions() as $question_id)
1227 {
1228 $status = (int)(in_array($question_id, $obligatory_questions));
1229
1230 $ilDB->manipulate("UPDATE svy_question".
1231 " SET obligatory = ".$ilDB->quote($status, "integer").
1232 " WHERE question_id = ".$ilDB->quote($question_id, "integer"));
1233 }
1234 }
1235} // END class.ilSurveyObjQuestionPool
1236?>
$result
print $file
$_GET["client_id"]
$_SESSION["AccountId"]
Survey Question Import Parser.
& _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.
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.
cloneObject($a_target_id, $a_copy_id=0)
Creates a 1:1 copy of the object and places the copy in a given repository.
importObject($source, $spl_exists=FALSE)
Imports survey questions into ILIAS.
getQuestionInfos($question_ids)
Returns title, description and type for an array of question id's.
ilObjSurveyQuestionPool($a_id=0, $a_call_by_reference=true)
Constructor @access public.
paste($question_id)
Pastes a question in the question pool.
copyToClipboard($question_id)
Copies a question to the clipboard.
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.
notify($a_event, $a_ref_id, $a_parent_non_rbac_id, $a_node_id, $a_params=0)
notifys an object about an event occured Based on the event happend, each object may decide how it re...
& _getQuestiontypes()
Creates a list of all available question types.
_getAvailableQuestionpools($use_object_id=FALSE, $could_be_offline=FALSE, $showPath=FALSE, $permission="read")
Returns the available question pools for the active user.
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.
pasteFromClipboard()
Copies/Moves a question from the clipboard.
& createQuestion($question_type, $question_id=-1)
toXML($questions)
export questions to xml
_isWriteable($object_id, $user_id)
Returns true, if the question pool is writeable by a given user.
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.
read($a_force_db=false)
read object data from db into object
isInUse($question_id)
Checks if a question is in use by a survey.
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
ilObject($a_id=0, $a_reference=true)
Constructor @access public.
deleteMetaData()
delete meta data entry
updateMetaData()
update meta data entry
_hasUntrashedReference($a_obj_id)
checks wether an object has at least one reference that is not in trash
createMetaData()
create meta data entry
static _getAllReferences($a_id)
get all reference ids of object
getId()
get object id @access public
static _prepareCloneSelection($a_ref_ids, $new_type, $show_path=true)
Prepare copy wizard object selection.
getTitle()
get object title @access public
static getPluginObject($a_ctype, $a_cname, $a_slot_id, $a_pname)
Get plugin object.
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 sendSuccess($a_info="", $a_keep=false)
Send Success Message to Screen.
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($a_file, $overwrite=false, $a_flat=false)
unzip file
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.
$data
redirection script todo: (a better solution should control the processing via a xml file)
global $ilDB
global $ilUser
Definition: imgupload.php:15