ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilObjQuestionPool.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once "./Modules/Test/classes/inc.AssessmentConstants.php";
5 
17 {
23  var $online;
24 
30  private $showTaxonomies = null;
31 
37  private $navTaxonomyId = null;
38 
43 
48  private $import_dir;
49 
56  public function __construct($a_id = 0,$a_call_by_reference = true)
57  {
58  $this->type = "qpl";
59  parent::__construct($a_id,$a_call_by_reference);
60  $this->setOnline(0);
61 
62  $this->skillServiceEnabled = false;
63  }
64 
68  function create($a_upload = false)
69  {
70  parent::create();
71 
72  // meta data will be created by
73  // import parser
74  if (!$a_upload)
75  {
76  $this->createMetaData();
77  }
78  }
79 
86  function createReference()
87  {
88  $result = parent::createReference();
89  $this->saveToDb();
90  return $result;
91  }
92 
99  function update()
100  {
101  $this->updateMetaData();
102  if (!parent::update())
103  {
104  return false;
105  }
106 
107  // put here object specific stuff
108 
109  return true;
110  }
111 
112  function updateMetaData()
113  {
114  global $ilUser;
115  include_once "./Services/MetaData/classes/class.ilMD.php";
116  $md = new ilMD($this->getId(), 0, $this->getType());
117  $md_gen =& $md->getGeneral();
118  if ($md_gen == false)
119  {
120  include_once "./Services/MetaData/classes/class.ilMDCreator.php";
121  $md_creator = new ilMDCreator($this->getId(),0,$this->getType());
122  $md_creator->setTitle($this->getTitle());
123  $md_creator->setTitleLanguage($ilUser->getPref('language'));
124  $md_creator->create();
125  }
126  parent::updateMetaData();
127  }
128 
134  function read($a_force_db = false)
135  {
136  parent::read($a_force_db);
137  $this->loadFromDb();
138  }
139 
140 
147  function delete()
148  {
149  // always call parent delete function first!!
150  if (!parent::delete())
151  {
152  return false;
153  }
154 
155  // delete meta data
156  $this->deleteMetaData();
157 
158  //put here your module specific stuff
159  $this->deleteQuestionpool();
160 
161  require_once 'Modules/TestQuestionPool/classes/questions/class.ilAssQuestionSkillAssignmentImportFails.php';
162  $qsaImportFails = new ilAssQuestionSkillAssignmentImportFails($this->getId());
163  $qsaImportFails->deleteRegisteredImportFails();
164 
165  return true;
166  }
167 
169  {
170  $questions =& $this->getAllQuestions();
171 
172  if (count($questions))
173  {
174  foreach ($questions as $question_id)
175  {
176  $this->deleteQuestion($question_id);
177  }
178  }
179 
180  // delete export files
181  include_once "./Services/Utilities/classes/class.ilUtil.php";
182  $qpl_data_dir = ilUtil::getDataDir()."/qpl_data";
183  $directory = $qpl_data_dir."/qpl_".$this->getId();
184  if (is_dir($directory))
185  {
186  include_once "./Services/Utilities/classes/class.ilUtil.php";
187  ilUtil::delDir($directory);
188  }
189  }
190 
197  function deleteQuestion($question_id)
198  {
199  include_once "./Modules/Test/classes/class.ilObjTest.php";
200  include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
201 
202  $question = assQuestion::_instanciateQuestion($question_id);
203  $this->addQuestionChangeListeners($question);
204  $question->delete($question_id);
205  }
206 
210  public function addQuestionChangeListeners(assQuestion $question)
211  {
212  global $ilDB;
213 
214  foreach(ilObjTest::getPoolQuestionChangeListeners($ilDB, $this->getId()) as $listener)
215  {
216  $question->addQuestionChangeListener($listener);
217  }
218  }
219 
225  function loadFromDb()
226  {
227  global $ilDB;
228 
229  $result = $ilDB->queryF("SELECT * FROM qpl_questionpool WHERE obj_fi = %s",
230  array('integer'),
231  array($this->getId())
232  );
233  if ($result->numRows() == 1)
234  {
235  $row = $ilDB->fetchAssoc($result);
236  $this->setOnline($row['isonline']);
237  $this->setShowTaxonomies($row['show_taxonomies']);
238  $this->setNavTaxonomyId($row['nav_taxonomy']);
239  $this->setSkillServiceEnabled($row['skill_service']);
240  }
241  }
242 
248  function saveToDb()
249  {
250  global $ilDB;
251 
252  $result = $ilDB->queryF("SELECT id_questionpool FROM qpl_questionpool WHERE obj_fi = %s",
253  array('integer'),
254  array($this->getId())
255  );
256 
257  if ($result->numRows() == 1)
258  {
259  $result = $ilDB->update('qpl_questionpool',
260  array(
261  'isonline' => array('text', $this->getOnline()),
262  'show_taxonomies' => array('integer', (int)$this->getShowTaxonomies()),
263  'nav_taxonomy' => array('integer', (int)$this->getNavTaxonomyId()),
264  'skill_service' => array('integer', (int)$this->isSkillServiceEnabled()),
265  'tstamp' => array('integer', time())
266  ),
267  array(
268  'obj_fi' => array('integer', $this->getId())
269  )
270  );
271  }
272  else
273  {
274  $next_id = $ilDB->nextId('qpl_questionpool');
275 
276  $result = $ilDB->insert('qpl_questionpool', array(
277  'id_questionpool' => array('integer', $next_id),
278  'isonline' => array('text', $this->getOnline()),
279  'show_taxonomies' => array('integer', (int)$this->getShowTaxonomies()),
280  'nav_taxonomy' => array('integer', (int)$this->getNavTaxonomyId()),
281  'skill_service' => array('integer', (int)$this->isSkillServiceEnabled()),
282  'tstamp' => array('integer', time()),
283  'obj_fi' => array('integer', $this->getId())
284  ));
285  }
286  }
287 
295  function getQuestiontype($question_id)
296  {
297  global $ilDB;
298 
299  if ($question_id < 1)
300  {
301  return;
302  }
303 
304  $result = $ilDB->queryF("SELECT qpl_qst_type.type_tag FROM qpl_questions, qpl_qst_type WHERE qpl_questions.question_type_fi = qpl_qst_type.question_type_id AND qpl_questions.question_id = %s",
305  array('integer'),
306  array($question_id)
307  );
308  if ($result->numRows() == 1)
309  {
310  $data = $ilDB->fetchAssoc($result);
311  return $data["type_tag"];
312  }
313  else
314  {
315  return;
316  }
317  }
318 
324  function getDescription()
325  {
326  return parent::getDescription();
327  }
328 
332  function setDescription($a_description)
333  {
334  parent::setDescription($a_description);
335  }
336 
342  function getTitle()
343  {
344  return parent::getTitle();
345  }
346 
350  function setTitle($a_title)
351  {
352  parent::setTitle($a_title);
353  }
354 
362  function isInUse($question_id)
363  {
364  global $ilDB;
365 
366  $result = $ilDB->queryF("SELECT COUNT(solution_id) solution_count FROM tst_solutions WHERE question_fi = %s",
367  array('integer'),
368  array($question_id)
369  );
370  $row = $ilDB->fetchAssoc($result);
371  return $row["solution_count"];
372  }
373 
374  function &createQuestion($question_type, $question_id = -1)
375  {
376  include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
377  if ($question_id > 0) return assQuestion::_instanciateQuestionGUI($question_id);
378  assQuestion::_includeClass($question_type, 1);
379  $question_type_gui = $question_type . "GUI";
380  $question_gui = new $question_type_gui();
381  return $question_gui;
382  }
383 
390  function duplicateQuestion($question_id)
391  {
392  $question =& $this->createQuestion("", $question_id);
393  $newtitle = $question->object->getTitle();
394  if ($question->object->questionTitleExists($this->getId(), $question->object->getTitle()))
395  {
396  $counter = 2;
397  while ($question->object->questionTitleExists($this->getId(), $question->object->getTitle() . " ($counter)"))
398  {
399  $counter++;
400  }
401  $newtitle = $question->object->getTitle() . " ($counter)";
402  }
403  $new_id = $question->object->duplicate(false, $newtitle);
404  // update question count of question pool
406  return $new_id;
407  }
408 
416  function copyQuestion($question_id, $questionpool_to)
417  {
418  $question_gui =& $this->createQuestion("", $question_id);
419  if ($question_gui->object->getObjId() == $questionpool_to)
420  {
421  // the question is copied into the same question pool
422  return $this->duplicateQuestion($question_id);
423  }
424  else
425  {
426  // the question is copied into another question pool
427  $newtitle = $question_gui->object->getTitle();
428  if ($question_gui->object->questionTitleExists($this->getId(), $question_gui->object->getTitle()))
429  {
430  $counter = 2;
431  while ($question_gui->object->questionTitleExists($this->getId(), $question_gui->object->getTitle() . " ($counter)"))
432  {
433  $counter++;
434  }
435  $newtitle = $question_gui->object->getTitle() . " ($counter)";
436  }
437  return $question_gui->object->copyObject($this->getId(), $newtitle);
438  }
439  }
440 
446  public function getPrintviewQuestions()
447  {
448  global $ilDB;
449 
450  $query_result = $ilDB->queryF("SELECT qpl_questions.*, qpl_qst_type.type_tag, qpl_qst_type.plugin, qpl_questions.tstamp updated FROM qpl_questions, qpl_qst_type WHERE qpl_questions.original_id IS NULL AND qpl_questions.tstamp > 0 AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id AND qpl_questions.obj_fi = %s",
451  array('integer'),
452  array($this->getId())
453  );
454  $rows = array();
455  $types = $this->getQuestionTypeTranslations();
456  if ($query_result->numRows())
457  {
458  while ($row = $ilDB->fetchAssoc($query_result))
459  {
460  $row['ttype'] = $types[$row['type_tag']];
461  if ($row["plugin"])
462  {
463  if ($this->isPluginActive($row["type_tag"]))
464  {
465  array_push($rows, $row);
466  }
467  }
468  else
469  {
470  array_push($rows, $row);
471  }
472  }
473  }
474  return $rows;
475  }
476 
480  private function exportXMLSettings($xmlWriter)
481  {
482  $xmlWriter->xmlStartTag('Settings');
483 
484  $xmlWriter->xmlElement('ShowTaxonomies', null, (int)$this->getShowTaxonomies());
485  $xmlWriter->xmlElement('NavTaxonomy', null, (int)$this->getNavTaxonomyId());
486  $xmlWriter->xmlElement('SkillService', null, (int)$this->isSkillServiceEnabled());
487 
488  $xmlWriter->xmlEndTag('Settings');
489  }
490 
497  function objectToXmlWriter(ilXmlWriter &$a_xml_writer, $a_inst, $a_target_dir, &$expLog, $questions)
498  {
499  global $ilBench;
500 
501  $this->mob_ids = array();
502  $this->file_ids = array();
503 
504  $attrs = array();
505  $attrs["Type"] = "Questionpool_Test";
506  $a_xml_writer->xmlStartTag("ContentObject", $attrs);
507 
508  // MetaData
509  $this->exportXMLMetaData($a_xml_writer);
510 
511  // Settings
512  $this->exportXMLSettings($a_xml_writer);
513 
514  // PageObjects
515  $expLog->write(date("[y-m-d H:i:s] ")."Start Export Page Objects");
516  $ilBench->start("ContentObjectExport", "exportPageObjects");
517  $this->exportXMLPageObjects($a_xml_writer, $a_inst, $expLog, $questions);
518  $ilBench->stop("ContentObjectExport", "exportPageObjects");
519  $expLog->write(date("[y-m-d H:i:s] ")."Finished Export Page Objects");
520 
521  // MediaObjects
522  $expLog->write(date("[y-m-d H:i:s] ")."Start Export Media Objects");
523  $ilBench->start("ContentObjectExport", "exportMediaObjects");
524  $this->exportXMLMediaObjects($a_xml_writer, $a_inst, $a_target_dir, $expLog);
525  $ilBench->stop("ContentObjectExport", "exportMediaObjects");
526  $expLog->write(date("[y-m-d H:i:s] ")."Finished Export Media Objects");
527 
528  // FileItems
529  $expLog->write(date("[y-m-d H:i:s] ")."Start Export File Items");
530  $ilBench->start("ContentObjectExport", "exportFileItems");
531  $this->exportFileItems($a_target_dir, $expLog);
532  $ilBench->stop("ContentObjectExport", "exportFileItems");
533  $expLog->write(date("[y-m-d H:i:s] ")."Finished Export File Items");
534 
535  // skill assignments
536  $this->populateQuestionSkillAssignmentsXml($a_xml_writer, $questions);
537 
538  $a_xml_writer->xmlEndTag("ContentObject");
539  }
540 
545  protected function populateQuestionSkillAssignmentsXml(ilXmlWriter &$a_xml_writer, $questions)
546  {
547  global $ilDB;
548 
549  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionSkillAssignmentList.php';
550  $assignmentList = new ilAssQuestionSkillAssignmentList($ilDB);
551  $assignmentList->setParentObjId($this->getId());
552  $assignmentList->loadFromDb();
553  $assignmentList->loadAdditionalSkillData();
554 
555  require_once 'Modules/TestQuestionPool/classes/questions/class.ilAssQuestionSkillAssignmentExporter.php';
556  $skillQuestionAssignmentExporter = new ilAssQuestionSkillAssignmentExporter();
557  $skillQuestionAssignmentExporter->setXmlWriter($a_xml_writer);
558  $skillQuestionAssignmentExporter->setQuestionIds($questions);
559  $skillQuestionAssignmentExporter->setAssignmentList($assignmentList);
560  $skillQuestionAssignmentExporter->export();
561  }
562 
569  function exportXMLMetaData(&$a_xml_writer)
570  {
571  include_once("Services/MetaData/classes/class.ilMD2XML.php");
572  $md2xml = new ilMD2XML($this->getId(), 0, $this->getType());
573  $md2xml->setExportMode(true);
574  $md2xml->startExport();
575  $a_xml_writer->appendXML($md2xml->getXML());
576  }
577 
578  function modifyExportIdentifier($a_tag, $a_param, $a_value)
579  {
580  if ($a_tag == "Identifier" && $a_param == "Entry")
581  {
582  include_once "./Services/Utilities/classes/class.ilUtil.php";
583  $a_value = ilUtil::insertInstIntoID($a_value);
584  }
585 
586  return $a_value;
587  }
588 
589 
596  function exportXMLPageObjects(&$a_xml_writer, $a_inst, &$expLog, $questions)
597  {
598  global $ilBench;
599 
600  include_once "./Modules/LearningModule/classes/class.ilLMPageObject.php";
601 
602  foreach ($questions as $question_id)
603  {
604  $ilBench->start("ContentObjectExport", "exportPageObject");
605  $expLog->write(date("[y-m-d H:i:s] ")."Page Object ".$question_id);
606 
607  $attrs = array();
608  $a_xml_writer->xmlStartTag("PageObject", $attrs);
609 
610 
611  // export xml to writer object
612  $ilBench->start("ContentObjectExport", "exportPageObject_XML");
613  include_once("./Modules/TestQuestionPool/classes/class.ilAssQuestionPage.php");
614  $page_object = new ilAssQuestionPage($question_id);
615  $page_object->buildDom();
616  $page_object->insertInstIntoIDs($a_inst);
617  $mob_ids = $page_object->collectMediaObjects(false);
618  require_once 'Services/COPage/classes/class.ilPCFileList.php';
619  $file_ids = ilPCFileList::collectFileItems($page_object, $page_object->getDomDoc());
620  $xml = $page_object->getXMLFromDom(false, false, false, "", true);
621  $xml = str_replace("&","&amp;", $xml);
622  $a_xml_writer->appendXML($xml);
623  $page_object->freeDom();
624  unset ($page_object);
625 
626  $ilBench->stop("ContentObjectExport", "exportPageObject_XML");
627 
628  // collect media objects
629  $ilBench->start("ContentObjectExport", "exportPageObject_CollectMedia");
630  //$mob_ids = $page_obj->getMediaObjectIDs();
631  foreach($mob_ids as $mob_id)
632  {
633  $this->mob_ids[$mob_id] = $mob_id;
634  }
635  $ilBench->stop("ContentObjectExport", "exportPageObject_CollectMedia");
636 
637  // collect all file items
638  $ilBench->start("ContentObjectExport", "exportPageObject_CollectFileItems");
639  //$file_ids = $page_obj->getFileItemIds();
640  foreach($file_ids as $file_id)
641  {
642  $this->file_ids[$file_id] = $file_id;
643  }
644  $ilBench->stop("ContentObjectExport", "exportPageObject_CollectFileItems");
645 
646  $a_xml_writer->xmlEndTag("PageObject");
647  //unset($page_obj);
648 
649  $ilBench->stop("ContentObjectExport", "exportPageObject");
650 
651 
652  }
653  }
654 
661  function exportXMLMediaObjects(&$a_xml_writer, $a_inst, $a_target_dir, &$expLog)
662  {
663  include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
664 
665  foreach ($this->mob_ids as $mob_id)
666  {
667  $expLog->write(date("[y-m-d H:i:s] ")."Media Object ".$mob_id);
668  if (ilObjMediaObject::_exists($mob_id))
669  {
670  $media_obj = new ilObjMediaObject($mob_id);
671  $media_obj->exportXML($a_xml_writer, $a_inst);
672  $media_obj->exportFiles($a_target_dir);
673  unset($media_obj);
674  }
675  }
676  }
677 
682  function exportFileItems($a_target_dir, &$expLog)
683  {
684  include_once("./Modules/File/classes/class.ilObjFile.php");
685 
686  foreach ($this->file_ids as $file_id)
687  {
688  $expLog->write(date("[y-m-d H:i:s] ")."File Item ".$file_id);
689  $file_obj = new ilObjFile($file_id, false);
690  $file_obj->export($a_target_dir);
691  unset($file_obj);
692  }
693  }
694 
701  {
702  include_once "./Services/Utilities/classes/class.ilUtil.php";
703  $qpl_data_dir = ilUtil::getDataDir()."/qpl_data";
704  ilUtil::makeDir($qpl_data_dir);
705  if(!is_writable($qpl_data_dir))
706  {
707  $this->ilias->raiseError("Questionpool Data Directory (".$qpl_data_dir
708  .") not writeable.",$this->ilias->error_obj->FATAL);
709  }
710 
711  // create learning module directory (data_dir/lm_data/lm_<id>)
712  $qpl_dir = $qpl_data_dir."/qpl_".$this->getId();
713  ilUtil::makeDir($qpl_dir);
714  if(!@is_dir($qpl_dir))
715  {
716  $this->ilias->raiseError("Creation of Questionpool Directory failed.",$this->ilias->error_obj->FATAL);
717  }
718  // create Export subdirectory (data_dir/lm_data/lm_<id>/Export)
719  ilUtil::makeDir($this->getExportDirectory('xls'));
720  if(!@is_dir($this->getExportDirectory('xls')))
721  {
722  $this->ilias->raiseError("Creation of Export Directory failed.",$this->ilias->error_obj->FATAL);
723  }
724  ilUtil::makeDir($this->getExportDirectory('zip'));
725  if(!@is_dir($this->getExportDirectory('zip')))
726  {
727  $this->ilias->raiseError("Creation of Export Directory failed.",$this->ilias->error_obj->FATAL);
728  }
729  }
730 
734  function getExportDirectory($type = "")
735  {
736  include_once "./Services/Utilities/classes/class.ilUtil.php";
737  switch ($type)
738  {
739  case 'xml':
740  include_once("./Services/Export/classes/class.ilExport.php");
741  $export_dir = ilExport::_getExportDirectory($this->getId(), $type, $this->getType());
742  break;
743  case 'xls':
744  case 'zip':
745  $export_dir = ilUtil::getDataDir()."/qpl_data"."/qpl_".$this->getId()."/export_$type";
746  break;
747  default:
748  $export_dir = ilUtil::getDataDir()."/qpl_data"."/qpl_".$this->getId()."/export";
749  break;
750  }
751  return $export_dir;
752  }
753 
759  static function _createImportDirectory()
760  {
761  global $ilias;
762 
763  include_once "./Services/Utilities/classes/class.ilUtil.php";
764  $qpl_data_dir = ilUtil::getDataDir()."/qpl_data";
765  ilUtil::makeDir($qpl_data_dir);
766 
767  if(!is_writable($qpl_data_dir))
768  {
769  $ilias->raiseError("Questionpool Data Directory (".$qpl_data_dir
770  .") not writeable.",$ilias->error_obj->FATAL);
771  }
772 
773  // create questionpool directory (data_dir/qpl_data/qpl_import)
774  $qpl_dir = $qpl_data_dir."/qpl_import";
775  ilUtil::makeDir($qpl_dir);
776  if(!@is_dir($qpl_dir))
777  {
778  $ilias->raiseError("Creation of Questionpool Directory failed.",$ilias->error_obj->FATAL);
779  }
780  return $qpl_dir;
781  }
782 
786  public static function _setImportDirectory($a_import_dir = null)
787  {
788  if (strlen($a_import_dir))
789  {
790  $_SESSION["qpl_import_dir"] = $a_import_dir;
791  }
792  else
793  {
794  unset($_SESSION["qpl_import_dir"]);
795  }
796  }
797 
801  public static function _getImportDirectory()
802  {
803  if (strlen($_SESSION["qpl_import_dir"]))
804  {
805  return $_SESSION["qpl_import_dir"];
806  }
807  return null;
808  }
809 
811  {
813  }
814 
820  function &getAllQuestions()
821  {
822  global $ilDB;
823 
824  $result = $ilDB->queryF("SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND qpl_questions.tstamp > 0 AND original_id IS NULL",
825  array('integer'),
826  array($this->getId())
827  );
828  $questions = array();
829  while ($row = $ilDB->fetchAssoc($result))
830  {
831  array_push($questions, $row["question_id"]);
832  }
833  return $questions;
834  }
835 
836  function &getAllQuestionIds()
837  {
838  global $ilDB;
839 
840  $query_result = $ilDB->queryF("SELECT question_id, qpl_qst_type.type_tag, qpl_qst_type.plugin FROM qpl_questions, qpl_qst_type WHERE original_id IS NULL AND qpl_questions.tstamp > 0 AND obj_fi = %s AND complete = %s AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id",
841  array('integer','text'),
842  array($this->getId(), 1)
843  );
844  $questions = array();
845  if ($query_result->numRows())
846  {
847  while ($row = $ilDB->fetchAssoc($query_result))
848  {
849  if ($row["plugin"])
850  {
851  if ($this->isPluginActive($row["type_tag"]))
852  {
853  array_push($questions, $row["question_id"]);
854  }
855  }
856  else
857  {
858  array_push($questions, $row["question_id"]);
859  }
860  }
861  }
862  return $questions;
863  }
864 
865  public function checkQuestionParent($questionId)
866  {
867  global $DIC; /* @var ILIAS\DI\Container $DIC */
868 
869  $row = $DIC->database()->fetchAssoc($DIC->database()->queryF(
870  "SELECT COUNT(question_id) cnt FROM qpl_questions WHERE question_id = %s AND obj_fi = %s",
871  array('integer', 'integer'), array($questionId, $this->getId())
872  ));
873 
874  return (bool)$row['cnt'];
875  }
876 
881  function getImportMapping()
882  {
883  if (!is_array($this->import_mapping))
884  {
885  return array();
886  }
887  else
888  {
889  return $this->import_mapping;
890  }
891  }
892 
900  function questionsToXML($questions)
901  {
902  $xml = "";
903  // export button was pressed
904  if (count($questions) > 0)
905  {
906  foreach ($questions as $key => $value)
907  {
908  $question =& $this->createQuestion("", $value);
909  $xml .= $question->object->toXML();
910  }
911  if (count($questions) > 1)
912  {
913  $xml = preg_replace("/<\/questestinterop>\s*<.xml.*?>\s*<questestinterop>/", "", $xml);
914  }
915  }
916  $xml = preg_replace("/(<\?xml[^>]*?>)/", "\\1" . "<!DOCTYPE questestinterop SYSTEM \"ims_qtiasiv1p2p1.dtd\">", $xml);
917  return $xml;
918  }
919 
928  public static function _getQuestionCount($questionpool_id, $complete_questions_only = FALSE)
929  {
930  global $ilDB;
931  if ($complete_questions_only)
932  {
933  $result = $ilDB->queryF("SELECT COUNT(question_id) question_count FROM qpl_questions WHERE obj_fi = %s AND qpl_questions.tstamp > 0 AND original_id IS NULL AND complete = %s",
934  array('integer', 'text'),
935  array($questionpool_id, 1)
936  );
937  }
938  else
939  {
940  $result = $ilDB->queryF("SELECT COUNT(question_id) question_count FROM qpl_questions WHERE obj_fi = %s AND qpl_questions.tstamp > 0 AND original_id IS NULL",
941  array('integer'),
942  array($questionpool_id)
943  );
944  }
945  $row = $ilDB->fetchAssoc($result);
946  return $row["question_count"];
947  }
948 
956  function setOnline($a_online_status)
957  {
958  switch ($a_online_status)
959  {
960  case 0:
961  case 1:
962  $this->online = $a_online_status;
963  break;
964  default:
965  $this->online = 0;
966  break;
967  }
968  }
969 
970  function getOnline()
971  {
972  if (strcmp($this->online, "") == 0) $this->online = "0";
973  return $this->online;
974  }
975 
977  {
978  $this->showTaxonomies = $showTaxonomies;
979  }
980 
981  public function getShowTaxonomies()
982  {
983  return $this->showTaxonomies;
984  }
985 
987  {
988  $this->navTaxonomyId = $navTaxonomyId;
989  }
990 
991  public function getNavTaxonomyId()
992  {
993  return $this->navTaxonomyId;
994  }
995 
996  public function isNavTaxonomyActive()
997  {
998  return $this->getShowTaxonomies() && (int)$this->getNavTaxonomyId();
999  }
1000 
1001  public static function _lookupOnline($a_obj_id, $is_reference = FALSE)
1002  {
1003  global $ilDB;
1004 
1005  if ($is_reference)
1006  {
1007  $result = $ilDB->queryF("SELECT qpl_questionpool.isonline FROM qpl_questionpool,object_reference WHERE object_reference.ref_id = %s AND object_reference.obj_id = qpl_questionpool.obj_fi",
1008  array('integer'),
1009  array($a_obj_id)
1010  );
1011  }
1012  else
1013  {
1014  $result = $ilDB->queryF("SELECT isonline FROM qpl_questionpool WHERE obj_fi = %s",
1015  array('integer'),
1016  array($a_obj_id)
1017  );
1018  }
1019  if ($result->numRows() == 1)
1020  {
1021  $row = $ilDB->fetchAssoc($result);
1022  return $row["isonline"];
1023  }
1024  return 0;
1025  }
1026 
1033  public static function _hasEqualPoints($a_obj_id, $is_reference = FALSE)
1034  {
1035  global $ilDB;
1036 
1037  if ($is_reference)
1038  {
1039  $result = $ilDB->queryF("SELECT count(DISTINCT qpl_questions.points) equal_points FROM qpl_questions, object_reference WHERE object_reference.ref_id = %s AND qpl_questions.tstamp > 0 AND object_reference.obj_id = qpl_questions.obj_fi AND qpl_questions.original_id IS NULL",
1040  array('integer'),
1041  array($a_obj_id)
1042  );
1043  }
1044  else
1045  {
1046  $result = $ilDB->queryF("SELECT count(DISTINCT points) equal_points FROM qpl_questions WHERE obj_fi = %s AND qpl_questions.tstamp > 0 AND qpl_questions.original_id IS NULL",
1047  array('integer'),
1048  array($a_obj_id)
1049  );
1050  }
1051  if ($result->numRows() == 1)
1052  {
1053  $row = $ilDB->fetchAssoc($result);
1054  if ($row["equal_points"] == 1)
1055  {
1056  return 1;
1057  }
1058  else
1059  {
1060  return 0;
1061  }
1062  }
1063  return 0;
1064  }
1065 
1072  {
1073  global $ilDB;
1074 
1075  $success = false;
1076  if (array_key_exists("qpl_clipboard", $_SESSION))
1077  {
1078  $success = true;
1079  foreach ($_SESSION["qpl_clipboard"] as $question_object)
1080  {
1081  if (strcmp($question_object["action"], "move") == 0)
1082  {
1083  $result = $ilDB->queryF("SELECT obj_fi FROM qpl_questions WHERE question_id = %s",
1084  array('integer'),
1085  array($question_object["question_id"])
1086  );
1087  if ($result->numRows() == 1)
1088  {
1089  $row = $ilDB->fetchAssoc($result);
1090  $source_questionpool = $row["obj_fi"];
1091  // change the questionpool id in the qpl_questions table
1092  $affectedRows = $ilDB->manipulateF("UPDATE qpl_questions SET obj_fi = %s WHERE question_id = %s",
1093  array('integer','integer'),
1094  array($this->getId(), $question_object["question_id"])
1095  );
1096  if(!$affectedRows)
1097  {
1098  $success = false;
1099  }
1100 
1101  // move question data to the new target directory
1102  $source_path = CLIENT_WEB_DIR . "/assessment/" . $source_questionpool . "/" . $question_object["question_id"] . "/";
1103  if (@is_dir($source_path))
1104  {
1105  $target_path = CLIENT_WEB_DIR . "/assessment/" . $this->getId() . "/";
1106  if (!@is_dir($target_path))
1107  {
1108  include_once "./Services/Utilities/classes/class.ilUtil.php";
1109  ilUtil::makeDirParents($target_path);
1110  }
1111  rename($source_path, $target_path . $question_object["question_id"]);
1112  }
1113  // update question count of source question pool
1114  ilObjQuestionPool::_updateQuestionCount($source_questionpool);
1115  }
1116  }
1117  else
1118  {
1119  $new_question_id = $this->copyQuestion($question_object["question_id"], $this->getId());
1120  if(!$new_question_id)
1121  {
1122  $success = false;
1123  }
1124  }
1125  }
1126  }
1127  // update question count of question pool
1129  unset($_SESSION["qpl_clipboard"]);
1130 
1131  return (bool)$success;
1132  }
1133 
1140  function copyToClipboard($question_id)
1141  {
1142  if (!array_key_exists("qpl_clipboard", $_SESSION))
1143  {
1144  $_SESSION["qpl_clipboard"] = array();
1145  }
1146  $_SESSION["qpl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "copy");
1147  }
1148 
1155  function moveToClipboard($question_id)
1156  {
1157  if (!array_key_exists("qpl_clipboard", $_SESSION))
1158  {
1159  $_SESSION["qpl_clipboard"] = array();
1160  }
1161  $_SESSION["qpl_clipboard"][$question_id] = array("question_id" => $question_id, "action" => "move");
1162  }
1163 
1164  public function cleanupClipboard($deletedQuestionId)
1165  {
1166  if( !isset($_SESSION['qpl_clipboard']) )
1167  {
1168  return;
1169  }
1170 
1171  if( !isset($_SESSION['qpl_clipboard'][$deletedQuestionId]) )
1172  {
1173  return;
1174  }
1175 
1176  unset($_SESSION['qpl_clipboard'][$deletedQuestionId]);
1177 
1178  if( !count($_SESSION['qpl_clipboard']) )
1179  {
1180  unset($_SESSION['qpl_clipboard']);
1181  }
1182  }
1183 
1191  public static function _isWriteable($object_id, $user_id)
1192  {
1193  global $rbacsystem;
1194 
1195  include_once "./Services/Object/classes/class.ilObject.php";
1196  $refs = ilObject::_getAllReferences($object_id);
1197  if (count($refs))
1198  {
1199  foreach ($refs as $ref_id)
1200  {
1201  if ($rbacsystem->checkAccess("write", $ref_id) && (ilObject::_hasUntrashedReference($object_id)))
1202  {
1203  return true;
1204  }
1205  }
1206  }
1207  return false;
1208  }
1209 
1217  function &getQuestionDetails($question_ids)
1218  {
1219  global $ilDB;
1220 
1221  $result = array();
1222  $query_result = $ilDB->query("SELECT qpl_questions.*, qpl_qst_type.type_tag FROM qpl_questions, qpl_qst_type WHERE qpl_questions.question_type_fi = qpl_qst_type.question_type_id AND " . $ilDB->in('qpl_questions.question_id', $question_ids, false, 'integer') . " ORDER BY qpl_questions.title");
1223  if ($query_result->numRows())
1224  {
1225  while ($row = $ilDB->fetchAssoc($query_result))
1226  {
1227  array_push($result, $row);
1228  }
1229  }
1230  return $result;
1231  }
1232 
1241  function &getDeleteableQuestionDetails($question_ids)
1242  {
1243  global $ilDB, $ilLog;
1244 
1245  $result = array();
1246  $query_result = $ilDB->query("SELECT qpl_questions.*, qpl_qst_type.type_tag FROM qpl_questions, qpl_qst_type WHERE qpl_questions.question_type_fi = qpl_qst_type.question_type_id AND " . $ilDB->in('qpl_questions.question_id', $question_ids, false, 'integer') . " ORDER BY qpl_questions.title");
1247  if ($query_result->numRows())
1248  {
1249  include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
1250  while ($row = $ilDB->fetchAssoc($query_result))
1251  {
1252  if (!assQuestion::_isUsedInRandomTest($row["question_id"]))
1253  {
1254  array_push($result, $row);
1255  }
1256  else
1257  {
1258  // the question was used in a random test prior to ILIAS 3.7 so it was inserted
1259  // as a reference to the original question pool object and not as a copy. To allow
1260  // the deletion of the question pool object, a copy must be created and all database references
1261  // of the original question must changed with the reference of the copy
1262 
1263  // 1. Create a copy of the original question
1264  $question =& $this->createQuestion("", $row["question_id"]);
1265  $duplicate_id = $question->object->duplicate(true);
1266  if ($duplicate_id > 0)
1267  {
1268  // 2. replace the question id in the solutions
1269  $affectedRows = $ilDB->manipulateF("UPDATE tst_solutions SET question_fi = %s WHERE question_fi = %s",
1270  array('integer','integer'),
1271  array($duplicate_id, $row["question_id"])
1272  );
1273 
1274  // 3. replace the question id in the question list of random tests
1275  $affectedRows = $ilDB->manipulateF("UPDATE tst_test_rnd_qst SET question_fi = %s WHERE question_fi = %s",
1276  array('integer','integer'),
1277  array($duplicate_id, $row["question_id"])
1278  );
1279 
1280  // 4. replace the question id in the test results
1281  $affectedRows = $ilDB->manipulateF("UPDATE tst_test_result SET question_fi = %s WHERE question_fi = %s",
1282  array('integer','integer'),
1283  array($duplicate_id, $row["question_id"])
1284  );
1285 
1286  // 5. replace the question id in the test&assessment log
1287  $affectedRows = $ilDB->manipulateF("UPDATE ass_log SET question_fi = %s WHERE question_fi = %s",
1288  array('integer','integer'),
1289  array($duplicate_id, $row["question_id"])
1290  );
1291 
1292  // 6. The original question can be deleted, so add it to the list of questions
1293  array_push($result, $row);
1294  }
1295  }
1296  }
1297  }
1298  return $result;
1299  }
1300 
1308  {
1309  global $tree;
1310  $path = $tree->getPathFull($ref_id);
1311  $items = array();
1312  $counter = 0;
1313  foreach ($path as $item)
1314  {
1315  if (($counter > 0) && ($counter < count($path)-1))
1316  {
1317  array_push($items, $item["title"]);
1318  }
1319  $counter++;
1320  }
1321  $fullpath = join(" > ", $items);
1322  include_once "./Services/Utilities/classes/class.ilStr.php";
1323  if (strlen($fullpath) > 60)
1324  {
1325  $fullpath = ilStr::subStr($fullpath, 0, 30) . "..." . ilStr::subStr($fullpath, ilStr::strLen($fullpath)-30, 30);
1326  }
1327  return $fullpath;
1328  }
1329 
1336  public static function _getAvailableQuestionpools($use_object_id = FALSE, $equal_points = FALSE, $could_be_offline = FALSE, $showPath = FALSE, $with_questioncount = FALSE, $permission = "read", $usr_id = "")
1337  {
1338  global $ilUser, $ilDB, $lng;
1339 
1340  $result_array = array();
1341  $permission = (strlen($permission) == 0) ? "read" : $permission;
1342  $qpls = ilUtil::_getObjectsByOperations("qpl", $permission, (strlen($usr_id)) ? $usr_id : $ilUser->getId(), -1);
1343  $obj_ids = array();
1344  foreach ($qpls as $ref_id)
1345  {
1346  $obj_id = ilObject::_lookupObjId($ref_id);
1347  $obj_ids[$ref_id] = $obj_id;
1348  }
1349  $titles = ilObject::_prepareCloneSelection($qpls, "qpl");
1350  if (count($obj_ids))
1351  {
1352  $in = $ilDB->in('object_data.obj_id', $obj_ids, false, 'integer');
1353  if ($could_be_offline)
1354  {
1355  $result = $ilDB->query("SELECT qpl_questionpool.*, object_data.title FROM qpl_questionpool, object_data WHERE ".
1356  "qpl_questionpool.obj_fi = object_data.obj_id AND $in ORDER BY object_data.title");
1357  }
1358  else
1359  {
1360  $result = $ilDB->queryF("SELECT qpl_questionpool.*, object_data.title FROM qpl_questionpool, object_data WHERE ".
1361  "qpl_questionpool.obj_fi = object_data.obj_id AND $in AND qpl_questionpool.isonline = %s ".
1362  "ORDER BY object_data.title",
1363  array('text'),
1364  array(1)
1365  );
1366  }
1367  while ($row = $ilDB->fetchAssoc($result))
1368  {
1369  $add = TRUE;
1370  if ($equal_points)
1371  {
1372  if (!ilObjQuestionPool::_hasEqualPoints($row["obj_fi"]))
1373  {
1374  $add = FALSE;
1375  }
1376  }
1377  if ($add)
1378  {
1379  $ref_id = array_search($row["obj_fi"], $obj_ids);
1380  $title = (($showPath) ? $titles[$ref_id] : $row["title"]);
1381  if ($with_questioncount)
1382  {
1383  $title .= " [" . $row["questioncount"] . " " . ($row["questioncount"] == 1 ? $lng->txt("ass_question") : $lng->txt("assQuestions")) . "]";
1384  }
1385 
1386  if ($use_object_id)
1387  {
1388  $result_array[$row["obj_fi"]] = array(
1389  'qpl_id' => $row['obj_fi'],
1390  'qpl_title' => $row['title'],
1391  "title" => $title,
1392  "count" => $row["questioncount"]
1393  );
1394  }
1395  else
1396  {
1397  $result_array[$ref_id] = array(
1398  'qpl_id' => $row['obj_fi'],
1399  'qpl_title' => $row['title'],
1400  "title" => $title,
1401  "count" => $row["questioncount"]
1402  );
1403  }
1404  }
1405  }
1406  }
1407  return $result_array;
1408  }
1409 
1410  function &getQplQuestions()
1411  {
1412  global $ilDB;
1413 
1414  $questions = array();
1415  $result = $ilDB->queryF("SELECT qpl_questions.question_id FROM qpl_questions WHERE qpl_questions.original_id IS NULL AND qpl_questions.tstamp > 0 AND qpl_questions.obj_fi = %s",
1416  array('integer'),
1417  array($this->getId())
1418  );
1419  while ($row = $ilDB->fetchAssoc($result))
1420  {
1421  array_push($questions, $row["question_id"]);
1422  }
1423  return $questions;
1424  }
1425 
1431  function cloneObject($a_target_id,$a_copy_id = 0, $a_omit_tree = false)
1432  {
1433  global $ilLog;
1434 
1435  $newObj = parent::cloneObject($a_target_id,$a_copy_id, $a_omit_tree);
1436 
1437  //copy online status if object is not the root copy object
1438  $cp_options = ilCopyWizardOptions::_getInstance($a_copy_id);
1439 
1440  if(!$cp_options->isRootNode($this->getRefId()))
1441  {
1442  $newObj->setOnline($this->getOnline());
1443  }
1444 
1445  $newObj->setSkillServiceEnabled($this->isSkillServiceEnabled());
1446  $newObj->setShowTaxonomies($this->getShowTaxonomies());
1447  $newObj->saveToDb();
1448 
1449  // clone the questions in the question pool
1450  $questions =& $this->getQplQuestions();
1451  $questionIdsMap = array();
1452  foreach ($questions as $question_id)
1453  {
1454  $newQuestionId = $newObj->copyQuestion($question_id, $newObj->getId());
1455  $questionIdsMap[$question_id] = $newQuestionId;
1456  }
1457 
1458  // clone meta data
1459  include_once "./Services/MetaData/classes/class.ilMD.php";
1460  $md = new ilMD($this->getId(),0,$this->getType());
1461  $new_md =& $md->cloneMD($newObj->getId(),0,$newObj->getType());
1462 
1463  // update the metadata with the new title of the question pool
1464  $newObj->updateMetaData();
1465 
1466  require_once 'Modules/TestQuestionPool/classes/class.ilQuestionPoolTaxonomiesDuplicator.php';
1467  $duplicator = new ilQuestionPoolTaxonomiesDuplicator();
1468  $duplicator->setSourceObjId($this->getId());
1469  $duplicator->setSourceObjType($this->getType());
1470  $duplicator->setTargetObjId($newObj->getId());
1471  $duplicator->setTargetObjType($newObj->getType());
1472  $duplicator->setQuestionIdMapping($questionIdsMap);
1473  $duplicator->duplicate($duplicator->getAllTaxonomiesForSourceObject());
1474 
1475  $duplicatedTaxKeyMap = $duplicator->getDuplicatedTaxonomiesKeysMap();
1476  $newObj->setNavTaxonomyId($duplicatedTaxKeyMap->getMappedTaxonomyId($this->getNavTaxonomyId()));
1477  $newObj->saveToDb();
1478 
1479  return $newObj;
1480  }
1481 
1482  function getQuestionTypes($all_tags = FALSE, $fixOrder = false)
1483  {
1484  return self::_getQuestionTypes($all_tags, $fixOrder);
1485  }
1486 
1487  public static function _getQuestionTypes($all_tags = FALSE, $fixOrder = false)
1488  {
1489  global $ilDB;
1490  global $lng;
1491 
1492  include_once "./Modules/Test/classes/class.ilObjAssessmentFolder.php";
1494  $lng->loadLanguageModule("assessment");
1495  $result = $ilDB->query("SELECT * FROM qpl_qst_type");
1496  $types = array();
1497  while ($row = $ilDB->fetchAssoc($result))
1498  {
1499  if ($all_tags || (!in_array($row["question_type_id"], $forbidden_types)))
1500  {
1501  global $ilLog;
1502 
1503  if ($row["plugin"] == 0)
1504  {
1505  $types[$lng->txt($row["type_tag"])] = $row;
1506  }
1507  else
1508  {
1509  global $ilPluginAdmin;
1510  $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "TestQuestionPool", "qst");
1511  foreach ($pl_names as $pl_name)
1512  {
1513  $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "TestQuestionPool", "qst", $pl_name);
1514  if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0)
1515  {
1516  $types[$pl->getQuestionTypeTranslation()] = $row;
1517  }
1518  }
1519  }
1520  }
1521  }
1522 
1523  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionTypeOrderer.php';
1525  $orderer = new ilAssQuestionTypeOrderer($types, $orderMode);
1526  $types = $orderer->getOrderedTypes();
1527 
1528  return $types;
1529  }
1530 
1531  public static function getQuestionTypeByTypeId($type_id)
1532  {
1533  global $ilDB;
1534 
1535  $query = "SELECT type_tag FROM qpl_qst_type WHERE question_type_id = %s";
1536  $types = array('integer');
1537  $values = array($type_id);
1538  $result = $ilDB->queryF($query, $types, $values);
1539 
1540  if($row = $ilDB->fetchAssoc($result))
1541  {
1542  return $row['type_tag'];
1543  }
1544  }
1545 
1546  public static function getQuestionTypeTranslations()
1547  {
1548  global $ilDB;
1549  global $lng;
1550  global $ilLog;
1551  global $ilPluginAdmin;
1552 
1553  $lng->loadLanguageModule("assessment");
1554  $result = $ilDB->query("SELECT * FROM qpl_qst_type");
1555  $types = array();
1556  while ($row = $ilDB->fetchAssoc($result))
1557  {
1558  if ($row["plugin"] == 0)
1559  {
1560  $types[$row['type_tag']] = $lng->txt($row["type_tag"]);
1561  }
1562  else
1563  {
1564  $pl_names = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "TestQuestionPool", "qst");
1565  foreach ($pl_names as $pl_name)
1566  {
1567  $pl = ilPlugin::getPluginObject(IL_COMP_MODULE, "TestQuestionPool", "qst", $pl_name);
1568  if (strcmp($pl->getQuestionType(), $row["type_tag"]) == 0)
1569  {
1570  $types[$row['type_tag']] = $pl->getQuestionTypeTranslation();
1571  }
1572  }
1573  }
1574  }
1575  ksort($types);
1576  return $types;
1577  }
1578 
1584  static function &_getSelfAssessmentQuestionTypes($all_tags = FALSE)
1585  {
1586 /* $allowed_types = array(
1587  "assSingleChoice" => 1,
1588  "assMultipleChoice" => 2,
1589  "assClozeTest" => 3,
1590  "assMatchingQuestion" => 4,
1591  "assOrderingQuestion" => 5,
1592  "assOrderingHorizontal" => 6,
1593  "assImagemapQuestion" => 7,
1594  "assTextQuestion" => 8,
1595  "assTextSubset" => 9,
1596  "assErrorText" => 10
1597  );*/
1598  $allowed_types = array(
1599  "assSingleChoice" => 1,
1600  "assMultipleChoice" => 2,
1601  "assKprimChoice" => 3,
1602  "assClozeTest" => 4,
1603  "assMatchingQuestion" => 5,
1604  "assOrderingQuestion" => 6,
1605  "assOrderingHorizontal" => 7,
1606  "assImagemapQuestion" => 8,
1607  "assTextSubset" => 9,
1608  "assErrorText" => 10,
1609  "assLongMenu" => 11
1610  );
1611  $satypes = array();
1612  $qtypes = ilObjQuestionPool::_getQuestionTypes($all_tags);
1613  foreach($qtypes as $k => $t)
1614  {
1615  //if (in_array($t["type_tag"], $allowed_types))
1616  if (isset($allowed_types[$t["type_tag"]]))
1617  {
1618  $t["order"] = $allowed_types[$t["type_tag"]];
1619  $satypes[$k] = $t;
1620  }
1621  }
1622  return $satypes;
1623  }
1624 
1625 
1626  function &getQuestionList()
1627  {
1628  global $ilDB;
1629 
1630  $questions = array();
1631  $result = $ilDB->queryF("SELECT qpl_questions.*, qpl_qst_type.* FROM qpl_questions, qpl_qst_type WHERE qpl_questions.original_id IS NULL AND qpl_questions.obj_fi = %s AND qpl_questions.tstamp > 0 AND qpl_questions.question_type_fi = qpl_qst_type.question_type_id",
1632  array('integer'),
1633  array($this->getId())
1634  );
1635  while ($row = $ilDB->fetchAssoc($result))
1636  {
1637  array_push($questions, $row);
1638  }
1639  return $questions;
1640  }
1641 
1648  public static function _updateQuestionCount($object_id)
1649  {
1650  global $ilDB;
1651  $result = $ilDB->manipulateF("UPDATE qpl_questionpool SET questioncount = %s, tstamp = %s WHERE obj_fi = %s",
1652  array('integer','integer','integer'),
1653  array(ilObjQuestionPool::_getQuestionCount($object_id, TRUE), time(), $object_id)
1654  );
1655  }
1656 
1663  function isPluginActive($questionType)
1664  {
1665  /* @var ilPluginAdmin $ilPluginAdmin */
1666  global $ilPluginAdmin;
1667 
1668  $plugins = $ilPluginAdmin->getActivePluginsForSlot(IL_COMP_MODULE, "TestQuestionPool", "qst");
1669  foreach($plugins as $pluginName)
1670  {
1671  if( $pluginName == $questionType ) // plugins having pname == qtype
1672  {
1673  return true;
1674  }
1675 
1676  /* @var ilQuestionsPlugin $plugin */
1677  $plugin = ilPlugin::getPluginObject(IL_COMP_MODULE, "TestQuestionPool", "qst", $pluginName);
1678 
1679  if($plugin->getQuestionType() == $questionType) // plugins havin an independent name
1680  {
1681  return true;
1682  }
1683  }
1684 
1685  return false;
1686  }
1687 
1688  /*
1689  * Remove all questions with owner = 0
1690  */
1691  public function purgeQuestions()
1692  {
1693  global $ilDB, $ilUser;
1694 
1695  require_once 'Modules/TestQuestionPool/classes/class.ilAssIncompleteQuestionPurger.php';
1696  $incompleteQuestionPurger = new ilAssIncompleteQuestionPurger($ilDB);
1697  $incompleteQuestionPurger->setOwnerId($ilUser->getId());
1698  $incompleteQuestionPurger->purge();
1699  }
1700 
1706  public function getTaxonomyIds()
1707  {
1708  require_once 'Services/Taxonomy/classes/class.ilObjTaxonomy.php';
1709  return ilObjTaxonomy::getUsageOfObject( $this->getId() );
1710  }
1711 
1715  public function isSkillServiceEnabled()
1716  {
1718  }
1719 
1724  {
1725  $this->skillServiceEnabled = $skillServiceEnabled;
1726  }
1727 
1729 
1730  public static function isSkillManagementGloballyActivated()
1731  {
1732  if( self::$isSkillManagementGloballyActivated === null )
1733  {
1734  include_once 'Services/Skill/classes/class.ilSkillManagementSettings.php';
1735  $skmgSet = new ilSkillManagementSettings();
1736 
1737  self::$isSkillManagementGloballyActivated = $skmgSet->isActivated();
1738  }
1739 
1740  return self::$isSkillManagementGloballyActivated;
1741  }
1742 
1743  public function fromXML($xmlFile)
1744  {
1745  require_once 'Modules/TestQuestionPool/classes/class.ilObjQuestionPoolXMLParser.php';
1746  $parser = new ilObjQuestionPoolXMLParser($this, $xmlFile);
1747  $parser->startParsing();
1748  }
1749 } // END class.ilObjQuestionPool
1750 ?>
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.
const ORDER_MODE_FIX
order mode with fixed priority for ordering
static getPoolQuestionChangeListeners(ilDBInterface $db, $poolObjId)
exportXMLMetaData(&$a_xml_writer)
export content objects meta data to xml (see ilias_co.dtd)
setTitle($a_title)
set title of glossary object
$path
Definition: aliased.php:25
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
exportXMLPageObjects(&$a_xml_writer, $a_inst, &$expLog, $questions)
export page objects to xml (see ilias_co.dtd)
static _includeClass($question_type, $gui=0)
Include the php class file for a given question type.
static _hasUntrashedReference($a_obj_id)
checks wether an object has at least one reference that is not in trash
static strLen($a_string)
Definition: class.ilStr.php:91
static _isWriteable($object_id, $user_id)
Returns true, if the question pool is writeable by a given user.
populateQuestionSkillAssignmentsXml(ilXmlWriter &$a_xml_writer, $questions)
const ORDER_MODE_ALPHA
order mode that orders by alphanumerical priority
exportFileItems($a_target_dir, &$expLog)
export files of file itmes
moveToClipboard($question_id)
Moves a question to the clipboard.
exportXMLMediaObjects(&$a_xml_writer, $a_inst, $a_target_dir, &$expLog)
export media objects to xml (see ilias_co.dtd)
static _prepareCloneSelection($a_ref_ids, $new_type, $show_path=true)
Prepare copy wizard object selection.
$_SESSION["AccountId"]
$result
static _exists($a_id, $a_reference=false, $a_type=NULL)
checks wether a lm content object with specified id exists or not
static getUsageOfObject($a_obj_id, $a_include_titles=false)
Get usage of object.
addQuestionChangeListeners(assQuestion $question)
static _isUsedInRandomTest($question_id="")
Checks whether the question is used in a random test or not.
static _getQuestionTypes($all_tags=FALSE, $fixOrder=false)
getQuestiontype($question_id)
Returns the question type of a question with a given id.
setNavTaxonomyId($navTaxonomyId)
pasteFromClipboard()
Copies/Moves a question from the clipboard.
Abstract basic class which is to be extended by the concrete assessment question type classes...
objectToXmlWriter(ilXmlWriter &$a_xml_writer, $a_inst, $a_target_dir, &$expLog, $questions)
export pages of test to xml (see ilias_co.dtd)
static _getQuestionCount($questionpool_id, $complete_questions_only=FALSE)
Returns the number of questions in a question pool.
Class ilObject Basic functions for all objects.
static getQuestionTypeByTypeId($type_id)
static & _instanciateQuestionGUI($question_id)
Creates an instance of a question gui with a given question id.
xmlStartTag($tag, $attrs=NULL, $empty=FALSE, $encode=TRUE, $escape=TRUE)
Writes a starttag.
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($type="")
get export directory of questionpool
getDescription()
get description of content object
deleteQuestion($question_id)
Deletes a question from the question pool.
createReference()
Creates a database reference id for the object (saves the object to the database and creates a refere...
createMetaData()
create meta data entry
_getFullPathToQpl($ref_id)
Retrieves the full path to a question pool with a given reference id.
XML writer class.
Question page object.
getPrintviewQuestions()
Calculates the data for the print view of the questionpool.
& getQuestionDetails($question_ids)
Returns an array containing the qpl_question and qpl_qst_type fields for an array of question ids...
copyQuestion($question_id, $questionpool_to)
Copies a question into another question pool.
getImportMapping()
get array of (two) new created questions for import id
saveToDb()
Saves a ilObjQuestionpool object to a database.
static _getAllReferences($a_id)
get all reference ids of object
xmlEndTag($tag)
Writes an endtag.
setOnline($a_online_status)
Sets the questionpool online status.
setSkillServiceEnabled($skillServiceEnabled)
modifyExportIdentifier($a_tag, $a_param, $a_value)
$counter
duplicateQuestion($question_id)
Duplicates a question for a questionpool.
setShowTaxonomies($showTaxonomies)
questionsToXML($questions)
Returns a QTI xml representation of a list of questions.
static _getInstance($a_copy_id)
Get instance of copy wizard options.
getQuestionTypes($all_tags=FALSE, $fixOrder=false)
static _updateQuestionCount($object_id)
Updates the number of available questions for a question pool in the database.
static _lookupOnline($a_obj_id, $is_reference=FALSE)
$success
Definition: Utf8Test.php:86
static _hasEqualPoints($a_obj_id, $is_reference=FALSE)
Checks a question pool for questions with the same maximum points.
getId()
get object id public
static _lookupObjId($a_id)
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
__construct($a_id=0, $a_call_by_reference=true)
Constructor public.
static collectFileItems($a_page, $a_domdoc)
Get all file items that are used within the page.
static _getForbiddenQuestionTypes()
Returns the forbidden questiontypes for ILIAS.
Class ilObjFile.
cleanupClipboard($deletedQuestionId)
static _setImportDirectory($a_import_dir=null)
set import directory
const IL_COMP_MODULE
$ilUser
Definition: imgupload.php:18
redirection script todo: (a better solution should control the processing via a xml file) ...
update()
update object data
createExportDirectory()
creates data directory for export files (data_dir/qpl_data/qpl_<id>/export, depending on data directo...
& createQuestion($question_type, $question_id=-1)
Class ilObjMediaObject.
copyToClipboard($question_id)
Copies a question to the clipboard.
read($a_force_db=false)
read object data from db into object
getType()
get object type public
Create styles array
The data for the language used.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
if(php_sapi_name() !='cli') $in
Definition: Utf8Test.php:37
getTitle()
get title of glossary object
isPluginActive($questionType)
Checks wheather or not a question plugin with a given name is active.
& getAllQuestions()
Retrieve an array containing all question ids of the questionpool.
$parser
Definition: BPMN2Parser.php:24
static getDataDir()
get data directory (outside webspace)
static & _getSelfAssessmentQuestionTypes($all_tags=FALSE)
Get all self assessment question types.
global $ilBench
Definition: ilias.php:18
global $ilDB
getTaxonomyIds()
get ids of all taxonomies corresponding to current pool
loadFromDb()
Loads a ilObjQuestionpool object from a database.
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.
static _getExportDirectory($a_obj_id, $a_type="xml", $a_obj_type="", $a_entity="")
Get export directory for an repository object.
static insertInstIntoID($a_value)
inserts installation id into ILIAS id
deleteMetaData()
delete meta data entry
global $DIC
static _getImportDirectory()
get import directory of lm
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
addQuestionChangeListener(ilQuestionChangeListener $listener)
static subStr($a_str, $a_start, $a_length=NULL)
Definition: class.ilStr.php:15
static _createImportDirectory()
creates data directory for import files (data_dir/qpl_data/qpl_<id>/import, depending on data directo...
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, $equal_points=FALSE, $could_be_offline=FALSE, $showPath=FALSE, $with_questioncount=FALSE, $permission="read", $usr_id="")
Returns the available question pools for the active user.
setDescription($a_description)
set description of content object
create($a_upload=false)
create questionpool object
isInUse($question_id)
Checks whether the question is in use or not.
& getDeleteableQuestionDetails($question_ids)
Returns an array containing the qpl_question and qpl_qst_type fields of deleteable questions for an a...