ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
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 
34 include_once "./Services/Object/classes/class.ilObject.php";
35 
37 {
43  var $online;
44 
51  function __construct($a_id = 0,$a_call_by_reference = true)
52  {
53  $this->type = "spl";
54  parent::__construct($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 
92  public function read()
93  {
94  parent::read();
95  $this->loadFromDb();
96  }
97 
103  function cloneObject($a_target_id,$a_copy_id = 0, $a_omit_tree = false)
104  {
105  global $ilLog;
106  $newObj = parent::cloneObject($a_target_id,$a_copy_id, $a_omit_tree);
107 
108  //copy online status if object is not the root copy object
109  $cp_options = ilCopyWizardOptions::_getInstance($a_copy_id);
110 
111  if(!$cp_options->isRootNode($this->getRefId()))
112  {
113  $newObj->setOnline($this->getOnline());
114  }
115 
116  $newObj->saveToDb();
117  // clone the questions in the question pool
118  $questions =& $this->getQuestions();
119  foreach ($questions as $question_id)
120  {
121  $newObj->copyQuestion($question_id, $newObj->getId());
122  }
123 
124  // clone meta data
125  include_once "./Services/MetaData/classes/class.ilMD.php";
126  $md = new ilMD($this->getId(),0,$this->getType());
127  $new_md =& $md->cloneMD($newObj->getId(),0,$newObj->getType());
128 
129  // update the metadata with the new title of the question pool
130  $newObj->updateMetaData();
131  return $newObj;
132  }
133 
134  function &createQuestion($question_type, $question_id = -1)
135  {
136  if ((!$question_type) and ($question_id > 0))
137  {
138  $question_type = $this->getQuestiontype($question_id);
139  }
140 
141  include_once "./Modules/SurveyQuestionPool/classes/class.".$question_type."GUI.php";
142  $question_type_gui = $question_type . "GUI";
143  $question = new $question_type_gui();
144 
145  if ($question_id > 0)
146  {
147  $question->object->loadFromDb($question_id);
148  }
149 
150  return $question;
151  }
152 
160  function copyQuestion($question_id, $questionpool_to)
161  {
162  $question_gui =& $this->createQuestion("", $question_id);
163  if ($question_gui->object->getObjId() == $questionpool_to)
164  {
165  // the question is copied into the same question pool
166  $this->duplicateQuestion($question_id);
167  }
168  else
169  {
170  // the question is copied into another question pool
171  $newtitle = $question_gui->object->getTitle();
172  if ($question_gui->object->questionTitleExists($question_gui->object->getTitle(), $questionpool_to))
173  {
174  $counter = 2;
175  while ($question_gui->object->questionTitleExists($question_gui->object->getTitle() . " ($counter)", $questionpool_to))
176  {
177  $counter++;
178  }
179  $newtitle = $question_gui->object->getTitle() . " ($counter)";
180  }
181  $question_gui->object->copyObject($this->getId(), $newtitle);
182  }
183  }
184 
190  function loadFromDb()
191  {
192  global $ilDB;
193 
194  $result = $ilDB->queryF("SELECT * FROM svy_qpl WHERE obj_fi = %s",
195  array('integer'),
196  array($this->getId())
197  );
198  if ($result->numRows() == 1)
199  {
200  $row = $ilDB->fetchAssoc($result);
201  $this->setOnline($row["isonline"]);
202  }
203  }
204 
210  function saveToDb()
211  {
212  global $ilDB;
213 
214  parent::update();
215 
216  $result = $ilDB->queryF("SELECT * FROM svy_qpl WHERE obj_fi = %s",
217  array('integer'),
218  array($this->getId())
219  );
220  if ($result->numRows() == 1)
221  {
222  $affectedRows = $ilDB->manipulateF("UPDATE svy_qpl SET isonline = %s, tstamp = %s WHERE obj_fi = %s",
223  array('text','integer','integer'),
224  array($this->getOnline(), time(), $this->getId())
225  );
226  }
227  else
228  {
229  $next_id = $ilDB->nextId('svy_qpl');
230  $query = $ilDB->manipulateF("INSERT INTO svy_qpl (id_questionpool, isonline, obj_fi, tstamp) VALUES (%s, %s, %s, %s)",
231  array('integer', 'text', 'integer', 'integer'),
232  array($next_id, $this->getOnline(), $this->getId(), time())
233  );
234  }
235  }
236 
243  function delete()
244  {
245  $remove = parent::delete();
246  // always call parent delete function first!!
247  if (!$remove)
248  {
249  return false;
250  }
251 
252  // delete all related questions
253  $this->deleteAllData();
254 
255  // delete meta data
256  $this->deleteMetaData();
257 
258  return true;
259  }
260 
261  function deleteAllData()
262  {
263  global $ilDB;
264  $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE obj_fi = %s AND original_id IS NULL",
265  array('integer'),
266  array($this->getId())
267  );
268  $found_questions = array();
269  while ($row = $ilDB->fetchAssoc($result))
270  {
271  $this->removeQuestion($row["question_id"]);
272  }
273 
274  // delete export files
275  $spl_data_dir = ilUtil::getDataDir()."/spl_data";
276  $directory = $spl_data_dir."/spl_".$this->getId();
277  if (is_dir($directory))
278  {
279  ilUtil::delDir($directory);
280  }
281  }
282 
289  function removeQuestion($question_id)
290  {
291  if ($question_id < 1) return;
292  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
293  $question =& SurveyQuestion::_instanciateQuestion($question_id);
294  $question->delete($question_id);
295  }
296 
304  function getQuestiontype($question_id)
305  {
306  global $ilDB;
307  if ($question_id < 1) return;
308  $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",
309  array('integer'),
310  array($question_id)
311  );
312  if ($result->numRows() == 1)
313  {
314  $data = $ilDB->fetchAssoc($result);
315  return $data["type_tag"];
316  }
317  else
318  {
319  return;
320  }
321  }
322 
330  function isInUse($question_id)
331  {
332  global $ilDB;
333  // check out the already answered questions
334  $result = $ilDB->queryF("SELECT answer_id FROM svy_answer WHERE question_fi = %s",
335  array('integer'),
336  array($question_id)
337  );
338  $answered = $result->numRows();
339 
340  // check out the questions inserted in surveys
341  $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",
342  array('integer'),
343  array($question_id)
344  );
345  $inserted = $result->numRows();
346  if (($inserted + $answered) == 0)
347  {
348  return false;
349  }
350  $result_array = array();
351  while ($row = $ilDB->fetchObject($result))
352  {
353  array_push($result_array, $row);
354  }
355  return $result_array;
356  }
357 
364  function paste($question_id)
365  {
366  $this->duplicateQuestion($question_id, $this->getId());
367  }
368 
376  function &getQuestionsInfo($question_array)
377  {
378  global $ilDB;
379  $result_array = array();
380  $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'));
381  while ($row = $ilDB->fetchAssoc($result))
382  {
383  if ($row["plugin"])
384  {
385  if ($this->isPluginActive($row["type_tag"]))
386  {
387  array_push($result_array, $row);
388  }
389  }
390  else
391  {
392  array_push($result_array, $row);
393  }
394  }
395  return $result_array;
396  }
397 
404  function duplicateQuestion($question_id, $obj_id = "")
405  {
406  global $ilUser;
407  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
408  $question = SurveyQuestion::_instanciateQuestion($question_id);
409  $suffix = "";
410  $counter = 1;
411  while ($question->questionTitleExists($question->getTitle().$suffix, $obj_id))
412  {
413  $counter++;
414  if ($counter > 1) $suffix = " ($counter)";
415  }
416  if ($obj_id)
417  {
418  $question->setObjId($obj_id);
419  }
420  $question->duplicate(false, $question->getTitle() . $suffix, $ilUser->fullname, $ilUser->id);
421  }
422 
428  function getQuestionsData($arrFilter)
429  {
430  global $ilUser;
431  global $ilDB;
432  $where = "";
433  if (is_array($arrFilter))
434  {
435  foreach ($arrFilter as $key => $value)
436  {
437  $arrFilter[$key] = str_replace('%', '', $arrFilter[$key]);
438  }
439  if (array_key_exists('title', $arrFilter) && strlen($arrFilter['title']))
440  {
441  $where .= " AND " . $ilDB->like('svy_question.title', 'text', "%%" . $arrFilter['title'] . "%%");
442  }
443  if (array_key_exists('description', $arrFilter) && strlen($arrFilter['description']))
444  {
445  $where .= " AND " . $ilDB->like('svy_question.description', 'text', "%%" . $arrFilter['description'] . "%%");
446  }
447  if (array_key_exists('author', $arrFilter) && strlen($arrFilter['author']))
448  {
449  $where .= " AND " . $ilDB->like('svy_question.author', 'text', "%%" . $arrFilter['author'] . "%%");
450  }
451  if (array_key_exists('type', $arrFilter) && strlen($arrFilter['type']))
452  {
453  $where .= " AND svy_qtype.type_tag = " . $ilDB->quote($arrFilter['type'], 'text');
454  }
455  }
456  $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,
457  array('integer'),
458  array($this->getId())
459  );
460  $rows = array();
461  if ($query_result->numRows())
462  {
463  while ($row = $ilDB->fetchAssoc($query_result))
464  {
465  if ($row["plugin"])
466  {
467  if ($this->isPluginActive($row["type_tag"]))
468  {
469  array_push($rows, $row);
470  }
471  }
472  else
473  {
474  array_push($rows, $row);
475  }
476  }
477  }
478  return $rows;
479  }
480 
489  {
490  $spl_data_dir = ilUtil::getDataDir()."/spl_data";
491  ilUtil::makeDir($spl_data_dir);
492  if(!is_writable($spl_data_dir))
493  {
494  include_once "Modules/Survey/exceptions/class.ilSurveyException.php";
495  throw new ilSurveyException("Survey Questionpool Data Directory (".$spl_data_dir.") not writeable.");
496  }
497 
498  // create learning module directory (data_dir/lm_data/lm_<id>)
499  $spl_dir = $spl_data_dir."/spl_".$this->getId();
500  ilUtil::makeDir($spl_dir);
501  if(!@is_dir($spl_dir))
502  {
503  include_once "Modules/Survey/exceptions/class.ilSurveyException.php";
504  throw new ilSurveyException("Creation of Survey Questionpool Directory failed.");
505  }
506  // create Export subdirectory (data_dir/lm_data/lm_<id>/Export)
507  $export_dir = $spl_dir."/export";
508  ilUtil::makeDir($export_dir);
509  if(!@is_dir($export_dir))
510  {
511  include_once "Modules/Survey/exceptions/class.ilSurveyException.php";
512  throw new ilSurveyException("Creation of Survey Questionpool Export Directory failed.");
513  }
514  }
515 
520  {
521  $export_dir = ilUtil::getDataDir()."/spl_data"."/spl_".$this->getId()."/export";
522  return $export_dir;
523  }
524 
528  function getExportFiles($dir)
529  {
530  // quit if import dir not available
531  if (!@is_dir($dir) or
532  !is_writeable($dir))
533  {
534  return array();
535  }
536 
537  // open directory
538  $dir = dir($dir);
539 
540  // initialize array
541  $file = array();
542 
543  // get files and save the in the array
544  while ($entry = $dir->read())
545  {
546  if ($entry != "." &&
547  $entry != ".." &&
548  preg_match("/^[0-9]{10}__[0-9]+__(spl_)*[0-9]+\.[A-Za-z]{3}$/", $entry))
549  {
550  $file[] = $entry;
551  }
552  }
553 
554  // close import directory
555  $dir->close();
556  // sort files
557  sort ($file);
558  reset ($file);
559 
560  return $file;
561  }
562 
571  {
572  $spl_data_dir = ilUtil::getDataDir()."/spl_data";
573  ilUtil::makeDir($spl_data_dir);
574 
575  if(!is_writable($spl_data_dir))
576  {
577  include_once "Modules/Survey/exceptions/class.ilSurveyException.php";
578  throw new ilSurveyException("Survey Questionpool Data Directory (".$spl_data_dir.") not writeable.");
579  }
580 
581  // create test directory (data_dir/spl_data/spl_<id>)
582  $spl_dir = $spl_data_dir."/spl_".$this->getId();
583  ilUtil::makeDir($spl_dir);
584  if(!@is_dir($spl_dir))
585  {
586  include_once "Modules/Survey/exceptions/class.ilSurveyException.php";
587  throw new ilSurveyException("Creation of Survey Questionpool Directory failed.");
588  }
589 
590  // create import subdirectory (data_dir/spl_data/spl_<id>/import)
591  $import_dir = $spl_dir."/import";
592  ilUtil::makeDir($import_dir);
593  if(!@is_dir($import_dir))
594  {
595  include_once "Modules/Survey/exceptions/class.ilSurveyException.php";
596  throw new ilSurveyException("Creation of Survey Questionpool Import Directory failed.");
597  }
598  }
599 
604  {
605  $import_dir = ilUtil::getDataDir()."/spl_data".
606  "/spl_".$this->getId()."/import";
607  if(@is_dir($import_dir))
608  {
609  return $import_dir;
610  }
611  else
612  {
613  return false;
614  }
615  }
616 
620  function toXML($questions)
621  {
622  if (!is_array($questions))
623  {
624  $questions =& $this->getQuestions();
625  }
626  if (count($questions) == 0)
627  {
628  $questions =& $this->getQuestions();
629  }
630  $xml = "";
631 
632  include_once("./Services/Xml/classes/class.ilXmlWriter.php");
633  $a_xml_writer = new ilXmlWriter;
634  // set xml header
635  $a_xml_writer->xmlHeader();
636  $attrs = array(
637  "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
638  "xsi:noNamespaceSchemaLocation" => "http://www.ilias.de/download/xsd/ilias_survey_4_2.xsd"
639  );
640  $a_xml_writer->xmlStartTag("surveyobject", $attrs);
641  $attrs = array(
642  "id" => "qpl_" . $this->getId(),
643  "label" => $this->getTitle(),
644  "online" => $this->getOnline()
645  );
646  $a_xml_writer->xmlStartTag("surveyquestions", $attrs);
647  $a_xml_writer->xmlElement("dummy", NULL, "dummy");
648  // add ILIAS specific metadata
649  $a_xml_writer->xmlStartTag("metadata");
650  $a_xml_writer->xmlStartTag("metadatafield");
651  $a_xml_writer->xmlElement("fieldlabel", NULL, "SCORM");
652  include_once "./Services/MetaData/classes/class.ilMD.php";
653  $md = new ilMD($this->getId(),0, $this->getType());
654  $writer = new ilXmlWriter();
655  $md->toXml($writer);
656  $metadata = $writer->xmlDumpMem();
657  $a_xml_writer->xmlElement("fieldentry", NULL, $metadata);
658  $a_xml_writer->xmlEndTag("metadatafield");
659  $a_xml_writer->xmlEndTag("metadata");
660 
661  $a_xml_writer->xmlEndTag("surveyquestions");
662  $a_xml_writer->xmlEndTag("surveyobject");
663 
664  $xml = $a_xml_writer->xmlDumpMem(FALSE);
665 
666  $questionxml = "";
667  foreach ($questions as $key => $value)
668  {
669  $questiontype = $this->getQuestiontype($value);
670  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
671  SurveyQuestion::_includeClass($questiontype);
672  $question = new $questiontype();
673  $question->loadFromDb($value);
674  $questionxml .= $question->toXML(false);
675  }
676 
677  $xml = str_replace("<dummy>dummy</dummy>", $questionxml, $xml);
678  return $xml;
679  }
680 
681  function &getQuestions()
682  {
683  global $ilDB;
684  $questions = array();
685  $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE obj_fi = %s AND svy_question.tstamp > 0 AND original_id IS NULL",
686  array('integer'),
687  array($this->getId())
688  );
689  if ($result->numRows())
690  {
691  while ($row = $ilDB->fetchAssoc($result))
692  {
693  array_push($questions, $row["question_id"]);
694  }
695  }
696  return $questions;
697  }
698 
705  function importObject($source, $spl_exists = FALSE)
706  {
707  if (is_file($source))
708  {
709  $isZip = (strcmp(strtolower(substr($source, -3)), 'zip') == 0);
710  if ($isZip)
711  {
712  // unzip file
713  ilUtil::unzip($source);
714 
715  // determine filenames of xml files
716  $subdir = basename($source, ".zip");
717  $source = dirname($source)."/".$subdir."/".$subdir.".xml";
718  }
719 
720  $fh = fopen($source, "r") or die("");
721  $xml = fread($fh, filesize($source));
722  fclose($fh) or die("");
723  if ($isZip)
724  {
725  $subdir = basename($source, ".zip");
726  if (@is_dir(dirname($source)."/".$subdir))
727  {
728  ilUtil::delDir(dirname($source)."/".$subdir);
729  }
730  }
731  if (strpos($xml, "questestinterop") > 0)
732  {
733  include_once("./Modules/Survey/exceptions/class.ilInvalidSurveyImportFileException.php");
734  throw new ilInvalidSurveyImportFileException("Unsupported survey version (< 3.8) found.");
735 
736  // survey questions for ILIAS < 3.8
737  /*
738  include_once "./Services/Survey/classes/class.SurveyImportParserPre38.php";
739  $import = new SurveyImportParserPre38($this->getId(), "", $spl_exists);
740  $import->setXMLContent($xml);
741  $import->startParsing();*/
742  }
743  else
744  {
745  // survey questions for ILIAS >= 3.8
746  include_once "./Services/Survey/classes/class.SurveyImportParser.php";
747  $import = new SurveyImportParser($this->getId(), "", $spl_exists);
748  $import->setXMLContent($xml);
749  $import->startParsing();
750  }
751  }
752  }
753 
754  public static function _setOnline($a_obj_id, $a_online_status)
755  {
756  global $ilDB;
757 
758  $status = "0";
759  switch ($a_online_status)
760  {
761  case 0:
762  case 1:
763  $status = "$a_online_status";
764  break;
765  }
766  $affectedRows = $ilDB->manipulateF("UPDATE svy_qpl SET isonline = %s WHERE obj_fi = %s",
767  array('text','integer'),
768  array($status, $a_obj_id)
769  );
770  }
771 
779  function setOnline($a_online_status)
780  {
781  switch ($a_online_status)
782  {
783  case 0:
784  case 1:
785  $this->online = $a_online_status;
786  break;
787  default:
788  $this->online = 0;
789  break;
790  }
791  }
792 
793  function getOnline()
794  {
795  if (strcmp($this->online, "") == 0) $this->online = "0";
796  return $this->online;
797  }
798 
799  static function _lookupOnline($a_obj_id)
800  {
801  global $ilDB;
802 
803  $result = $ilDB->queryF("SELECT isonline FROM svy_qpl WHERE obj_fi = %s",
804  array('integer'),
805  array($a_obj_id)
806  );
807  if ($result->numRows() == 1)
808  {
809  $row = $ilDB->fetchAssoc($result);
810  return $row["isonline"];
811  }
812  return 0;
813  }
814 
822  static function _isWriteable($object_id, $user_id)
823  {
824  global $rbacsystem;
825  global $ilDB;
826 
827  $refs = ilObject::_getAllReferences($object_id);
828  $result = false;
829  foreach ($refs as $ref)
830  {
831  if ($rbacsystem->checkAccess("write", $ref) && (ilObject::_hasUntrashedReference($object_id)))
832  {
833  $result = true;
834  }
835  }
836  return $result;
837  }
838 
845  static function _getQuestiontypes()
846  {
847  global $ilDB;
848  global $lng;
849 
850  $lng->loadLanguageModule("survey");
851  $types = array();
852  $query_result = $ilDB->query("SELECT * FROM svy_qtype ORDER BY type_tag");
853  while ($row = $ilDB->fetchAssoc($query_result))
854  {
855  //array_push($questiontypes, $row["type_tag"]);
856  if ($row["plugin"] == 0)
857  {
858  $types[$lng->txt($row["type_tag"])] = $row;
859  }
860  else
861  {
862  global $ilPluginAdmin;
863  $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
864  foreach ($pl_names as $pl_name)
865  {
866  $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
867  if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0)
868  {
869  $types[$pl->getQuestionTypeTranslation()] = $row;
870  }
871  }
872  }
873  }
874  ksort($types);
875 
876 
877  // #14263 - default sorting
878 
879  $default_sorting = array_flip(array(
880  "SurveySingleChoiceQuestion",
881  "SurveyMultipleChoiceQuestion",
882  "SurveyMatrixQuestion",
883  "SurveyMetricQuestion",
884  "SurveyTextQuestion"
885  ));
886 
887  $sorted = array();
888  $idx = sizeof($default_sorting);
889  foreach($types as $caption => $item)
890  {
891  $type = $item["type_tag"];
892  $item["caption"] = $caption;
893 
894  // default
895  if(array_key_exists($type, $default_sorting))
896  {
897  $sorted[$default_sorting[$type]] = $item;
898  }
899  // plugin (append alphabetically sorted)
900  else
901  {
902  $sorted[$idx] = $item;
903  $idx++;
904  }
905  }
906  ksort($sorted);
907 
908  // redo captions as index
909  $types = array();
910  foreach($sorted as $item)
911  {
912  $types[$item["caption"]] = $item;
913  }
914 
915  return $types;
916  }
917 
918  public static function _getQuestionTypeTranslations()
919  {
920  global $ilDB;
921  global $lng;
922  global $ilLog;
923  global $ilPluginAdmin;
924 
925  $lng->loadLanguageModule("survey");
926  $result = $ilDB->query("SELECT * FROM svy_qtype");
927  $types = array();
928  while ($row = $ilDB->fetchAssoc($result))
929  {
930  if ($row["plugin"] == 0)
931  {
932  $types[$row['type_tag']] = $lng->txt($row["type_tag"]);
933  }
934  else
935  {
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[$row['type_tag']] = $pl->getQuestionTypeTranslation();
943  }
944  }
945  }
946  }
947  ksort($types);
948  return $types;
949  }
950 
957  static function _getAvailableQuestionpools($use_object_id = FALSE, $could_be_offline = FALSE, $showPath = FALSE, $permission = "read")
958  {
959  global $ilUser;
960  global $ilDB;
961 
962  $result_array = array();
963  $qpls = ilUtil::_getObjectsByOperations("spl", $permission, $ilUser->getId(), -1);
964  $titles = ilObject::_prepareCloneSelection($qpls, "spl", $showPath);
965  $allqpls = array();
966  $result = $ilDB->query("SELECT obj_fi, isonline FROM svy_qpl");
967  while ($row = $ilDB->fetchAssoc($result))
968  {
969  $allqpls[$row['obj_fi']] = $row['isonline'];
970  }
971  foreach ($qpls as $ref_id)
972  {
973  $obj_id = ilObject::_lookupObjectId($ref_id);
974  if ($could_be_offline || $allqpls[$obj_id] == 1)
975  {
976  if ($use_object_id)
977  {
978  $result_array[$obj_id] = $titles[$ref_id];
979  }
980  else
981  {
982  $result_array[$ref_id] = $titles[$ref_id];
983  }
984  }
985  }
986  return $result_array;
987  }
988 
995  function isPluginActive($a_pname)
996  {
997  global $ilPluginAdmin;
998  if ($ilPluginAdmin->isActive(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $a_pname))
999  {
1000  return TRUE;
1001  }
1002  else
1003  {
1004  return FALSE;
1005  }
1006  }
1007 
1014  public function getQuestionInfos($question_ids)
1015  {
1016  global $ilDB;
1017 
1018  $found = array();
1019  $query_result = $ilDB->query("SELECT svy_question.*, svy_qtype.type_tag FROM svy_question, svy_qtype " .
1020  "WHERE svy_question.questiontype_fi = svy_qtype.questiontype_id " .
1021  "AND svy_question.tstamp > 0 AND " . $ilDB->in('svy_question.question_id', $question_ids, false, 'integer') . " " .
1022  "ORDER BY svy_question.title");
1023  if ($query_result->numRows() > 0)
1024  {
1025  while ($data = $ilDB->fetchAssoc($query_result))
1026  {
1027  if (in_array($data["question_id"], $question_ids))
1028  {
1029  array_push($found, array('id' => $data["question_id"],
1030  'title' => $data["title"],
1031  'description' => $data["description"],
1032  'type_tag' => $data["type_tag"]));
1033  }
1034  }
1035  }
1036  return $found;
1037  }
1038 
1039  /*
1040  * Remove all questions with tstamp = 0
1041  */
1042  public function purgeQuestions()
1043  {
1044  global $ilDB, $ilUser;
1045 
1046  $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE owner_fi = %s AND tstamp = %s",
1047  array("integer", "integer"),
1048  array($ilUser->getId(), 0)
1049  );
1050  while ($data = $ilDB->fetchAssoc($result))
1051  {
1052  $this->removeQuestion($data["question_id"]);
1053  }
1054  }
1055 
1061  public function copyToClipboard($question_id)
1062  {
1063  if (!array_key_exists("spl_clipboard", $_SESSION))
1064  {
1065  $_SESSION["spl_clipboard"] = array();
1066  }
1067  $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "copy");
1068  }
1069 
1075  public function moveToClipboard($question_id)
1076  {
1077  if (!array_key_exists("spl_clipboard", $_SESSION))
1078  {
1079  $_SESSION["spl_clipboard"] = array();
1080  }
1081  $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "move");
1082  }
1083 
1087  public function pasteFromClipboard()
1088  {
1089  global $ilDB;
1090 
1091  if (array_key_exists("spl_clipboard", $_SESSION))
1092  {
1093  foreach ($_SESSION["spl_clipboard"] as $question_object)
1094  {
1095  if (strcmp($question_object["action"], "move") == 0)
1096  {
1097  $result = $ilDB->queryF("SELECT obj_fi FROM svy_question WHERE question_id = %s",
1098  array('integer'),
1099  array($question_object["question_id"])
1100  );
1101  if ($result->numRows() == 1)
1102  {
1103  $row = $ilDB->fetchAssoc($result);
1104  $source_questionpool = $row["obj_fi"];
1105  if ($this->getId() != $source_questionpool)
1106  {
1107  // change the questionpool id in the qpl_questions table
1108  $affectedRows = $ilDB->manipulateF("UPDATE svy_question SET obj_fi = %s WHERE question_id = %s",
1109  array('integer','integer'),
1110  array($this->getId(), $question_object["question_id"])
1111  );
1112 
1113  // move question data to the new target directory
1114  $source_path = CLIENT_WEB_DIR . "/survey/" . $source_questionpool . "/" . $question_object["question_id"] . "/";
1115  if (@is_dir($source_path))
1116  {
1117  $target_path = CLIENT_WEB_DIR . "/survey/" . $this->getId() . "/";
1118  if (!@is_dir($target_path))
1119  {
1120  ilUtil::makeDirParents($target_path);
1121  }
1122  @rename($source_path, $target_path . $question_object["question_id"]);
1123  }
1124  }
1125  else
1126  {
1127  ilUtil::sendFailure($this->lng->txt("spl_move_same_pool"), true);
1128  return;
1129  }
1130  }
1131  }
1132  else
1133  {
1134  $this->copyQuestion($question_object["question_id"], $this->getId());
1135  }
1136  }
1137  }
1138  ilUtil::sendSuccess($this->lng->txt("spl_paste_success"), true);
1139  unset($_SESSION["spl_clipboard"]);
1140  }
1141 
1148  function setObligatoryStates($obligatory_questions)
1149  {
1150  global $ilDB;
1151 
1152  foreach($this->getQuestions() as $question_id)
1153  {
1154  $status = (int)(in_array($question_id, $obligatory_questions));
1155 
1156  $ilDB->manipulate("UPDATE svy_question".
1157  " SET obligatory = ".$ilDB->quote($status, "integer").
1158  " WHERE question_id = ".$ilDB->quote($question_id, "integer"));
1159  }
1160  }
1161 } // END class.ilSurveyObjQuestionPool
1162 ?>
static sendSuccess($a_info="", $a_keep=false)
Send Success Message to Screen.
static getPluginObject($a_ctype, $a_cname, $a_slot_id, $a_pname)
Get plugin object.
static makeDirParents($a_dir)
Create a new directory and all parent directories.
isInUse($question_id)
Checks if a question is in use by a survey.
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.
$_SESSION["AccountId"]
$result
getQuestionInfos($question_ids)
Returns title, description and type for an array of question id&#39;s.
updateMetaData()
update meta data entry
Class ilObject Basic functions for all objects.
getQuestiontype($question_id)
Returns the question type of a question with a given id.
createImportDirectory()
creates data directory for import files (data_dir/spl_data/spl_<id>/import, depending on data directo...
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, instead it parses the serialized rbac_pa entries.
static _isWriteable($object_id, $user_id)
Returns true, if the question pool is writeable by a given user.
getExportDirectory()
get export directory of survey
copyQuestion($question_id, $questionpool_to)
Copies a question into another question pool.
createMetaData()
create meta data entry
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
static _includeClass($question_type, $gui=0)
Include the php class file for a given question type.
XML writer class.
getImportDirectory()
get import directory of survey
Survey Question Import Parser.
static _getAvailableQuestionpools($use_object_id=FALSE, $could_be_offline=FALSE, $showPath=FALSE, $permission="read")
Returns the available question pools for the active user.
__construct($a_id=0, $a_call_by_reference=true)
Constructor public.
create($a_upload=false)
create question pool object
Survey exception class.
static _getAllReferences($a_id)
get all reference ids of object
read()
read object data from db into object public
isPluginActive($a_pname)
Checks whether or not a question plugin with a given name is active.
static _lookupObjectId($a_ref_id)
lookup object id
setOnline($a_online_status)
Sets the questionpool online status.
$counter
getQuestionsData($arrFilter)
Calculates the data for the output of the questionpool.
duplicateQuestion($question_id, $obj_id="")
Duplicates a question for a questionpool.
importObject($source, $spl_exists=FALSE)
Imports survey questions into ILIAS.
static _setOnline($a_obj_id, $a_online_status)
static _getInstance($a_copy_id)
Get instance of copy wizard options.
getId()
get object id public
setObligatoryStates($obligatory_questions)
Sets the obligatory states for questions in a survey from the questions form.
moveToClipboard($question_id)
Moves a question to the clipboard.
paste($question_id)
Pastes a question in the question pool.
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.
getTitle()
get object title public
const IL_COMP_MODULE
$ilUser
Definition: imgupload.php:18
xmlHeader()
Writes xml header public.
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
getType()
get object type public
Create styles array
The data for the language used.
toXML($questions)
export questions to xml
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
pasteFromClipboard()
Copies/Moves a question from the clipboard.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
removeQuestion($question_id)
Removes a question from the question pool.
copyToClipboard($question_id)
Copies a question to the clipboard.
static getDataDir()
get data directory (outside webspace)
saveToDb()
Saves a ilObjSurveyQuestionPool object to a database.
& getQuestionsInfo($question_array)
Retrieves the datase entries for questions from a given array.
static _getQuestiontypes()
Creates a list of all available question types.
global $ilDB
deleteMetaData()
delete meta data entry
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file
Class ilInvalidSurveyImportFileException.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
createExportDirectory()
creates data directory for export files (data_dir/spl_data/spl_<id>/export, depending on data directo...
& createQuestion($question_type, $question_id=-1)
loadFromDb()
Loads a ilObjQuestionpool object from a database.