ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f870
All Data Structures Namespaces Files Functions Variables Modules Pages
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  $result = $ilDB->queryF("SELECT * FROM svy_qpl WHERE obj_fi = %s",
216  array('integer'),
217  array($this->getId())
218  );
219  if ($result->numRows() == 1)
220  {
221  $affectedRows = $ilDB->manipulateF("UPDATE svy_qpl SET isonline = %s, tstamp = %s WHERE obj_fi = %s",
222  array('text','integer','integer'),
223  array($this->getOnline(), time(), $this->getId())
224  );
225  }
226  else
227  {
228  $next_id = $ilDB->nextId('svy_qpl');
229  $query = $ilDB->manipulateF("INSERT INTO svy_qpl (id_questionpool, isonline, obj_fi, tstamp) VALUES (%s, %s, %s, %s)",
230  array('integer', 'text', 'integer', 'integer'),
231  array($next_id, $this->getOnline(), $this->getId(), time())
232  );
233  }
234  }
235 
242  function delete()
243  {
244  $remove = parent::delete();
245  // always call parent delete function first!!
246  if (!$remove)
247  {
248  return false;
249  }
250 
251  // delete all related questions
252  $this->deleteAllData();
253 
254  // delete meta data
255  $this->deleteMetaData();
256 
257  return true;
258  }
259 
260  function deleteAllData()
261  {
262  global $ilDB;
263  $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE obj_fi = %s AND original_id IS NULL",
264  array('integer'),
265  array($this->getId())
266  );
267  $found_questions = array();
268  while ($row = $ilDB->fetchAssoc($result))
269  {
270  $this->removeQuestion($row["question_id"]);
271  }
272 
273  // delete export files
274  include_once "./Services/Utilities/classes/class.ilUtil.php";
275  $spl_data_dir = ilUtil::getDataDir()."/spl_data";
276  $directory = $spl_data_dir."/spl_".$this->getId();
277  if (is_dir($directory))
278  {
279  include_once "./Services/Utilities/classes/class.ilUtil.php";
280  ilUtil::delDir($directory);
281  }
282  }
283 
297  function notify($a_event,$a_ref_id,$a_parent_non_rbac_id,$a_node_id,$a_params = 0)
298  {
299  global $tree;
300 
301  switch ($a_event)
302  {
303  case "link":
304 
305  //var_dump("<pre>",$a_params,"</pre>");
306  //echo "Module name ".$this->getRefId()." triggered by link event. Objects linked into target object ref_id: ".$a_ref_id;
307  //exit;
308  break;
309 
310  case "cut":
311 
312  //echo "Module name ".$this->getRefId()." triggered by cut event. Objects are removed from target object ref_id: ".$a_ref_id;
313  //exit;
314  break;
315 
316  case "copy":
317 
318  //var_dump("<pre>",$a_params,"</pre>");
319  //echo "Module name ".$this->getRefId()." triggered by copy event. Objects are copied into target object ref_id: ".$a_ref_id;
320  //exit;
321  break;
322 
323  case "paste":
324 
325  //echo "Module name ".$this->getRefId()." triggered by paste (cut) event. Objects are pasted into target object ref_id: ".$a_ref_id;
326  //exit;
327  break;
328 
329  case "new":
330 
331  //echo "Module name ".$this->getRefId()." triggered by paste (new) event. Objects are applied to target object ref_id: ".$a_ref_id;
332  //exit;
333  break;
334  }
335 
336  // At the beginning of the recursive process it avoids second call of the notify function with the same parameter
337  if ($a_node_id==$_GET["ref_id"])
338  {
339  $parent_obj =& $this->ilias->obj_factory->getInstanceByRefId($a_node_id);
340  $parent_type = $parent_obj->getType();
341  if($parent_type == $this->getType())
342  {
343  $a_node_id = (int) $tree->getParentId($a_node_id);
344  }
345  }
346 
347  parent::notify($a_event,$a_ref_id,$a_parent_non_rbac_id,$a_node_id,$a_params);
348  }
349 
355  function getTitle()
356  {
357  //return $this->title;
358  return parent::getTitle();
359  }
360 
364  function setTitle($a_title)
365  {
366  parent::setTitle($a_title);
367  }
368 
375  function removeQuestion($question_id)
376  {
377  if ($question_id < 1) return;
378  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
379  $question =& SurveyQuestion::_instanciateQuestion($question_id);
380  $question->delete($question_id);
381  }
382 
390  function getQuestiontype($question_id)
391  {
392  global $ilDB;
393  if ($question_id < 1) return;
394  $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",
395  array('integer'),
396  array($question_id)
397  );
398  if ($result->numRows() == 1)
399  {
400  $data = $ilDB->fetchAssoc($result);
401  return $data["type_tag"];
402  }
403  else
404  {
405  return;
406  }
407  }
408 
416  function isInUse($question_id)
417  {
418  global $ilDB;
419  // check out the already answered questions
420  $result = $ilDB->queryF("SELECT answer_id FROM svy_answer WHERE question_fi = %s",
421  array('integer'),
422  array($question_id)
423  );
424  $answered = $result->numRows();
425 
426  // check out the questions inserted in surveys
427  $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",
428  array('integer'),
429  array($question_id)
430  );
431  $inserted = $result->numRows();
432  if (($inserted + $answered) == 0)
433  {
434  return false;
435  }
436  $result_array = array();
437  while ($row = $ilDB->fetchObject($result))
438  {
439  array_push($result_array, $row);
440  }
441  return $result_array;
442  }
443 
450  function paste($question_id)
451  {
452  $this->duplicateQuestion($question_id, $this->getId());
453  }
454 
462  function &getQuestionsInfo($question_array)
463  {
464  global $ilDB;
465  $result_array = array();
466  $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'));
467  while ($row = $ilDB->fetchAssoc($result))
468  {
469  if ($row["plugin"])
470  {
471  if ($this->isPluginActive($row["type_tag"]))
472  {
473  array_push($result_array, $row);
474  }
475  }
476  else
477  {
478  array_push($result_array, $row);
479  }
480  }
481  return $result_array;
482  }
483 
490  function duplicateQuestion($question_id, $obj_id = "")
491  {
492  global $ilUser;
493  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
494  $question = SurveyQuestion::_instanciateQuestion($question_id);
495  $suffix = "";
496  $counter = 1;
497  while ($question->questionTitleExists($question->getTitle().$suffix, $obj_id))
498  {
499  $counter++;
500  if ($counter > 1) $suffix = " ($counter)";
501  }
502  if ($obj_id)
503  {
504  $question->setObjId($obj_id);
505  }
506  $question->duplicate(false, $question->getTitle() . $suffix, $ilUser->fullname, $ilUser->id);
507  }
508 
514  function getQuestionsData($arrFilter)
515  {
516  global $ilUser;
517  global $ilDB;
518  $where = "";
519  if (is_array($arrFilter))
520  {
521  foreach ($arrFilter as $key => $value)
522  {
523  $arrFilter[$key] = str_replace('%', '', $arrFilter[$key]);
524  }
525  if (array_key_exists('title', $arrFilter) && strlen($arrFilter['title']))
526  {
527  $where .= " AND " . $ilDB->like('svy_question.title', 'text', "%%" . $arrFilter['title'] . "%%");
528  }
529  if (array_key_exists('description', $arrFilter) && strlen($arrFilter['description']))
530  {
531  $where .= " AND " . $ilDB->like('svy_question.description', 'text', "%%" . $arrFilter['description'] . "%%");
532  }
533  if (array_key_exists('author', $arrFilter) && strlen($arrFilter['author']))
534  {
535  $where .= " AND " . $ilDB->like('svy_question.author', 'text', "%%" . $arrFilter['author'] . "%%");
536  }
537  if (array_key_exists('type', $arrFilter) && strlen($arrFilter['type']))
538  {
539  $where .= " AND svy_qtype.type_tag = " . $ilDB->quote($arrFilter['type'], 'text');
540  }
541  }
542  $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,
543  array('integer'),
544  array($this->getId())
545  );
546  $rows = array();
547  if ($query_result->numRows())
548  {
549  while ($row = $ilDB->fetchAssoc($query_result))
550  {
551  // first part fix #19469
552  $set = $ilDB->query("SELECT question_fi FROM svy_svy_qst ".
553  " WHERE question_fi = ".$ilDB->quote($row["question_id"], "integer")
554  );
555  if ($temp = $ilDB->fetchAssoc($set))
556  {
557  continue;
558  }
559  if ($row["plugin"])
560  {
561  if ($this->isPluginActive($row["type_tag"]))
562  {
563  array_push($rows, $row);
564  }
565  }
566  else
567  {
568  array_push($rows, $row);
569  }
570  }
571  }
572  return $rows;
573  }
574 
581  {
582  include_once "./Services/Utilities/classes/class.ilUtil.php";
583  $spl_data_dir = ilUtil::getDataDir()."/spl_data";
584  ilUtil::makeDir($spl_data_dir);
585  if(!is_writable($spl_data_dir))
586  {
587  $this->ilias->raiseError("Survey Questionpool Data Directory (".$spl_data_dir
588  .") not writeable.",$this->ilias->error_obj->FATAL);
589  }
590 
591  // create learning module directory (data_dir/lm_data/lm_<id>)
592  $spl_dir = $spl_data_dir."/spl_".$this->getId();
593  ilUtil::makeDir($spl_dir);
594  if(!@is_dir($spl_dir))
595  {
596  $this->ilias->raiseError("Creation of Survey Questionpool Directory failed.",$this->ilias->error_obj->FATAL);
597  }
598  // create Export subdirectory (data_dir/lm_data/lm_<id>/Export)
599  $export_dir = $spl_dir."/export";
600  ilUtil::makeDir($export_dir);
601  if(!@is_dir($export_dir))
602  {
603  $this->ilias->raiseError("Creation of Export Directory failed.",$this->ilias->error_obj->FATAL);
604  }
605  }
606 
611  {
612  include_once "./Services/Utilities/classes/class.ilUtil.php";
613  $export_dir = ilUtil::getDataDir()."/spl_data"."/spl_".$this->getId()."/export";
614  return $export_dir;
615  }
616 
620  function getExportFiles($dir)
621  {
622  // quit if import dir not available
623  if (!@is_dir($dir) or
624  !is_writeable($dir))
625  {
626  return array();
627  }
628 
629  // open directory
630  $dir = dir($dir);
631 
632  // initialize array
633  $file = array();
634 
635  // get files and save the in the array
636  while ($entry = $dir->read())
637  {
638  if ($entry != "." &&
639  $entry != ".." &&
640  ereg("^[0-9]{10}_{2}[0-9]+_{2}(spl_)*[0-9]+\.[A-Za-z]{3}\$", $entry))
641  {
642  $file[] = $entry;
643  }
644  }
645 
646  // close import directory
647  $dir->close();
648  // sort files
649  sort ($file);
650  reset ($file);
651 
652  return $file;
653  }
654 
661  {
662  include_once "./Services/Utilities/classes/class.ilUtil.php";
663  $spl_data_dir = ilUtil::getDataDir()."/spl_data";
664  ilUtil::makeDir($spl_data_dir);
665 
666  if(!is_writable($spl_data_dir))
667  {
668  $this->ilias->raiseError("Survey Questionpool Data Directory (".$spl_data_dir
669  .") not writeable.",$this->ilias->error_obj->FATAL);
670  }
671 
672  // create test directory (data_dir/spl_data/spl_<id>)
673  $spl_dir = $spl_data_dir."/spl_".$this->getId();
674  ilUtil::makeDir($spl_dir);
675  if(!@is_dir($spl_dir))
676  {
677  $this->ilias->raiseError("Creation of Survey Questionpool Directory failed.",$this->ilias->error_obj->FATAL);
678  }
679 
680  // create import subdirectory (data_dir/spl_data/spl_<id>/import)
681  $import_dir = $spl_dir."/import";
682  ilUtil::makeDir($import_dir);
683  if(!@is_dir($import_dir))
684  {
685  $this->ilias->raiseError("Creation of Import Directory failed.",$this->ilias->error_obj->FATAL);
686  }
687  }
688 
693  {
694  include_once "./Services/Utilities/classes/class.ilUtil.php";
695  $import_dir = ilUtil::getDataDir()."/spl_data".
696  "/spl_".$this->getId()."/import";
697  if(@is_dir($import_dir))
698  {
699  return $import_dir;
700  }
701  else
702  {
703  return false;
704  }
705  }
706 
710  function toXML($questions)
711  {
712  if (!is_array($questions))
713  {
714  $questions =& $this->getQuestions();
715  }
716  if (count($questions) == 0)
717  {
718  $questions =& $this->getQuestions();
719  }
720  $xml = "";
721 
722  include_once("./Services/Xml/classes/class.ilXmlWriter.php");
723  $a_xml_writer = new ilXmlWriter;
724  // set xml header
725  $a_xml_writer->xmlHeader();
726  $attrs = array(
727  "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
728  "xsi:noNamespaceSchemaLocation" => "http://www.ilias.de/download/xsd/ilias_survey_4_2.xsd"
729  );
730  $a_xml_writer->xmlStartTag("surveyobject", $attrs);
731  $attrs = array(
732  "id" => "qpl_" . $this->getId(),
733  "label" => $this->getTitle(),
734  "online" => $this->getOnline()
735  );
736  $a_xml_writer->xmlStartTag("surveyquestions", $attrs);
737  $a_xml_writer->xmlElement("dummy", NULL, "dummy");
738  // add ILIAS specific metadata
739  $a_xml_writer->xmlStartTag("metadata");
740  $a_xml_writer->xmlStartTag("metadatafield");
741  $a_xml_writer->xmlElement("fieldlabel", NULL, "SCORM");
742  include_once "./Services/MetaData/classes/class.ilMD.php";
743  $md = new ilMD($this->getId(),0, $this->getType());
744  $writer = new ilXmlWriter();
745  $md->toXml($writer);
746  $metadata = $writer->xmlDumpMem();
747  $a_xml_writer->xmlElement("fieldentry", NULL, $metadata);
748  $a_xml_writer->xmlEndTag("metadatafield");
749  $a_xml_writer->xmlEndTag("metadata");
750 
751  $a_xml_writer->xmlEndTag("surveyquestions");
752  $a_xml_writer->xmlEndTag("surveyobject");
753 
754  $xml = $a_xml_writer->xmlDumpMem(FALSE);
755 
756  $questionxml = "";
757  foreach ($questions as $key => $value)
758  {
759  $questiontype = $this->getQuestiontype($value);
760  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
761  SurveyQuestion::_includeClass($questiontype);
762  $question = new $questiontype();
763  $question->loadFromDb($value);
764  $questionxml .= $question->toXML(false);
765  }
766 
767  $xml = str_replace("<dummy>dummy</dummy>", $questionxml, $xml);
768  return $xml;
769  }
770 
771  function &getQuestions()
772  {
773  global $ilDB;
774  $questions = array();
775  $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE obj_fi = %s AND svy_question.tstamp > 0 AND original_id IS NULL",
776  array('integer'),
777  array($this->getId())
778  );
779  if ($result->numRows())
780  {
781  while ($row = $ilDB->fetchAssoc($result))
782  {
783  array_push($questions, $row["question_id"]);
784  }
785  }
786  return $questions;
787  }
788 
795  function importObject($source, $spl_exists = FALSE)
796  {
797  if (is_file($source))
798  {
799  $isZip = (strcmp(strtolower(substr($source, -3)), 'zip') == 0);
800  if ($isZip)
801  {
802  // unzip file
803  ilUtil::unzip($source);
804 
805  // determine filenames of xml files
806  $subdir = basename($source, ".zip");
807  $source = dirname($source)."/".$subdir."/".$subdir.".xml";
808  }
809 
810  $fh = fopen($source, "r") or die("");
811  $xml = fread($fh, filesize($source));
812  fclose($fh) or die("");
813  if ($isZip)
814  {
815  $subdir = basename($source, ".zip");
816  if (@is_dir(dirname($source)."/".$subdir))
817  {
818  ilUtil::delDir(dirname($source)."/".$subdir);
819  }
820  }
821  if (strpos($xml, "questestinterop") > 0)
822  {
823  // survey questions for ILIAS < 3.8
824  include_once "./Services/Survey/classes/class.SurveyImportParserPre38.php";
825  $import = new SurveyImportParserPre38($this->getId(), "", $spl_exists);
826  $import->setXMLContent($xml);
827  $import->startParsing();
828  }
829  else
830  {
831  // survey questions for ILIAS >= 3.8
832  include_once "./Services/Survey/classes/class.SurveyImportParser.php";
833  $import = new SurveyImportParser($this->getId(), "", $spl_exists);
834  $import->setXMLContent($xml);
835  $import->startParsing();
836  }
837  }
838  }
839 
840  public static function _setOnline($a_obj_id, $a_online_status)
841  {
842  global $ilDB;
843 
844  $status = "0";
845  switch ($a_online_status)
846  {
847  case 0:
848  case 1:
849  $status = "$a_online_status";
850  break;
851  }
852  $affectedRows = $ilDB->manipulateF("UPDATE svy_qpl SET isonline = %s WHERE obj_fi = %s",
853  array('text','integer'),
854  array($status, $a_obj_id)
855  );
856  }
857 
865  function setOnline($a_online_status)
866  {
867  switch ($a_online_status)
868  {
869  case 0:
870  case 1:
871  $this->online = $a_online_status;
872  break;
873  default:
874  $this->online = 0;
875  break;
876  }
877  }
878 
879  function getOnline()
880  {
881  if (strcmp($this->online, "") == 0) $this->online = "0";
882  return $this->online;
883  }
884 
885  function _lookupOnline($a_obj_id)
886  {
887  global $ilDB;
888 
889  $result = $ilDB->queryF("SELECT isonline FROM svy_qpl WHERE obj_fi = %s",
890  array('integer'),
891  array($a_obj_id)
892  );
893  if ($result->numRows() == 1)
894  {
895  $row = $ilDB->fetchAssoc($result);
896  return $row["isonline"];
897  }
898  return 0;
899  }
900 
908  function _isWriteable($object_id, $user_id)
909  {
910  global $rbacsystem;
911  global $ilDB;
912 
913  $refs = ilObject::_getAllReferences($object_id);
914  $result = false;
915  foreach ($refs as $ref)
916  {
917  if ($rbacsystem->checkAccess("write", $ref) && (ilObject::_hasUntrashedReference($object_id)))
918  {
919  $result = true;
920  }
921  }
922  return $result;
923  }
924 
931  function &_getQuestiontypes()
932  {
933  global $ilDB;
934  global $lng;
935 
936  $lng->loadLanguageModule("survey");
937  $types = array();
938  $query_result = $ilDB->query("SELECT * FROM svy_qtype ORDER BY type_tag");
939  while ($row = $ilDB->fetchAssoc($query_result))
940  {
941  //array_push($questiontypes, $row["type_tag"]);
942  if ($row["plugin"] == 0)
943  {
944  $types[$lng->txt($row["type_tag"])] = $row;
945  }
946  else
947  {
948  global $ilPluginAdmin;
949  $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
950  foreach ($pl_names as $pl_name)
951  {
952  $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
953  if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0)
954  {
955  $types[$pl->getQuestionTypeTranslation()] = $row;
956  }
957  }
958  }
959  }
960  ksort($types);
961 
962 
963  // #14263 - default sorting
964 
965  $default_sorting = array_flip(array(
966  "SurveySingleChoiceQuestion",
967  "SurveyMultipleChoiceQuestion",
968  "SurveyMatrixQuestion",
969  "SurveyMetricQuestion",
970  "SurveyTextQuestion"
971  ));
972 
973  $sorted = array();
974  $idx = sizeof($default_sorting);
975  foreach($types as $caption => $item)
976  {
977  $type = $item["type_tag"];
978  $item["caption"] = $caption;
979 
980  // default
981  if(array_key_exists($type, $default_sorting))
982  {
983  $sorted[$default_sorting[$type]] = $item;
984  }
985  // plugin (append alphabetically sorted)
986  else
987  {
988  $sorted[$idx] = $item;
989  $idx++;
990  }
991  }
992  ksort($sorted);
993 
994  // redo captions as index
995  $types = array();
996  foreach($sorted as $item)
997  {
998  $types[$item["caption"]] = $item;
999  }
1000 
1001  return $types;
1002  }
1003 
1004  public static function &_getQuestionTypeTranslations()
1005  {
1006  global $ilDB;
1007  global $lng;
1008  global $ilLog;
1009  global $ilPluginAdmin;
1010 
1011  $lng->loadLanguageModule("survey");
1012  $result = $ilDB->query("SELECT * FROM svy_qtype");
1013  $types = array();
1014  while ($row = $ilDB->fetchAssoc($result))
1015  {
1016  if ($row["plugin"] == 0)
1017  {
1018  $types[$row['type_tag']] = $lng->txt($row["type_tag"]);
1019  }
1020  else
1021  {
1022  $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "SurveyQuestionPool", "svyq");
1023  foreach ($pl_names as $pl_name)
1024  {
1025  $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $pl_name);
1026  if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0)
1027  {
1028  $types[$row['type_tag']] = $pl->getQuestionTypeTranslation();
1029  }
1030  }
1031  }
1032  }
1033  ksort($types);
1034  return $types;
1035  }
1036 
1043  function _getAvailableQuestionpools($use_object_id = FALSE, $could_be_offline = FALSE, $showPath = FALSE, $permission = "read")
1044  {
1045  global $ilUser;
1046  global $ilDB;
1047 
1048  $result_array = array();
1049  $qpls = ilUtil::_getObjectsByOperations("spl", $permission, $ilUser->getId(), -1);
1050  $titles = ilObject::_prepareCloneSelection($qpls, "spl", $showPath);
1051  $allqpls = array();
1052  $result = $ilDB->query("SELECT obj_fi, isonline FROM svy_qpl");
1053  while ($row = $ilDB->fetchAssoc($result))
1054  {
1055  $allqpls[$row['obj_fi']] = $row['isonline'];
1056  }
1057  foreach ($qpls as $ref_id)
1058  {
1059  $obj_id = ilObject::_lookupObjectId($ref_id);
1060  if ($could_be_offline || $allqpls[$obj_id] == 1)
1061  {
1062  if ($use_object_id)
1063  {
1064  $result_array[$obj_id] = $titles[$ref_id];
1065  }
1066  else
1067  {
1068  $result_array[$ref_id] = $titles[$ref_id];
1069  }
1070  }
1071  }
1072  return $result_array;
1073  }
1074 
1081  function isPluginActive($a_pname)
1082  {
1083  global $ilPluginAdmin;
1084  if ($ilPluginAdmin->isActive(IL_COMP_MODULE, "SurveyQuestionPool", "svyq", $a_pname))
1085  {
1086  return TRUE;
1087  }
1088  else
1089  {
1090  return FALSE;
1091  }
1092  }
1093 
1100  public function getQuestionInfos($question_ids)
1101  {
1102  global $ilDB;
1103 
1104  $found = array();
1105  $query_result = $ilDB->query("SELECT svy_question.*, svy_qtype.type_tag FROM svy_question, svy_qtype " .
1106  "WHERE svy_question.questiontype_fi = svy_qtype.questiontype_id " .
1107  "AND svy_question.tstamp > 0 AND " . $ilDB->in('svy_question.question_id', $question_ids, false, 'integer') . " " .
1108  "ORDER BY svy_question.title");
1109  if ($query_result->numRows() > 0)
1110  {
1111  while ($data = $ilDB->fetchAssoc($query_result))
1112  {
1113  if (in_array($data["question_id"], $question_ids))
1114  {
1115  array_push($found, array('id' => $data["question_id"],
1116  'title' => $data["title"],
1117  'description' => $data["description"],
1118  'type_tag' => $data["type_tag"]));
1119  }
1120  }
1121  }
1122  return $found;
1123  }
1124 
1125  /*
1126  * Remove all questions with tstamp = 0
1127  */
1128  public function purgeQuestions()
1129  {
1130  global $ilDB, $ilUser;
1131 
1132  $result = $ilDB->queryF("SELECT question_id FROM svy_question WHERE owner_fi = %s AND tstamp = %s",
1133  array("integer", "integer"),
1134  array($ilUser->getId(), 0)
1135  );
1136  while ($data = $ilDB->fetchAssoc($result))
1137  {
1138  $this->removeQuestion($data["question_id"]);
1139  }
1140  }
1141 
1147  public function copyToClipboard($question_id)
1148  {
1149  if (!array_key_exists("spl_clipboard", $_SESSION))
1150  {
1151  $_SESSION["spl_clipboard"] = array();
1152  }
1153  $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "copy");
1154  }
1155 
1161  public function moveToClipboard($question_id)
1162  {
1163  if (!array_key_exists("spl_clipboard", $_SESSION))
1164  {
1165  $_SESSION["spl_clipboard"] = array();
1166  }
1167  $_SESSION["spl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "move");
1168  }
1169 
1173  public function pasteFromClipboard()
1174  {
1175  global $ilDB;
1176 
1177  if (array_key_exists("spl_clipboard", $_SESSION))
1178  {
1179  foreach ($_SESSION["spl_clipboard"] as $question_object)
1180  {
1181  if (strcmp($question_object["action"], "move") == 0)
1182  {
1183  $result = $ilDB->queryF("SELECT obj_fi FROM svy_question WHERE question_id = %s",
1184  array('integer'),
1185  array($question_object["question_id"])
1186  );
1187  if ($result->numRows() == 1)
1188  {
1189  $row = $ilDB->fetchAssoc($result);
1190  $source_questionpool = $row["obj_fi"];
1191  if ($this->getId() != $source_questionpool)
1192  {
1193  // change the questionpool id in the qpl_questions table
1194  $affectedRows = $ilDB->manipulateF("UPDATE svy_question SET obj_fi = %s WHERE question_id = %s",
1195  array('integer','integer'),
1196  array($this->getId(), $question_object["question_id"])
1197  );
1198 
1199  // move question data to the new target directory
1200  $source_path = CLIENT_WEB_DIR . "/survey/" . $source_questionpool . "/" . $question_object["question_id"] . "/";
1201  if (@is_dir($source_path))
1202  {
1203  $target_path = CLIENT_WEB_DIR . "/survey/" . $this->getId() . "/";
1204  if (!@is_dir($target_path))
1205  {
1206  include_once "./Services/Utilities/classes/class.ilUtil.php";
1207  ilUtil::makeDirParents($target_path);
1208  }
1209  @rename($source_path, $target_path . $question_object["question_id"]);
1210  }
1211  }
1212  else
1213  {
1214  ilUtil::sendFailure($this->lng->txt("spl_move_same_pool"), true);
1215  return;
1216  }
1217  }
1218  }
1219  else
1220  {
1221  $this->copyQuestion($question_object["question_id"], $this->getId());
1222  }
1223  }
1224  }
1225  ilUtil::sendSuccess($this->lng->txt("spl_paste_success"), true);
1226  unset($_SESSION["spl_clipboard"]);
1227  }
1228 
1235  function setObligatoryStates($obligatory_questions)
1236  {
1237  global $ilDB;
1238 
1239  foreach($this->getQuestions() as $question_id)
1240  {
1241  $status = (int)(in_array($question_id, $obligatory_questions));
1242 
1243  $ilDB->manipulate("UPDATE svy_question".
1244  " SET obligatory = ".$ilDB->quote($status, "integer").
1245  " WHERE question_id = ".$ilDB->quote($question_id, "integer"));
1246  }
1247  }
1248 } // END class.ilSurveyObjQuestionPool
1249 ?>
< a tabindex="-1" style="border-style: none;" href="#" title="Refresh Image" onclick="document.getElementById('siimage').src = './securimage_show.php?sid=' + Math.random(); this.blur(); return false">< img src="./images/refresh.png" alt="Reload Image" height="32" width="32" onclick="this.blur()" align="bottom" border="0"/></a >< br/>< strong > Enter Code *if($_SERVER['REQUEST_METHOD']=='POST' &&@ $_POST['do']=='contact') $_SESSION['ctform']['success']
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.
$result
setTitle($a_title)
set title of survey question pool object
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.
getTitle()
get title of survey question pool object
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.
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.
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
& _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
Survey Question Import Parser.
_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.