ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5
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 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 
918  function &_getQuestiontypes()
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  {
1046  $obj_id = ilObject::_lookupObjectId($ref_id);
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 ?>
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.
_isWriteable($object_id, $user_id)
Returns true, if the question pool is writeable by a given user.
print $file
isInUse($question_id)
Checks if a question is in use by a survey.
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.
$_GET["client_id"]
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.
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.
create($a_upload=false)
create question pool object
ilObject($a_id=0, $a_reference=true)
Constructor public.
static _getAllReferences($a_id)
get all reference ids of object
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.
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.
$data
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.
getTitle()
get object title public
const IL_COMP_MODULE
redirection script todo: (a better solution should control the processing via a xml file) ...
xmlHeader()
Writes xml header public.
ilObjSurveyQuestionPool($a_id=0, $a_call_by_reference=true)
Constructor public.
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 ...
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...
removeQuestion($question_id)
Removes a question from the question pool.
copyToClipboard($question_id)
Copies a question to the clipboard.
_hasUntrashedReference($a_obj_id)
checks wether an object has at least one reference that is not in trash
static getDataDir()
get data directory (outside webspace)
global $ilUser
Definition: imgupload.php:15
saveToDb()
Saves a ilObjSurveyQuestionPool object to 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.
& getQuestionsInfo($question_array)
Retrieves the datase entries for questions from a given array.
& _getQuestiontypes()
Creates a list of all available question types.
global $ilDB
deleteMetaData()
delete meta data entry
Class ilInvalidSurveyImportFileException.
& _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
_getAvailableQuestionpools($use_object_id=FALSE, $could_be_offline=FALSE, $showPath=FALSE, $permission="read")
Returns the available question pools for the active user.
createExportDirectory()
creates data directory for export files (data_dir/spl_data/spl_<id>/export, depending on data directo...
& createQuestion($question_type, $question_id=-1)
read($a_force_db=false)
read object data from db into object
loadFromDb()
Loads a ilObjQuestionpool object from a database.