ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
All Data Structures Namespaces Files Functions Variables Modules Pages
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  {
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  {
169  $ilDB = $this->db;
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  {
189  $ilDB = $this->db;
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  {
239  $ilDB = $this->db;
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  {
282  $ilDB = $this->db;
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  {
308  $ilDB = $this->db;
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  {
354  $ilDB = $this->db;
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  {
401  $ilDB = $this->db;
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  {
618  $ilDB = $this->db;
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 
839  public static function _getQuestionTypeTranslations()
840  {
841  global $DIC;
842 
843  $ilDB = $DIC->database();
844  global $DIC;
845 
846  $lng = $DIC->language();
847  global $DIC;
848 
849  $ilLog = $DIC["ilLog"];
850  global $DIC;
851 
852  $ilPluginAdmin = $DIC["ilPluginAdmin"];
853 
854  $lng->loadLanguageModule("survey");
855  $result = $ilDB->query("SELECT * FROM svy_qtype");
856  $types = array();
857  while ($row = $ilDB->fetchAssoc($result)) {
858  if ($row["plugin"] == 0) {
859  $types[$row['type_tag']] = $lng->txt($row["type_tag"]);
860  } else {
861  $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
862  foreach ($pl_names as $pl_name) {
863  $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
864  if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0) {
865  $types[$row['type_tag']] = $pl->getQuestionTypeTranslation();
866  }
867  }
868  }
869  }
870  ksort($types);
871  return $types;
872  }
873 
880  public static function _getAvailableQuestionpools($use_object_id = false, $could_be_offline = false, $showPath = false, $permission = "read")
881  {
882  global $DIC;
883 
884  $ilUser = $DIC->user();
885  global $DIC;
886 
887  $ilDB = $DIC->database();
888 
889  $result_array = array();
890  $qpls = ilUtil::_getObjectsByOperations("spl", $permission, $ilUser->getId(), -1);
891  $titles = ilObject::_prepareCloneSelection($qpls, "spl", $showPath);
892  $allqpls = array();
893  $result = $ilDB->query("SELECT obj_fi, isonline FROM svy_qpl");
894  while ($row = $ilDB->fetchAssoc($result)) {
895  $allqpls[$row['obj_fi']] = $row['isonline'];
896  }
897  foreach ($qpls as $ref_id) {
898  $obj_id = ilObject::_lookupObjectId($ref_id);
899  if ($could_be_offline || $allqpls[$obj_id] == 1) {
900  if ($use_object_id) {
901  $result_array[$obj_id] = $titles[$ref_id];
902  } else {
903  $result_array[$ref_id] = $titles[$ref_id];
904  }
905  }
906  }
907  return $result_array;
908  }
909 
916  public function isPluginActive($a_pname)
917  {
918  $ilPluginAdmin = $this->plugin_admin;
919  if ($ilPluginAdmin->isActive(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $a_pname)) {
920  return true;
921  } else {
922  return false;
923  }
924  }
925 
932  public function getQuestionInfos($question_ids)
933  {
934  $ilDB = $this->db;
935 
936  $found = array();
937  $query_result = $ilDB->query("SELECT svy_question.*, svy_qtype.type_tag FROM svy_question, svy_qtype " .
938  "WHERE svy_question.questiontype_fi = svy_qtype.questiontype_id " .
939  "AND svy_question.tstamp > 0 AND " . $ilDB->in('svy_question.question_id', $question_ids, false, 'integer') . " " .
940  "ORDER BY svy_question.title");
941  if ($query_result->numRows() > 0) {
942  while ($data = $ilDB->fetchAssoc($query_result)) {
943  if (in_array($data["question_id"], $question_ids)) {
944  array_push($found, array('id' => $data["question_id"],
945  'title' => $data["title"],
946  'description' => $data["description"],
947  'type_tag' => $data["type_tag"]));
948  }
949  }
950  }
951  return $found;
952  }
953 
954  /*
955  * Remove all questions with tstamp = 0
956  */
957  public function purgeQuestions()
958  {
959  $ilDB = $this->db;
961 
962  $result = $ilDB->queryF(
963  "SELECT question_id FROM svy_question WHERE owner_fi = %s AND tstamp = %s",
964  array("integer", "integer"),
965  array($ilUser->getId(), 0)
966  );
967  while ($data = $ilDB->fetchAssoc($result)) {
968  $this->removeQuestion($data["question_id"]);
969  }
970  }
971 
977  public function copyToClipboard($question_id)
978  {
979  if (!array_key_exists("spl_clipboard", $_SESSION)) {
980  $_SESSION["spl_clipboard"] = array();
981  }
982  $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "copy");
983  }
984 
990  public function moveToClipboard($question_id)
991  {
992  if (!array_key_exists("spl_clipboard", $_SESSION)) {
993  $_SESSION["spl_clipboard"] = array();
994  }
995  $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "move");
996  }
997 
1001  public function pasteFromClipboard()
1002  {
1003  $ilDB = $this->db;
1004 
1005  if (array_key_exists("spl_clipboard", $_SESSION)) {
1006  foreach ($_SESSION["spl_clipboard"] as $question_object) {
1007  if (strcmp($question_object["action"], "move") == 0) {
1008  $result = $ilDB->queryF(
1009  "SELECT obj_fi FROM svy_question WHERE question_id = %s",
1010  array('integer'),
1011  array($question_object["question_id"])
1012  );
1013  if ($result->numRows() == 1) {
1014  $row = $ilDB->fetchAssoc($result);
1015  $source_questionpool = $row["obj_fi"];
1016  if ($this->getId() != $source_questionpool) {
1017  // change the questionpool id in the qpl_questions table
1018  $affectedRows = $ilDB->manipulateF(
1019  "UPDATE svy_question SET obj_fi = %s WHERE question_id = %s",
1020  array('integer','integer'),
1021  array($this->getId(), $question_object["question_id"])
1022  );
1023 
1024  // move question data to the new target directory
1025  $source_path = CLIENT_WEB_DIR . "/survey/" . $source_questionpool . "/" . $question_object["question_id"] . "/";
1026  if (@is_dir($source_path)) {
1027  $target_path = CLIENT_WEB_DIR . "/survey/" . $this->getId() . "/";
1028  if (!@is_dir($target_path)) {
1029  ilUtil::makeDirParents($target_path);
1030  }
1031  @rename($source_path, $target_path . $question_object["question_id"]);
1032  }
1033  } else {
1034  ilUtil::sendFailure($this->lng->txt("spl_move_same_pool"), true);
1035  return;
1036  }
1037  }
1038  } else {
1039  $this->copyQuestion($question_object["question_id"], $this->getId());
1040  }
1041  }
1042  }
1043  ilUtil::sendSuccess($this->lng->txt("spl_paste_success"), true);
1044  unset($_SESSION["spl_clipboard"]);
1045  }
1046 
1053  public function setObligatoryStates($obligatory_questions)
1054  {
1055  $ilDB = $this->db;
1056 
1057  foreach ($this->getQuestions() as $question_id) {
1058  $status = (int) (in_array($question_id, $obligatory_questions));
1059 
1060  $ilDB->manipulate("UPDATE svy_question" .
1061  " SET obligatory = " . $ilDB->quote($status, "integer") .
1062  " WHERE question_id = " . $ilDB->quote($question_id, "integer"));
1063  }
1064  }
1065 } // END class.ilSurveyObjQuestionPool
static makeDirParents($a_dir)
Create a new directory and all parent directories.
static getPluginObject(string $a_ctype, string $a_cname, string $a_slot_id, string $a_pname)
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
$data
Definition: storeScorm.php:23
static _prepareCloneSelection($a_ref_ids, $new_type, $show_path=true)
Prepare copy wizard object selection.
$_SESSION["AccountId"]
$result
Class ilObjSurveyQuestionPool.
getQuestionInfos($question_ids)
Returns title, description and type for an array of question id&#39;s.
updateMetaData()
update meta data entry
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.
__construct($a_id=0, $a_call_by_reference=true)
Constructor public.
create($a_upload=false)
create question pool object
Survey exception class.
user()
Definition: user.php:4
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.
getQuestionsData($arrFilter)
Calculates the data for the output of the questionpool.
duplicateQuestion($question_id, $obj_id="")
Duplicates a question for a questionpool.
static _setOnline($a_obj_id, $a_online_status)
static _getInstance($a_copy_id)
Get instance of copy wizard options.
importObject($source, $spl_exists=false)
Imports survey questions into ILIAS.
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.
$xml
Definition: metadata.php:332
$query
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
getType()
get object type public
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 ...
$rows
Definition: xhr_table.php:10
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.
__construct(Container $dic, ilPlugin $plugin)
& 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
$DIC
Definition: xapitoken.php:46
deleteMetaData()
delete meta data entry
Class ilInvalidSurveyImportFileException.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static _getAvailableQuestionpools($use_object_id=false, $could_be_offline=false, $showPath=false, $permission="read")
Returns the available question pools for the active user.
$source
Definition: metadata.php:76
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.