ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5
class.ilSurveyPageGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
15 {
16  protected $ref_id; // [int]
17  protected $lng; // [object]
18  protected $object; // [ilObjSurvey]
19  protected $editor_gui; // [ilSurveyEditorGUI]
20  protected $current_page; // [int]
21  protected $has_previous_page; // [bool]
22  protected $has_next_page; // [bool]
23  protected $has_datasets; // [bool]
24  protected $use_pool; // [bool]
25 
32  function __construct(ilObjSurvey $a_survey, ilSurveyEditorGUI $a_survey_editor_gui)
33  {
34  $this->editor_gui = $a_survey_editor_gui;
35  $this->ref_id = $a_survey->getRefId();
36  $this->object = $a_survey;
37  }
38 
42  function executeCommand()
43  {
44  global $lng, $ilCtrl, $rbacsystem;
45 
46  $cmd = $ilCtrl->getCmd("renderPage");
47  $next_class = $ilCtrl->getNextClass($this);
48 
49  switch($next_class)
50  {
51  default:
52  $this->determineCurrentPage();
53 
54  $has_content = false;
55 
56  if($rbacsystem->checkAccess("write", $this->ref_id))
57  {
58  // add page?
59  if($_REQUEST["new_id"])
60  {
61  $this->insertNewQuestion($_REQUEST["new_id"]);
62  }
63 
64  // subcommands
65  if($_REQUEST["il_hform_subcmd"])
66  {
67  $subcmd = $_REQUEST["il_hform_subcmd"];
68 
69  // make sure that it is set for current and next requests
70  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
72 
73  $id = explode("_", $_REQUEST["il_hform_node"]);
74  $id = (int)$id[1];
75 
76  // multi operation
77  if(substr($_REQUEST["il_hform_subcmd"], 0, 5) == "multi")
78  {
79  if($_REQUEST["il_hform_multi"])
80  {
81  // removing types as we only allow questions anyway
82  $id = array();
83  foreach(explode(";", $_REQUEST["il_hform_multi"]) as $item)
84  {
85  $id[] = (int)array_pop(explode("_", $item));
86  }
87 
88  if($subcmd == "multiDelete")
89  {
90  $subcmd = "deleteQuestion";
91  }
92  }
93  else
94  {
95  // #9525
96  if($subcmd == "multiDelete")
97  {
98  ilUtil::sendFailure($lng->txt("no_checkbox"), true);
99  $ilCtrl->redirect($this, "renderPage");
100  }
101  else
102  {
103  ilUtil::sendFailure($lng->txt("no_checkbox"));
104  }
105  }
106  }
107 
108  if(substr($subcmd, 0, 11) == "addQuestion")
109  {
110  $type = explode("_", $subcmd);
111  $type = (int)$type[1];
112  $has_content = $this->addQuestion($type, $this->object->isPoolActive(), $id, $_REQUEST["il_hform_node"]);
113  }
114  else
115  {
116  $has_content = $this->$subcmd($id, $_REQUEST["il_hform_node"]);
117  }
118  }
119  }
120 
121  if(!$has_content)
122  {
123  $this->$cmd();
124  }
125  break;
126  }
127  }
128 
132  public function determineCurrentPage()
133  {
134  $current_page = (int)$_REQUEST["jump"];
135  if(!$current_page)
136  {
137  $current_page = (int)$_REQUEST["pgov"];
138  }
139  if(!$current_page)
140  {
141  $current_page = (int)$_REQUEST["pg"];
142  }
143  if(!$current_page)
144  {
145  $current_page = 1;
146  }
147  $this->current_page = $current_page;
148  }
149 
156  protected function appendNewQuestionToSurvey($a_new_id, $a_duplicate = true, $a_force_duplicate = false)
157  {
158  global $ilDB;
159 
160  // get maximum sequence index in test
161  $result = $ilDB->queryF("SELECT survey_question_id FROM svy_svy_qst WHERE survey_fi = %s",
162  array('integer'),
163  array($this->object->getSurveyId())
164  );
165  $sequence = $result->numRows();
166 
167  // create duplicate if pool question (or forced for question blocks copy)
168  if($a_duplicate)
169  {
170  $survey_question_id = $this->object->duplicateQuestionForSurvey($a_new_id, $a_force_duplicate);
171  }
172  // used by copy & paste
173  else
174  {
175  $survey_question_id = $a_new_id;
176  }
177 
178  // append to survey
179  $next_id = $ilDB->nextId('svy_svy_qst');
180  $affectedRows = $ilDB->manipulateF("INSERT INTO svy_svy_qst (survey_question_id, survey_fi,".
181  "question_fi, sequence, tstamp) VALUES (%s, %s, %s, %s, %s)",
182  array('integer', 'integer', 'integer', 'integer', 'integer'),
183  array($next_id, $this->object->getSurveyId(), $survey_question_id, $sequence, time())
184  );
185 
186  return $survey_question_id;
187  }
188 
194  public function insertNewQuestion($a_new_id)
195  {
196  global $rbacsystem, $ilDB, $lng;
197 
198  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
199  if (!SurveyQuestion::_isComplete($a_new_id))
200  {
201  ilUtil::sendFailure($lng->txt("survey_error_insert_incomplete_question"));
202  }
203  else
204  {
205  $a_new_id = $this->appendNewQuestionToSurvey($a_new_id);
206  $this->object->loadQuestionsFromDb();
207 
208  $pos = $_REQUEST["pgov_pos"];
209 
210  // a[fter]/b[efore] on same page
211  if(substr($pos, -1) != "c")
212  {
213  // block handling
214  $current = $this->object->getSurveyPages();
215  $current = $current[$this->current_page-1];
216  if(sizeof($current) == 1)
217  {
218  // as questions are moved to first block question
219  // always use existing as first
220  // the new question is moved later on (see below)
221  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
222  array((int)$pos, $a_new_id));
223  }
224  else
225  {
226  $block_id = array_pop($current);
227  $block_id = $block_id["questionblock_id"];
228 
229  $this->object->addQuestionToBlock($a_new_id, $block_id);
230  }
231  }
232  // c: as new page (from toolbar/pool)
233  else
234  {
235  // after given question
236  if((int)$pos)
237  {
238  $pos = (int)$pos."a";
239  $this->current_page++;
240  }
241  // at the beginning
242  else
243  {
244  $first = $this->object->getSurveyPages();
245  $first = $first[0];
246  $first = array_shift($first);
247  $pos = $first["question_id"]."b";
248  $this->current_page = 1;
249  }
250  }
251 
252  // move to target position
253  $this->object->moveQuestions(array($a_new_id), (int)$pos,
254  ((substr($pos, -1) == "a") ? 1 : 0));
255  }
256  }
257 
263  public function insertQuestionBlock($a_block_id)
264  {
265  $new_ids = array();
266  $question_ids = $this->object->getQuestionblockQuestionIds($a_block_id);
267  foreach($question_ids as $qid)
268  {
269  $new_ids[] = $this->appendNewQuestionToSurvey($qid, true, true);
270  }
271 
272  if(sizeof($new_ids))
273  {
274  $this->object->loadQuestionsFromDb();
275 
276  $pos = $_REQUEST["pgov_pos"];
277 
278  // a[fter]/b[efore] on same page
279  if(substr($pos, -1) != "c")
280  {
281  // block handling
282  $current = $this->object->getSurveyPages();
283  $current = $current[$this->current_page-1];
284  if(sizeof($current) == 1)
285  {
286  // as questions are moved to first block question
287  // always use existing as first
288  // the new question is moved later on (see below)
289  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
290  array((int)$pos)+$new_ids);
291  }
292  else
293  {
294  $block_id = array_pop($current);
295  $block_id = $block_id["questionblock_id"];
296 
297  foreach($new_ids as $qid)
298  {
299  $this->object->addQuestionToBlock($qid, $block_id);
300  }
301  }
302  }
303  // c: as new page (from toolbar/pool)
304  else
305  {
306  // re-create block
307  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
308  $new_ids);
309 
310  // after given question
311  if((int)$pos)
312  {
313  $pos = (int)$pos."a";
314  }
315  // at the beginning
316  else
317  {
318  $first = $this->object->getSurveyPages();
319  $first = $first[0];
320  $first = array_shift($first);
321  $pos = $first["question_id"]."b";
322  }
323  }
324 
325  // move to target position
326  $this->object->moveQuestions($new_ids, (int)$pos,
327  ((substr($pos, -1) == "a") ? 1 : 0));
328  }
329  }
330 
339  protected function addQuestion($a_type, $a_use_pool, $a_pos, $a_special_position)
340  {
341  global $ilCtrl, $ilTabs;
342 
343  // get translated type
344  include_once "./Modules/SurveyQuestionPool/classes/class.ilObjSurveyQuestionPool.php";
346  foreach($questiontypes as $item)
347  {
348  if($item["questiontype_id"] == $a_type)
349  {
350  $type_trans = $item["type_tag"];
351  }
352  }
353 
354  $id = $a_pos;
355 
356  // new page behind current (from toolbar)
357  if($a_special_position == "toolbar")
358  {
359  $id = $this->object->getSurveyPages();
360  if($a_pos && $a_pos != "fst")
361  {
362  $id = $id[$a_pos-1];
363  $id = array_pop($id);
364  $id = $id["question_id"]."c";
365  }
366  else
367  {
368  $id = "0c";
369  }
370  }
371  // append current page
372  else if($a_special_position == "page_end")
373  {
374  $id = $this->object->getSurveyPages();
375  $id = $id[$this->current_page-1];
376  $id = array_pop($id);
377  $id = $id["question_id"]."a";
378  }
379  else
380  {
381  $id .= "b";
382  }
383 
384  if($a_use_pool)
385  {
386  $_GET["sel_question_types"] = $type_trans;
387  $_REQUEST["pgov_pos"] = $id;
388  $ilCtrl->setParameter($this->editor_gui, "pgov_pos", $id);
389  if(!$_POST["usage"])
390  {
391  $ilTabs->clearSubTabs(); // #17193
392  $this->editor_gui->createQuestionObject();
393  }
394  else
395  {
396  $this->editor_gui->executeCreateQuestionObject();
397  }
398  return true;
399  }
400  else
401  {
402  // create question and redirect to question form
403 
404  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestionGUI.php";
405  $q_gui = SurveyQuestionGUI::_getQuestionGUI($type_trans);
406  $q_gui->object->setObjId($this->object->getId());
407  $q_gui->object->createNewQuestion();
408  $q_gui_class = get_class($q_gui);
409 
410  // #12531
411  $ilCtrl->setParameterByClass($q_gui_class, "pgov", $this->current_page);
412  $ilCtrl->setParameterByClass($q_gui_class, "pgov_pos",$id);
413  $ilCtrl->setParameterByClass($q_gui_class, "ref_id", $this->ref_id);
414  $ilCtrl->setParameterByClass($q_gui_class, "new_for_survey", $this->ref_id);
415  $ilCtrl->setParameterByClass($q_gui_class, "q_id", $q_gui->object->getId());
416  $ilCtrl->setParameterByClass($q_gui_class, "sel_question_types", $q_gui->getQuestionType());
417  $ilCtrl->redirectByClass($q_gui_class, "editQuestion");
418  }
419  }
420 
426  protected function cutQuestion($a_id)
427  {
428  global $lng;
429 
430  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_cut"));
431  $this->suppress_clipboard_msg = true;
432 
433  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
434  "source" => $this->current_page,
435  "nodes" => array($a_id),
436  "mode" => "cut");
437  }
438 
444  protected function copyQuestion($a_id)
445  {
446  global $lng;
447 
448  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_copy"));
449  $this->suppress_clipboard_msg = true;
450 
451  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
452  "source" => $this->current_page,
453  "nodes" => array($a_id),
454  "mode" => "copy");
455  }
456 
462  protected function multiCut($a_id)
463  {
464  global $lng;
465 
466  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_cut"));
467  $this->suppress_clipboard_msg = true;
468 
469  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
470  "source" => $this->current_page,
471  "nodes" => $a_id,
472  "mode" => "cut");
473  }
474 
480  protected function multiCopy($a_id)
481  {
482  global $lng;
483 
484  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_copy"));
485  $this->suppress_clipboard_msg = true;
486 
487  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
488  "source" => $this->current_page,
489  "nodes" => $a_id,
490  "mode" => "copy");
491  }
492 
496  protected function clearClipboard()
497  {
498  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = null;
499  }
500 
506  protected function paste($a_id)
507  {
508  $data = $_SESSION["survey_page_view"][$this->ref_id]["clipboard"];
509  $pages = $this->object->getSurveyPages();
510  $source = $pages[$data["source"]-1];
511  $target = $pages[$this->current_page-1];
512 
513  // #12558 - use order of source page
514  $nodes = array();
515  foreach($source as $src_qst)
516  {
517  if(in_array($src_qst["question_id"], $data["nodes"]))
518  {
519  $nodes[] = $src_qst["question_id"];
520  }
521  }
522 
523  // append to last position?
524  $pos = 0;
525  if($_REQUEST["il_hform_node"] == "page_end")
526  {
527  $a_id = $target;
528  $a_id = array_pop($a_id);
529  $a_id = $a_id["question_id"];
530  $pos = 1;
531  }
532 
533  // cut
534  if($data["mode"] == "cut")
535  {
536  // special case: paste cut on same page (no block handling needed)
537  if($data["source"] == $this->current_page)
538  {
539  // re-order nodes in page
540  if(sizeof($nodes) <= sizeof($source))
541  {
542  $this->object->moveQuestions($nodes, $a_id, $pos);
543  }
544  $this->clearClipboard();
545  return;
546  }
547  else
548  {
549  // only if source has block
550  $source_block_id = false;
551  if(sizeof($source) > 1)
552  {
553  $source_block_id = $source;
554  $source_block_id = array_shift($source_block_id);
555  $source_block_id = $source_block_id["questionblock_id"];
556 
557  // remove from block
558  if(sizeof($source) > sizeof($nodes))
559  {
560  foreach($nodes as $qid)
561  {
562  $this->object->removeQuestionFromBlock($qid, $source_block_id);
563  }
564  }
565  // remove complete block
566  else
567  {
568  $this->object->unfoldQuestionblocks(array($source_block_id));
569  }
570  }
571 
572  // page will be "deleted" by operation
573  if(sizeof($source) == sizeof($nodes) && $data["source"] < $this->current_page)
574  {
575  $this->current_page--;
576  }
577  }
578  }
579 
580  // copy
581  else if($data["mode"] == "copy")
582  {
583  $titles = array();
584  foreach($this->object->getSurveyPages() as $page)
585  {
586  foreach($page as $question)
587  {
588  $titles[] = $question["title"];
589  }
590  }
591 
592  // copy questions
593  $question_pointer = array();
594  foreach($nodes as $qid)
595  {
596  // create new questions
597  $question = ilObjSurvey::_instanciateQuestion($qid);
598 
599  // handle exisiting copies
600  $title = $question->getTitle();
601  $max = 0;
602  foreach($titles as $existing_title)
603  {
604  if(preg_match("/".preg_quote($title)." \(([0-9]+)\)$/", $existing_title, $match))
605  {
606  $max = max($match[1], $max);
607  }
608  }
609  if($max)
610  {
611  $title .= " (".($max+1).")";
612  }
613  else
614  {
615  $title .= " (2)";
616  }
617  $titles[] = $title;
618  $question->setTitle($title);
619 
620  $question->id = -1;
621  $question->saveToDb();
622 
623  $question_pointer[$qid] = $question->getId();
624  $this->appendNewQuestionToSurvey($question->getId(), false);
625  }
626 
627  // copy textblocks
628  $this->object->cloneTextblocks($question_pointer);
629 
630  $this->object->loadQuestionsFromDb();
631 
632  $nodes = array_values($question_pointer);
633  }
634 
635 
636  // paste
637 
638  // create new block
639  if(sizeof($target) == 1)
640  {
641  $nodes = array_merge(array($a_id), $nodes);
642 
643  // moveQuestions() is called within
644  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
645  $nodes);
646  }
647  // add to existing block
648  else
649  {
650  $target_block_id = $target;
651  $target_block_id = array_shift($target_block_id);
652  $target_block_id = $target_block_id["questionblock_id"];
653 
654  foreach($nodes as $qid)
655  {
656  $this->object->addQuestionToBlock($qid, $target_block_id);
657  }
658 
659  // move to new position
660  $this->object->moveQuestions($nodes, $a_id, $pos);
661  }
662 
663  $this->clearClipboard();
664  }
665 
669  protected function dnd()
670  {
671  $source_id = (int)array_pop(explode("_", $_REQUEST["il_hform_source"]));
672  if($_REQUEST["il_hform_target"] != "droparea_end")
673  {
674  $target_id = (int)array_pop(explode("_", $_REQUEST["il_hform_target"]));
675  $pos = 0;
676  }
677  else
678  {
679  $page = $this->object->getSurveyPages();
680  $page = $page[$this->current_page-1];
681  $last = array_pop($page);
682  $target_id = (int)$last["question_id"];
683  $pos = 1;
684  }
685  if($source_id != $target_id)
686  {
687  $this->object->moveQuestions(array($source_id), $target_id, $pos);
688  }
689  }
690 
695  protected function deleteBlock()
696  {
697  global $lng, $ilCtrl;
698 
699  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
700  ilUtil::sendQuestion($lng->txt("remove_questions"));
701 
702  $page = $this->object->getSurveyPages();
703  $page = $page[$this->current_page-1];
704 
705  // #10567
706  if($_REQUEST["csum"] != md5(print_r($page, true)))
707  {
708  $ilCtrl->redirect($this, "renderPage");
709  }
710 
711  $page = array_shift($page);
712  $block_id = $page["questionblock_id"];
713  if($block_id)
714  {
715  $this->editor_gui->removeQuestionsForm(array($block_id), array(), array());
716  }
717  else
718  {
719  $this->editor_gui->removeQuestionsForm(array(), array($page["question_id"]), array());
720  }
721  }
722 
728  protected function deleteQuestion($a_id)
729  {
730  global $ilCtrl;
731 
732  if(!is_array($a_id))
733  {
734  $a_id = array($a_id);
735  }
736 
737  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
738  $this->editor_gui->removeQuestionsForm(array(), $a_id, array());
739  return true;
740  }
741 
745  protected function confirmRemoveQuestions()
746  {
747  global $ilCtrl;
748 
749  // gather ids
750  $ids = array();
751  foreach ($_POST as $key => $value)
752  {
753  if (preg_match("/id_(\d+)/", $key, $matches))
754  {
755  array_push($ids, $matches[1]);
756  }
757  }
758 
759 
760  $pages = $this->object->getSurveyPages();
761  $source = $pages[$this->current_page-1];
762 
763  $block_id = $source;
764  $block_id = array_shift($block_id);
765  $block_id = $block_id["questionblock_id"];
766 
767  if(sizeof($ids) && sizeof($source) > sizeof($ids))
768  {
769  // block is obsolete
770  if(sizeof($source)-sizeof($ids) == 1)
771  {
772  $this->object->unfoldQuestionblocks(array($block_id));
773  }
774  // block will remain, remove question(s) from block
775  else
776  {
777  foreach($ids as $qid)
778  {
779  $this->object->removeQuestionFromBlock($qid, $block_id);
780  }
781  }
782 
783  $this->object->removeQuestions($ids, array());
784  }
785  // all items on page
786  else
787  {
788  // remove complete block
789  if($block_id)
790  {
791  $this->object->removeQuestions(array(), array($block_id));
792  }
793  // remove single question
794  else
795  {
796  $this->object->removeQuestions($ids, array());
797  }
798 
799  // render previous page
800  if($this->current_page > 1)
801  {
802  $this->current_page--;
803  }
804  }
805 
806  $this->object->saveCompletionStatus();
807 
808  // #10567
809  $ilCtrl->setParameter($this, "pgov", $this->current_page);
810  $ilCtrl->redirect($this, "renderPage");
811  }
812 
818  protected function editBlock($a_id)
819  {
820  $this->callEditor("editQuestionblockObject", "bl_id", $a_id);
821  return true;
822  }
823 
829  protected function addHeading($a_id)
830  {
831  $this->callEditor("addHeadingObject", "q_id", $a_id);
832  return true;
833  }
834 
840  protected function editHeading($a_id)
841  {
842  $this->callEditor("editHeadingObject", "q_id", $a_id);
843  return true;
844  }
845 
851  protected function deleteHeading($a_id)
852  {
853  $this->callEditor("removeHeadingObject", "q_id", $a_id);
854  return true;
855  }
856 
857  protected function callEditor($a_cmd, $a_param, $a_value)
858  {
859  global $ilTabs;
860 
861  $ilTabs->clearSubTabs();
862  $_REQUEST[$a_param] = $a_value;
863 
864  call_user_func(array($this->editor_gui, $a_cmd));
865  }
866 
872  protected function splitPage($a_id)
873  {
874  $pages = $this->object->getSurveyPages();
875  $source = $pages[$this->current_page-1];
876 
877  $block_questions = array();
878  $add = $block_id = false;
879  foreach($source as $idx => $item)
880  {
881  if($item["question_id"] == $a_id)
882  {
883  $block_id = $item["questionblock_id"];
884  $add = $idx;
885  }
886  if($add)
887  {
888  $block_questions[] = $item["question_id"];
889  }
890  }
891 
892  // just 1 question left: block is obsolete
893  if($add == 1)
894  {
895  $this->object->unfoldQuestionblocks(array($block_id));
896  }
897  // remove questions from block
898  else
899  {
900  foreach($block_questions as $qid)
901  {
902  $this->object->removeQuestionFromBlock($qid, $block_id);
903  }
904  }
905 
906  // more than 1 moved?
907  if(sizeof($block_questions) > 1)
908  {
909  // create new block and move target questions
910  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
911  $block_questions);
912  }
913 
914  $this->current_page++;
915  }
916 
922  protected function moveNext($a_id)
923  {
924  $pages = $this->object->getSurveyPages();
925  $source = $pages[$this->current_page-1];
926  $target = $pages[$this->current_page];
927  if(sizeof($target))
928  {
929  $target_id = $target;
930  $target_id = array_shift($target_id);
931  $target_block_id = $target_id["questionblock_id"];
932  $target_id = $target_id["question_id"];
933 
934  // nothing to do if no block
935  if(sizeof($source) > 1)
936  {
937  $block_id = $source;
938  $block_id = array_shift($block_id);
939  $block_id = $block_id["questionblock_id"];
940 
941  // source pages block is obsolete
942  if(sizeof($source) == 2)
943  {
944  // delete block
945  $this->object->unfoldQuestionblocks(array($block_id));
946  }
947  else
948  {
949  // remove question from block
950  $this->object->removeQuestionFromBlock($a_id, $block_id);
951  }
952  }
953 
954  // move source question to target
955  $this->object->moveQuestions(array($a_id), $target_id, 0);
956 
957  // new page has no block yet
958  if(sizeof($target) < 2)
959  {
960  // create block and move target question and source into block
961  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
962  array($a_id, $target_id));
963  }
964  else
965  {
966  // add source question to block
967  $this->object->addQuestionToBlock($a_id, $target_block_id);
968  }
969 
970  // only if current page is not "deleted"
971  if(sizeof($source) > 1)
972  {
973  $this->current_page++;
974  }
975  }
976  }
977 
983  protected function movePrevious($a_id)
984  {
985  $pages = $this->object->getSurveyPages();
986  $source = $pages[$this->current_page-1];
987  $target = $pages[$this->current_page-2];
988  if(sizeof($target))
989  {
990  $target_id = $target;
991  $target_id = array_pop($target_id);
992  $target_block_id = $target_id["questionblock_id"];
993  $target_id = $target_id["question_id"];
994 
995  // nothing to do if no block
996  if(sizeof($source) > 1)
997  {
998  $block_id = $source;
999  $block_id = array_shift($block_id);
1000  $block_id = $block_id["questionblock_id"];
1001 
1002  // source pages block is obsolete
1003  if(sizeof($source) == 2)
1004  {
1005  // delete block
1006  $this->object->unfoldQuestionblocks(array($block_id));
1007  }
1008  else
1009  {
1010  // remove question from block
1011  $this->object->removeQuestionFromBlock($a_id, $block_id);
1012  }
1013  }
1014 
1015  // move source question to target
1016  $this->object->moveQuestions(array($a_id), $target_id, 1);
1017 
1018  // new page has no block yet
1019  if(sizeof($target) < 2)
1020  {
1021  // create block and move target question and source into block
1022  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
1023  array($target_id, $a_id));
1024  }
1025  else
1026  {
1027  // add source question to block
1028  $this->object->addQuestionToBlock($a_id, $target_block_id);
1029  }
1030 
1031  $this->current_page--;
1032  }
1033  }
1034 
1040  protected function editQuestion($a_id)
1041  {
1042  global $ilCtrl;
1043 
1044  $data = $this->object->getSurveyQuestions();
1045  $data = $data[$a_id];
1046 
1047  $q_gui = $data["type_tag"]."GUI";
1048  $ilCtrl->setParameterByClass($q_gui, "pgov", $this->current_page);
1049  $ilCtrl->setParameterByClass($q_gui, "q_id", $a_id);
1050 
1051  $ilCtrl->redirectByClass($q_gui, "editQuestion");
1052  }
1053 
1057  protected function addQuestionToolbarForm()
1058  {
1059  global $lng, $ilCtrl, $tpl;
1060 
1061  include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
1062  $form = new ilPropertyFormGUI();
1063  $form->setFormAction($ilCtrl->getFormAction($this, "addQuestionToolbar"));
1064  $form->setTitle($lng->txt("survey_add_new_question"));
1065 
1066  // question types
1067  include_once "./Modules/SurveyQuestionPool/classes/class.ilObjSurveyQuestionPool.php";
1068  $questiontypes = ilObjSurveyQuestionPool::_getQuestiontypes();
1069  $type_map = array();
1070  foreach($questiontypes as $trans => $item)
1071  {
1072  $type_map[$item["questiontype_id"]] = $trans;
1073  }
1074  include_once("./Services/Form/classes/class.ilSelectInputGUI.php");
1075  $si = new ilSelectInputGUI($lng->txt("question_type"), "qtype");
1076  $si->setOptions($type_map);
1077  $form->addItem($si);
1078 
1079  $pages = $this->object->getSurveyPages();
1080  if($pages)
1081  {
1082  $pages_drop = array("fst"=>$lng->txt("survey_at_beginning"));
1083  foreach($pages as $idx => $questions)
1084  {
1085  $question = array_shift($questions);
1086  if($question["questionblock_id"])
1087  {
1088  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".$question["questionblock_title"];
1089  }
1090  else
1091  {
1092  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".strip_tags($question["title"]);
1093  }
1094  }
1095  $pos = new ilSelectInputGUI($lng->txt("position"), "pgov");
1096  $pos->setOptions($pages_drop);
1097  $form->addItem($pos);
1098 
1099  $pos->setValue($this->current_page);
1100  }
1101  else
1102  {
1103  // #9089: 1st page
1104  $pos = new ilHiddenInputGUI("pgov");
1105  $pos->setValue("fst");
1106  $form->addItem($pos);
1107  }
1108 
1109  if($this->object->isPoolActive())
1110  {
1111  $this->editor_gui->createQuestionObject($form);
1112  }
1113 
1114  $form->addCommandButton("addQuestionToolbar", $lng->txt("create"));
1115  $form->addCommandButton("renderPage", $lng->txt("cancel"));
1116 
1117  return $tpl->setContent($form->getHTML());
1118  }
1119 
1123  protected function addQuestionToolbar()
1124  {
1125  global $ilCtrl, $lng;
1126 
1127  $pool_active = $this->object->isPoolActive();
1128 
1129  if(!$_POST["usage"] && $pool_active)
1130  {
1131  ilUtil::sendFailure($lng->txt("select_one"), true);
1132  return $this->addQuestionToolbarForm();
1133  }
1134 
1135  // make sure that it is set for current and next requests
1136  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
1137 
1138  if(!$this->addQuestion($_POST["qtype"], $pool_active, $_POST["pgov"], "toolbar"))
1139  {
1140  $this->renderPage();
1141  }
1142  }
1143 
1147  protected function movePageForm()
1148  {
1149  global $lng, $ilCtrl, $tpl;
1150 
1151  include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
1152  $form = new ilPropertyFormGUI();
1153  $form->setFormAction($ilCtrl->getFormAction($this, "movePage"));
1154  $form->setTitle($lng->txt("survey_move_page"));
1155 
1156  $old_pos = new ilHiddenInputGUI("old_pos");
1157  $old_pos->setValue($this->current_page);
1158  $form->addItem($old_pos);
1159 
1160  $pages = $this->object->getSurveyPages();
1161  if($pages)
1162  {
1163  $pages_drop = array();
1164  if($this->current_page != 1)
1165  {
1166  $pages_drop["fst"] = $lng->txt("survey_at_beginning");
1167  }
1168  foreach($pages as $idx => $questions)
1169  {
1170  if(($idx+1) != $this->current_page && ($idx+2) != $this->current_page)
1171  {
1172  $question = array_shift($questions);
1173  if($question["questionblock_id"])
1174  {
1175  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".$question["questionblock_title"];
1176  }
1177  else
1178  {
1179  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".strip_tags($question["title"]);
1180  }
1181  }
1182  }
1183  $pos = new ilSelectInputGUI($lng->txt("position"), "pgov");
1184  $pos->setOptions($pages_drop);
1185  $form->addItem($pos);
1186  }
1187 
1188  $form->addCommandButton("movePage", $lng->txt("submit"));
1189  $form->addCommandButton("renderPage", $lng->txt("cancel"));
1190 
1191  return $tpl->setContent($form->getHTML());
1192  }
1193 
1198  protected function movePage()
1199  {
1200  global $lng, $ilCtrl;
1201 
1202  // current_page is already set to new position
1203  $target_page = $this->current_page-1;
1204  $source_page = $_REQUEST["old_pos"]-1;
1205 
1206  $pages = $this->object->getSurveyPages();
1207  foreach($pages[$source_page] as $question)
1208  {
1209  $questions[] = $question["question_id"];
1210  }
1211 
1212  // move to first position
1213  $position = 0;
1214  if($_REQUEST["pgov"] != "fst")
1215  {
1216  $position = 1;
1217  }
1218 
1219  $target = $pages[$target_page];
1220  if ($position == 0) // before
1221  {
1222  $target = array_shift($target); // ... use always the first question of the page
1223  }
1224  else // after
1225  {
1226  $target = array_pop($target); // ... use always the last question of the page
1227  }
1228  $this->object->moveQuestions($questions, $target["question_id"], $position);
1229 
1230  if($target_page < $source_page && $position)
1231  {
1232  $this->current_page++;
1233  }
1234 
1235  ilUtil::sendSuccess($lng->txt("survey_page_moved"), true);
1236  $ilCtrl->setParameter($this, "pgov", $this->current_page);
1237  $ilCtrl->redirect($this, "renderPage");
1238  }
1239 
1245  protected function renderToolbar($a_pages)
1246  {
1247  global $ilToolbar, $ilCtrl, $lng, $ilUser;
1248 
1249  include_once "Services/UIComponent/Button/classes/class.ilLinkButton.php";
1250 
1251  if(!$this->has_datasets)
1252  {
1253  $button = ilLinkButton::getInstance();
1254  $button->setCaption("survey_add_new_question");
1255  $button->setUrl($ilCtrl->getLinkTarget($this, "addQuestionToolbarForm"));
1256  $ilToolbar->addStickyItem($button);
1257 
1258  if($this->object->isPoolActive())
1259  {
1260  $ilToolbar->addSeparator();
1261 
1262  $last_on_page = 0;
1263  if($a_pages &&
1264  is_array($a_pages[$this->current_page-1]))
1265  {
1266  $last_on_page = $a_pages[$this->current_page-1];
1267  $last_on_page = array_pop($last_on_page);
1268  $last_on_page = $last_on_page["question_id"];
1269  }
1270 
1271  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
1272  $ilCtrl->setParameter($this->editor_gui, "pgov_pos", $last_on_page."c");
1273 
1274  $cmd = ($ilUser->getPref('svy_insert_type') == 1 ||
1275  strlen($ilUser->getPref('svy_insert_type')) == 0)
1276  ? 'browseForQuestions'
1277  : 'browseForQuestionblocks';
1278 
1279  $button = ilLinkButton::getInstance();
1280  $button->setCaption("browse_for_questions");
1281  $button->setUrl($ilCtrl->getLinkTarget($this->editor_gui, $cmd));
1282  $ilToolbar->addStickyItem($button);
1283 
1284  $ilCtrl->setParameter($this->editor_gui, "pgov", "");
1285  $ilCtrl->setParameter($this->editor_gui, "pgov_pos", "");
1286  }
1287 
1288  if($a_pages)
1289  {
1290  $ilToolbar->addSeparator();
1291  }
1292  }
1293 
1294  // parse data for pages drop-down
1295  if($a_pages)
1296  {
1297  // previous/next
1298 
1299  $ilCtrl->setParameter($this, "pg", $this->current_page-1);
1300  $button = ilLinkButton::getInstance();
1301  $button->setCaption("survey_prev_question");
1302  $button->setUrl($ilCtrl->getLinkTarget($this, "renderPage"));
1303  $button->setDisabled(!$this->has_previous_page);
1304  $ilToolbar->addStickyItem($button);
1305 
1306  $ilCtrl->setParameter($this, "pg", $this->current_page+1);
1307  $button = ilLinkButton::getInstance();
1308  $button->setCaption("survey_next_question");
1309  $button->setUrl($ilCtrl->getLinkTarget($this, "renderPage"));
1310  $button->setDisabled(!$this->has_next_page);
1311  $ilToolbar->addStickyItem($button);
1312 
1313  $ilCtrl->setParameter($this, "pg", $this->current_page); // #14615
1314 
1315  foreach($a_pages as $idx => $questions)
1316  {
1317  $page = $questions;
1318  $page = array_shift($page);
1319  if($page["questionblock_id"])
1320  {
1321  $pages_drop[$idx+1] = $page["questionblock_title"];
1322 
1323  if(sizeof($questions) > 1)
1324  {
1325  foreach($questions as $question)
1326  {
1327  $pages_drop[($idx+1)."__".$question["question_id"]] = "- ".$question["title"];
1328  }
1329  }
1330  }
1331  else
1332  {
1333  $pages_drop[$idx+1] = strip_tags($page["title"]);
1334  }
1335  }
1336  }
1337 
1338  // jump to page
1339  if(sizeof($pages_drop) > 1)
1340  {
1341  $ilToolbar->addSeparator();
1342 
1343  $ilToolbar->setFormAction($ilCtrl->getFormAction($this));
1344 
1345  include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
1346  $si = new ilSelectInputGUI($lng->txt("survey_jump_to"), "jump");
1347  $si->addCustomAttribute("onChange=\"forms['ilToolbar'].submit();\"");
1348  $si->setOptions($pages_drop);
1349  $si->setValue($this->current_page);
1350  $ilToolbar->addInputItem($si, true);
1351 
1352  // we need this to have to right cmd
1353  $cmd = new ilHiddenInputGUI("cmd[renderPage]");
1354  $cmd->setValue("1");
1355  $ilToolbar->addInputItem($cmd);
1356 
1357  if(!$this->has_datasets)
1358  {
1359  $ilToolbar->addSeparator();
1360 
1361  $ilCtrl->setParameter($this, "csum", md5(print_r($a_pages[$this->current_page-1], true)));
1362  $url = $ilCtrl->getLinkTarget($this, "deleteBlock");
1363  $ilCtrl->setParameter($this, "csum", "");
1364 
1365  $button = ilLinkButton::getInstance();
1366  $button->setCaption("survey_delete_page");
1367  $button->setUrl($url);
1368  $ilToolbar->addButtonInstance($button);
1369 
1370  $ilToolbar->addSeparator();
1371 
1372  $button = ilLinkButton::getInstance();
1373  $button->setCaption("survey_move_page");
1374  $button->setUrl($ilCtrl->getLinkTarget($this, "movePageForm"));
1375  $ilToolbar->addButtonInstance($button);
1376  }
1377  }
1378  }
1379 
1383  protected function renderPage()
1384  {
1385  global $ilCtrl, $lng, $tpl, $rbacsystem;
1386 
1387  $pages = $this->object->getSurveyPages();
1388  $this->has_next_page = ($this->current_page < sizeof($pages));
1389  $this->has_previous_page = ($this->current_page > 1);
1390  $this->has_datasets = $this->object->_hasDatasets($this->object->getSurveyId());
1391 
1392  if($this->has_datasets)
1393  {
1394  $link = $ilCtrl->getLinkTargetByClass(array("ilobjsurveygui", "ilsurveyparticipantsgui"), "maintenance");
1395  $link = "<a href=\"".$link."\">".$lng->txt("survey_has_datasets_warning_page_view_link")."</a>";
1396  ilUtil::sendInfo($lng->txt("survey_has_datasets_warning_page_view")." ".$link);
1397  }
1398 
1399  $ilCtrl->setParameter($this, "pg", $this->current_page);
1400  $ilCtrl->setParameter($this, "pgov", "");
1401 
1402  $this->renderToolbar($pages);
1403 
1404  if($pages)
1405  {
1406  $ttpl = new ilTemplate("tpl.il_svy_svy_page_view.html", true, true, "Modules/Survey");
1407  $ttpl->setVariable("FORM_ACTION", $ilCtrl->getFormAction($this));
1408  $lng->loadLanguageModule("form");
1409 
1410  $read_only = ($this->has_datasets || !$rbacsystem->checkAccess("write", $this->ref_id));
1411 
1412  $commands = $multi_commands = array();
1413 
1414  if(!$read_only)
1415  {
1416  // clipboard is empty
1417  if(!$_SESSION["survey_page_view"][$this->ref_id]["clipboard"])
1418  {
1419  $multi_commands[] = array("cmd"=>"multiDelete", "text"=>$lng->txt("delete"));
1420  $multi_commands[] = array("cmd"=>"multiCut", "text"=>$lng->txt("cut"));
1421  $multi_commands[] = array("cmd"=>"multiCopy", "text"=>$lng->txt("copy"));
1422  $multi_commands[] = array("cmd"=>"selectAll", "text"=>$lng->txt("select_all"));
1423  }
1424  else
1425  {
1426  if(!$this->suppress_clipboard_msg)
1427  {
1428  ilUtil::sendInfo($lng->txt("survey_clipboard_notice"));
1429  }
1430  $multi_commands[] = array("cmd"=>"clearClipboard", "text"=>$lng->txt("survey_dnd_clear_clipboard"));
1431  }
1432 
1433  // help - see ilPageObjectGUI::insertHelp()
1434  $lng->loadLanguageModule("content");
1435  $ttpl->setCurrentBlock("help_section");
1436  $ttpl->setVariable("TXT_ADD_EL", $lng->txt("cont_add_elements"));
1437  include_once("./Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php");
1438  $ttpl->setVariable("PLUS", ilGlyphGUI::get(ilGlyphGUI::ADD));
1439  $ttpl->setVariable("DRAG_ARROW", ilGlyphGUI::get(ilGlyphGUI::DRAG));
1440  $ttpl->setVariable("TXT_DRAG", $lng->txt("cont_drag_and_drop_elements"));
1441  $ttpl->setVariable("TXT_SEL", $lng->txt("cont_double_click_to_delete"));
1442  $ttpl->parseCurrentBlock();
1443 
1444  $ttpl->setVariable("DND_INIT_JS", "initDragElements();");
1445 
1446 
1447  // tiny mce
1448 
1449  include_once "./Services/AdvancedEditing/classes/class.ilObjAdvancedEditing.php";
1450  $tags = ilObjAdvancedEditing::_getUsedHTMLTags("survey");
1451 
1452  include_once "./Services/RTE/classes/class.ilTinyMCE.php";
1453  $tiny = new ilTinyMCE();
1454  $ttpl->setVariable("WYSIWYG_BLOCKFORMATS", $tiny->_buildAdvancedBlockformatsFromHTMLTags($tags));
1455  $ttpl->setVariable("WYSIWYG_VALID_ELEMENTS", $tiny->_getValidElementsFromHTMLTags($tags));
1456 
1457  $buttons_1 = $tiny->_buildAdvancedButtonsFromHTMLTags(1, $tags);
1458  $buttons_2 = $tiny->_buildAdvancedButtonsFromHTMLTags(2, $tags).','.
1459  $tiny->_buildAdvancedTableButtonsFromHTMLTags($tags).
1460  ($tiny->getStyleSelect() ? ',styleselect' : '');
1461  $buttons_3 = $tiny->_buildAdvancedButtonsFromHTMLTags(3, $tags);
1462  $ttpl->setVariable('WYSIWYG_BUTTONS_1', $tiny->_removeRedundantSeparators($buttons_1));
1463  $ttpl->setVariable('WYSIWYG_BUTTONS_2', $tiny->_removeRedundantSeparators($buttons_2));
1464  $ttpl->setVariable('WYSIWYG_BUTTONS_3', $tiny->_removeRedundantSeparators($buttons_3));
1465  }
1466 
1467  // commands
1468  if (count($multi_commands) > 0)
1469  {
1470  foreach($multi_commands as $cmd)
1471  {
1472  $ttpl->setCurrentBlock("multi_cmd");
1473  $ttpl->setVariable("ORG_CMD_MULTI", "renderPage");
1474  $ttpl->setVariable("MULTI_CMD", $cmd["cmd"]);
1475  $ttpl->setVariable("MULTI_CMD_TXT", $cmd["text"]);
1476  $ttpl->parseCurrentBlock();
1477  }
1478 
1479  $ttpl->setCurrentBlock("multi_cmds");
1480  $ttpl->setVariable("MCMD_ALT", $lng->txt("commands"));
1481  $ttpl->setVariable("MCMD_IMG", ilUtil::getImagePath("arrow_downright.svg"));
1482  $ttpl->parseCurrentBlock();
1483  }
1484 
1485  // nodes
1486  $ttpl->setVariable("NODES", $this->getPageNodes($pages[$this->current_page-1],
1487  $this->has_previous_page, $this->has_next_page, $read_only));
1488 
1489  $tpl->setContent($ttpl->get());
1490 
1491  // add js to template
1492  include_once("./Services/YUI/classes/class.ilYuiUtil.php");
1494  $tpl->addJavascript("./Modules/Survey/js/SurveyPageView.js");
1495  $tpl->addJavascript("./Services/RTE/tiny_mce_3_5_11/tiny_mce_src.js");
1496  }
1497  }
1498 
1508  function getPageNodes(array $a_questions, $a_has_previous_page = false, $a_has_next_page = false, $a_readonly = false)
1509  {
1510  global $ilCtrl, $lng;
1511 
1512  $ttpl = new ilTemplate("tpl.il_svy_svy_page_view_nodes.html", true, true, "Modules/Survey");
1513 
1514  $has_clipboard = (bool)$_SESSION["survey_page_view"][$this->ref_id]["clipboard"];
1515 
1516  // question block ?
1517 
1518  $first_question = $a_questions;
1519  $first_question = array_shift($first_question);
1520 
1521  if($first_question["questionblock_id"])
1522  {
1523  $menu = array();
1524 
1525  if(!$a_readonly && !$has_clipboard)
1526  {
1527  $menu[] = array("cmd" => "editBlock", "text" => $lng->txt("edit"));
1528  }
1529 
1530  if($first_question["questionblock_show_blocktitle"])
1531  {
1532  $block_status = $lng->txt("survey_block_visible");
1533  }
1534  else
1535  {
1536  $block_status = $lng->txt("survey_block_hidden");
1537  }
1538 
1539  $this->renderPageNode($ttpl, "block", $first_question["questionblock_id"],
1540  $first_question["questionblock_title"]." (".$block_status.")", $menu, false, false, $block_status);
1541  }
1542 
1543 
1544  // questions/headings
1545 
1546  include_once "./Modules/SurveyQuestionPool/classes/class.ilObjSurveyQuestionPool.php";
1547  $questiontypes = ilObjSurveyQuestionPool::_getQuestiontypes();
1548  $questionpools = array_keys($this->object->getQuestionpoolTitles(true));
1549 
1550  $counter = $question_count;
1551  $block_done = null;
1552  foreach($a_questions as $idx => $question)
1553  {
1554  // drop area
1555 
1556  $menu = array();
1557 
1558  if(!$a_readonly)
1559  {
1560  if(!$has_clipboard)
1561  {
1562  foreach($questiontypes as $trans => $item)
1563  {
1564  $menu[] = array("cmd"=> "addQuestion_".$item["questiontype_id"],
1565  "text"=> sprintf($lng->txt("svy_page_add_question"), $trans));
1566  }
1567 
1568  if($this->object->isPoolActive())
1569  {
1570  $menu[] = array("cmd"=> "addPoolQuestion",
1571  "text"=> $lng->txt("browse_for_questions"));
1572  }
1573  }
1574  else
1575  {
1576  $menu[] = array("cmd" => "paste", "text" => $lng->txt("survey_dnd_paste"));
1577  }
1578  }
1579 
1580  $this->renderPageNode($ttpl, "droparea", $question["question_id"], null, $menu, true);
1581 
1582  // question
1583  $question_gui = $this->object->getQuestionGUI($question["type_tag"], $question["question_id"]);
1584  $question_form = $question_gui->getWorkingForm(array(), $this->object->getShowQuestionTitles(),
1585  $question["questionblock_show_questiontext"], null, $this->object->getSurveyId());
1586 
1587  $menu = array();
1588 
1589  if(!$a_readonly && !$has_clipboard)
1590  {
1591  $menu[] = array("cmd" => "editQuestion", "text" => $lng->txt("edit"));
1592  $menu[] = array("cmd" => "cutQuestion", "text" => $lng->txt("cut"));
1593  $menu[] = array("cmd" => "copyQuestion", "text" => $lng->txt("copy"));
1594 
1595  if(sizeof($a_questions) > 1 && $idx > 0)
1596  {
1597  $menu[] = array("cmd" => "splitPage", "text" => $lng->txt("survey_dnd_split_page"));
1598  }
1599  if($a_has_next_page)
1600  {
1601  $menu[] = array("cmd" => "moveNext", "text" => $lng->txt("survey_dnd_move_next"));
1602  }
1603  if($a_has_previous_page)
1604  {
1605  $menu[] = array("cmd" => "movePrevious", "text" => $lng->txt("survey_dnd_move_previous"));
1606  }
1607 
1608  $menu[] = array("cmd" => "deleteQuestion", "text" => $lng->txt("delete"));
1609 
1610  // heading
1611  if($question["heading"])
1612  {
1613  $menu[] = array("cmd" => "editHeading", "text" => $lng->txt("survey_edit_heading"));
1614  $menu[] = array("cmd" => "deleteHeading", "text" => $lng->txt("survey_delete_heading"));
1615  }
1616  else
1617  {
1618  $menu[] = array("cmd" => "addHeading", "text" => $lng->txt("add_heading"));
1619  }
1620  }
1621 
1622  if($first_question["questionblock_show_questiontext"])
1623  {
1624  $question_title_status = $lng->txt("survey_question_text_visible");
1625  }
1626  else
1627  {
1628  $question_title_status = $lng->txt("survey_question_text_hidden");
1629  }
1630 
1631  $this->renderPageNode($ttpl, "question", $question["question_id"], $question_form, $menu,
1632  false, $question["title"], $question_title_status, $question["heading"]);
1633 
1634  $ilCtrl->setParameter($this, "eqid", "");
1635  }
1636 
1637 
1638  // last position (no question id)
1639 
1640  $menu = array();
1641 
1642  if(!$a_readonly)
1643  {
1644  if(!$has_clipboard)
1645  {
1646  foreach($questiontypes as $trans => $item)
1647  {
1648  $menu[] = array("cmd"=> "addQuestion_".$item["questiontype_id"],
1649  "text"=> sprintf($lng->txt("svy_page_add_question"), $trans));
1650  }
1651 
1652  if($this->object->isPoolActive())
1653  {
1654  $menu[] = array("cmd"=> "addPoolQuestion",
1655  "text"=> $lng->txt("browse_for_questions"));
1656  }
1657  }
1658  else
1659  {
1660  $menu[] = array("cmd" => "paste", "text" => $lng->txt("survey_dnd_paste"));
1661  }
1662  }
1663 
1664  $this->renderPageNode($ttpl, "page", "end", null, $menu, true);
1665 
1666  return $ttpl->get();
1667  }
1668 
1681  function renderPageNode(ilTemplate $a_tpl, $a_type, $a_id, $a_content = null, array $a_menu = null, $a_spacer = false, $a_subtitle = false, $a_status = false, $a_heading = false)
1682  {
1683  global $ilCtrl, $lng;
1684 
1685  $node_id = $a_type."_".$a_id;
1686 
1687  if($a_spacer)
1688  {
1689  if($a_menu)
1690  {
1691  // drop area menu
1692  foreach($a_menu as $mcnt => $menu_item)
1693  {
1694  $ilCtrl->setParameter($this, "il_hform_node", $node_id);
1695  $ilCtrl->setParameter($this, "il_hform_subcmd", $menu_item["cmd"]);
1696  $url = $ilCtrl->getLinkTarget($this, "renderPage");
1697  $ilCtrl->setParameter($this, "il_hform_subcmd", "");
1698  $ilCtrl->setParameter($this, "il_hform_node", "");
1699 
1700  $a_tpl->setCurrentBlock("menu_cmd");
1701  $a_tpl->setVariable("TXT_MENU_CMD", $menu_item["text"]);
1702  $a_tpl->setVariable("URL_MENU_CMD", $url);
1703  $a_tpl->parseCurrentBlock();
1704  }
1705  }
1706 
1707  $a_tpl->setCurrentBlock("drop_area");
1708  include_once "Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php";
1709  $a_tpl->setVariable("ICON_ADD", ilGlyphGUI::get(ilGlyphGUI::ADD));
1710  $a_tpl->setVariable("DROP_ID", $a_id);
1711  $a_tpl->parseCurrentBlock();
1712  }
1713  else if($a_menu)
1714  {
1715  // question action menu
1716  foreach($a_menu as $mcnt => $menu_item)
1717  {
1718  $ilCtrl->setParameter($this, "il_hform_node", $node_id);
1719  $ilCtrl->setParameter($this, "il_hform_subcmd", $menu_item["cmd"]);
1720  $url = $ilCtrl->getLinkTarget($this, "renderPage");
1721  $ilCtrl->setParameter($this, "il_hform_subcmd", "");
1722  $ilCtrl->setParameter($this, "il_hform_node", "");
1723 
1724  $a_tpl->setCurrentBlock("action_cmd");
1725  $a_tpl->setVariable("TXT_ACTION_CMD", $menu_item["text"]);
1726  $a_tpl->setVariable("URL_ACTION_CMD", $url);
1727  $a_tpl->parseCurrentBlock();
1728  }
1729  }
1730 
1731  // add heading to content
1732  if($a_content !== null &&
1733  $a_type == "question" &&
1734  $a_heading)
1735  {
1736  $a_content = "<div class=\"questionheading\">".$a_heading."</div>".
1737  $a_content;
1738  }
1739 
1740  if($a_menu)
1741  {
1742  $a_tpl->setVariable("TXT_NODE_CONTENT_ACTIONS", $a_content);
1743  }
1744  else
1745  {
1746  $a_tpl->setVariable("TXT_NODE_CONTENT_NO_ACTIONS", $a_content);
1747  }
1748 
1749  if($a_content !== null)
1750  {
1751  $drag = "";
1752  $selectable = false;
1753  switch($a_type)
1754  {
1755  case "block":
1756  $caption = $lng->txt("questionblock");
1757  break;
1758 
1759  case "question":
1760  $caption = $lng->txt("question").": ".$a_subtitle;
1761  $drag = "_drag";
1762  $selectable = true;
1763  break;
1764 
1765  case "heading":
1766  $caption = $lng->txt("heading");
1767  break;
1768 
1769  default:
1770  return;
1771  }
1772 
1773  if($a_status)
1774  {
1775  $caption .= " (".$a_status.")";
1776  }
1777 
1778  $a_tpl->setCurrentBlock("list_item");
1779  $a_tpl->setVariable("NODE_ID", $node_id);
1780  $a_tpl->setVariable("NODE_DRAG", $drag);
1781  $a_tpl->setVariable("TXT_NODE_TYPE", $caption);
1782  if($selectable)
1783  {
1784  $a_tpl->setVariable("SELECTABLE", " selectable");
1785  }
1786  $a_tpl->parseCurrentBlock();
1787  }
1788 
1789  $a_tpl->touchBlock("element");
1790  }
1791 
1797  public function getAutoBlockTitle()
1798  {
1799  global $lng;
1800 
1801  return $lng->txt("survey_auto_block_title");
1802  }
1803 
1804  public function addPoolQuestion($pos, $node)
1805  {
1806  global $ilCtrl, $ilUser;
1807 
1808  if($node == "page_end")
1809  {
1810  $pos = $this->object->getSurveyPages();
1811  $pos = array_pop($pos[$this->current_page-1]);
1812  $pos = $pos["question_id"]."a";
1813  }
1814  else
1815  {
1816  $pos = $pos."b";
1817  }
1818 
1819  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
1820  $ilCtrl->setParameter($this->editor_gui, "pgov_pos", $pos);
1821 
1822  $cmd = ($ilUser->getPref('svy_insert_type') == 1 || strlen($ilUser->getPref('svy_insert_type')) == 0) ? 'browseForQuestions' : 'browseForQuestionblocks';
1823  $ilCtrl->redirect($this->editor_gui, $cmd);
1824  }
1825 }
1826 
1827 ?>
multiCopy($a_id)
Add questions to be copied to clipboard.
static sendSuccess($a_info="", $a_keep=false)
Send Success Message to Screen.
$_POST['username']
Definition: cron.php:12
Class ilSurveyEditorGUI.
movePrevious($a_id)
Move question to previous page.
$_SESSION["AccountId"]
This class represents a selection list property in a property form.
$result
This class represents a property form user interface.
paste($a_id)
Paste from clipboard.
__construct(ilObjSurvey $a_survey, ilSurveyEditorGUI $a_survey_editor_gui)
Constructor.
$_GET["client_id"]
deleteQuestion($a_id)
Confirm removing question(s) from survey.
movePageForm()
Move current page.
$cmd
Definition: sahs_server.php:35
addQuestion($a_type, $a_use_pool, $a_pos, $a_special_position)
Call add question to survey form.
static get($a_glyph, $a_text="")
Get glyph html.
Survey per page view.
$target_id
Definition: goto.php:88
getPageNodes(array $a_questions, $a_has_previous_page=false, $a_has_next_page=false, $a_readonly=false)
Get Form HTML.
$url
Definition: shib_logout.php:72
editHeading($a_id)
Edit question heading.
clearClipboard()
Empty clipboard.
callEditor($a_cmd, $a_param, $a_value)
addHeading($a_id)
Add heading to question.
global $tpl
Definition: ilias.php:8
global $ilCtrl
Definition: ilias.php:18
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
This class represents a hidden form property in a property form.
$data
Tiny MCE editor class.
setVariable($variable, $value='')
Sets a variable value.
Definition: IT.php:626
addQuestionToolbar()
Add question to survey action (used in toolbar)
multiCut($a_id)
Add questions to be cut to clipboard.
deleteHeading($a_id)
Delete question heading.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
touchBlock($block)
overwrites ITX::touchBlock.
static & _getQuestionGUI($questiontype, $question_id=-1)
Creates a question gui representation.
special template class to simplify handling of ITX/PEAR
getAutoBlockTitle()
Get name for newly created blocks.
addQuestionToolbarForm()
Add question to survey form (used in toolbar)
static sendQuestion($a_info="", $a_keep=false)
Send Question to Screen.
setOptions($a_options)
Set Options.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
setCurrentBlock($part="DEFAULT")
Überladene Funktion, die sich hier lokal noch den aktuellen Block merkt.
insertQuestionBlock($a_block_id)
Copy and insert questions from block.
appendNewQuestionToSurvey($a_new_id, $a_duplicate=true, $a_force_duplicate=false)
Add new question to survey (database part)
global $ilUser
Definition: imgupload.php:15
copyQuestion($a_id)
Add question to be copied to clipboard.
& _getUsedHTMLTags($a_module="")
Returns an array of all allowed HTML tags for text editing.
static initDragDrop()
Init YUI Drag and Drop.
& _getQuestiontypes()
Creates a list of all available question types.
global $ilDB
editQuestion($a_id)
Edit question.
getRefId()
get reference id public
renderPageNode(ilTemplate $a_tpl, $a_type, $a_id, $a_content=null, array $a_menu=null, $a_spacer=false, $a_subtitle=false, $a_status=false, $a_heading=false)
Render single of dnd page view.
cutQuestion($a_id)
Add question to be cut to clipboard.
confirmRemoveQuestions()
Remove question(s) from survey.
insertNewQuestion($a_new_id)
Add new question to survey.
if($_REQUEST['ilias_path']) define('ILIAS_HTTP_PATH' $_REQUEST['ilias_path']
Definition: index.php:7
movePage()
Move current page to new position.
renderPage()
render questions per page
deleteBlock()
Confirm removing question block.
_isComplete($question_id)
Checks whether the question is complete or not.
editBlock($a_id)
Edit question block.
moveNext($a_id)
Move question to next page.
& _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
splitPage($a_id)
Split current page in 2 pages.
parseCurrentBlock($part="DEFAULT")
Überladene Funktion, die auf den aktuelle Block vorher noch ein replace ausführt public...
dnd()
Move questions in page.
renderToolbar($a_pages)
Render toolbar form.
determineCurrentPage()
determine current page