ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
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;
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  $this->editor_gui->createQuestionObject();
392  }
393  else
394  {
395  $this->editor_gui->executeCreateQuestionObject();
396  }
397  return true;
398  }
399  else
400  {
401  // create question and redirect to question form
402 
403  include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestionGUI.php";
404  $q_gui = SurveyQuestionGUI::_getQuestionGUI($type_trans);
405  $q_gui->object->setObjId($this->object->getId());
406  $q_gui->object->createNewQuestion();
407  $q_gui_class = get_class($q_gui);
408 
409  // #12531
410  $ilCtrl->setParameterByClass($q_gui_class, "pgov", $this->current_page);
411  $ilCtrl->setParameterByClass($q_gui_class, "pgov_pos",$id);
412  $ilCtrl->setParameterByClass($q_gui_class, "ref_id", $this->ref_id);
413  $ilCtrl->setParameterByClass($q_gui_class, "new_for_survey", $this->ref_id);
414  $ilCtrl->setParameterByClass($q_gui_class, "q_id", $q_gui->object->getId());
415  $ilCtrl->setParameterByClass($q_gui_class, "sel_question_types", $q_gui->getQuestionType());
416  $ilCtrl->redirectByClass($q_gui_class, "editQuestion");
417  }
418  }
419 
425  protected function cutQuestion($a_id)
426  {
427  global $lng;
428 
429  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_cut"));
430  $this->suppress_clipboard_msg = true;
431 
432  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
433  "source" => $this->current_page,
434  "nodes" => array($a_id),
435  "mode" => "cut");
436  }
437 
443  protected function copyQuestion($a_id)
444  {
445  global $lng;
446 
447  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_copy"));
448  $this->suppress_clipboard_msg = true;
449 
450  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
451  "source" => $this->current_page,
452  "nodes" => array($a_id),
453  "mode" => "copy");
454  }
455 
461  protected function multiCut($a_id)
462  {
463  global $lng;
464 
465  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_cut"));
466  $this->suppress_clipboard_msg = true;
467 
468  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
469  "source" => $this->current_page,
470  "nodes" => $a_id,
471  "mode" => "cut");
472  }
473 
479  protected function multiCopy($a_id)
480  {
481  global $lng;
482 
483  ilUtil::sendSuccess($lng->txt("survey_questions_to_clipboard_copy"));
484  $this->suppress_clipboard_msg = true;
485 
486  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = array(
487  "source" => $this->current_page,
488  "nodes" => $a_id,
489  "mode" => "copy");
490  }
491 
495  protected function clearClipboard()
496  {
497  $_SESSION["survey_page_view"][$this->ref_id]["clipboard"] = null;
498  }
499 
505  protected function paste($a_id)
506  {
507  $data = $_SESSION["survey_page_view"][$this->ref_id]["clipboard"];
508  $pages = $this->object->getSurveyPages();
509  $source = $pages[$data["source"]-1];
510  $target = $pages[$this->current_page-1];
511 
512  // #12558 - use order of source page
513  $nodes = array();
514  foreach($source as $src_qst)
515  {
516  if(in_array($src_qst["question_id"], $data["nodes"]))
517  {
518  $nodes[] = $src_qst["question_id"];
519  }
520  }
521 
522  // append to last position?
523  $pos = 0;
524  if($_REQUEST["il_hform_node"] == "page_end")
525  {
526  $a_id = $target;
527  $a_id = array_pop($a_id);
528  $a_id = $a_id["question_id"];
529  $pos = 1;
530  }
531 
532  // cut
533  if($data["mode"] == "cut")
534  {
535  // special case: paste cut on same page (no block handling needed)
536  if($data["source"] == $this->current_page)
537  {
538  // re-order nodes in page
539  if(sizeof($nodes) <= sizeof($source))
540  {
541  $this->object->moveQuestions($nodes, $a_id, $pos);
542  }
543  $this->clearClipboard();
544  return;
545  }
546  else
547  {
548  // only if source has block
549  $source_block_id = false;
550  if(sizeof($source) > 1)
551  {
552  $source_block_id = $source;
553  $source_block_id = array_shift($source_block_id);
554  $source_block_id = $source_block_id["questionblock_id"];
555 
556  // remove from block
557  if(sizeof($source) > sizeof($nodes))
558  {
559  foreach($nodes as $qid)
560  {
561  $this->object->removeQuestionFromBlock($qid, $source_block_id);
562  }
563  }
564  // remove complete block
565  else
566  {
567  $this->object->unfoldQuestionblocks(array($source_block_id));
568  }
569  }
570 
571  // page will be "deleted" by operation
572  if(sizeof($source) == sizeof($nodes) && $data["source"] < $this->current_page)
573  {
574  $this->current_page--;
575  }
576  }
577  }
578 
579  // copy
580  else if($data["mode"] == "copy")
581  {
582  $titles = array();
583  foreach($this->object->getSurveyPages() as $page)
584  {
585  foreach($page as $question)
586  {
587  $titles[] = $question["title"];
588  }
589  }
590 
591  // copy questions
592  $question_pointer = array();
593  foreach($nodes as $qid)
594  {
595  // create new questions
596  $question = ilObjSurvey::_instanciateQuestion($qid);
597 
598  // handle exisiting copies
599  $title = $question->getTitle();
600  $max = 0;
601  foreach($titles as $existing_title)
602  {
603  if(preg_match("/".preg_quote($title)." \(([0-9]+)\)$/", $existing_title, $match))
604  {
605  $max = max($match[1], $max);
606  }
607  }
608  if($max)
609  {
610  $title .= " (".($max+1).")";
611  }
612  else
613  {
614  $title .= " (2)";
615  }
616  $titles[] = $title;
617  $question->setTitle($title);
618 
619  $question->id = -1;
620  $question->saveToDb();
621 
622  $question_pointer[$qid] = $question->getId();
623  $this->appendNewQuestionToSurvey($question->getId(), false);
624  }
625 
626  // copy textblocks
627  $this->object->cloneTextblocks($question_pointer);
628 
629  $this->object->loadQuestionsFromDb();
630 
631  $nodes = array_values($question_pointer);
632  }
633 
634 
635  // paste
636 
637  // create new block
638  if(sizeof($target) == 1)
639  {
640  $nodes = array_merge(array($a_id), $nodes);
641 
642  // moveQuestions() is called within
643  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
644  $nodes);
645  }
646  // add to existing block
647  else
648  {
649  $target_block_id = $target;
650  $target_block_id = array_shift($target_block_id);
651  $target_block_id = $target_block_id["questionblock_id"];
652 
653  foreach($nodes as $qid)
654  {
655  $this->object->addQuestionToBlock($qid, $target_block_id);
656  }
657 
658  // move to new position
659  $this->object->moveQuestions($nodes, $a_id, $pos);
660  }
661 
662  $this->clearClipboard();
663  }
664 
668  protected function dnd()
669  {
670  $source_id = (int)array_pop(explode("_", $_REQUEST["il_hform_source"]));
671  if($_REQUEST["il_hform_target"] != "droparea_end")
672  {
673  $target_id = (int)array_pop(explode("_", $_REQUEST["il_hform_target"]));
674  $pos = 0;
675  }
676  else
677  {
678  $page = $this->object->getSurveyPages();
679  $page = $page[$this->current_page-1];
680  $last = array_pop($page);
681  $target_id = (int)$last["question_id"];
682  $pos = 1;
683  }
684  if($source_id != $target_id)
685  {
686  $this->object->moveQuestions(array($source_id), $target_id, $pos);
687  }
688  }
689 
694  protected function deleteBlock()
695  {
696  global $lng, $ilCtrl;
697 
698  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
699  ilUtil::sendQuestion($lng->txt("remove_questions"));
700 
701  $page = $this->object->getSurveyPages();
702  $page = $page[$this->current_page-1];
703 
704  // #10567
705  if($_REQUEST["csum"] != md5(print_r($page, true)))
706  {
707  $ilCtrl->redirect($this, "renderPage");
708  }
709 
710  $page = array_shift($page);
711  $block_id = $page["questionblock_id"];
712  if($block_id)
713  {
714  $this->editor_gui->removeQuestionsForm(array($block_id), array(), array());
715  }
716  else
717  {
718  $this->editor_gui->removeQuestionsForm(array(), array($page["question_id"]), array());
719  }
720  }
721 
727  protected function deleteQuestion($a_id)
728  {
729  global $ilCtrl;
730 
731  if(!is_array($a_id))
732  {
733  $a_id = array($a_id);
734  }
735 
736  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
737  $this->editor_gui->removeQuestionsForm(array(), $a_id, array());
738  return true;
739  }
740 
744  protected function confirmRemoveQuestions()
745  {
746  global $ilCtrl;
747 
748  // gather ids
749  $ids = array();
750  foreach ($_POST as $key => $value)
751  {
752  if (preg_match("/id_(\d+)/", $key, $matches))
753  {
754  array_push($ids, $matches[1]);
755  }
756  }
757 
758 
759  $pages = $this->object->getSurveyPages();
760  $source = $pages[$this->current_page-1];
761 
762  $block_id = $source;
763  $block_id = array_shift($block_id);
764  $block_id = $block_id["questionblock_id"];
765 
766  if(sizeof($ids) && sizeof($source) > sizeof($ids))
767  {
768  // block is obsolete
769  if(sizeof($source)-sizeof($ids) == 1)
770  {
771  $this->object->unfoldQuestionblocks(array($block_id));
772  }
773  // block will remain, remove question(s) from block
774  else
775  {
776  foreach($ids as $qid)
777  {
778  $this->object->removeQuestionFromBlock($qid, $block_id);
779  }
780  }
781 
782  $this->object->removeQuestions($ids, array());
783  }
784  // all items on page
785  else
786  {
787  // remove complete block
788  if($block_id)
789  {
790  $this->object->removeQuestions(array(), array($block_id));
791  }
792  // remove single question
793  else
794  {
795  $this->object->removeQuestions($ids, array());
796  }
797 
798  // render previous page
799  if($this->current_page > 1)
800  {
801  $this->current_page--;
802  }
803  }
804 
805  $this->object->saveCompletionStatus();
806 
807  // #10567
808  $ilCtrl->setParameter($this, "pgov", $this->current_page);
809  $ilCtrl->redirect($this, "renderPage");
810  }
811 
817  protected function editBlock($a_id)
818  {
819  $this->callEditor("editQuestionblockObject", "bl_id", $a_id);
820  return true;
821  }
822 
828  protected function addHeading($a_id)
829  {
830  $this->callEditor("addHeadingObject", "q_id", $a_id);
831  return true;
832  }
833 
839  protected function editHeading($a_id)
840  {
841  $this->callEditor("editHeadingObject", "q_id", $a_id);
842  return true;
843  }
844 
850  protected function deleteHeading($a_id)
851  {
852  $this->callEditor("removeHeadingObject", "q_id", $a_id);
853  return true;
854  }
855 
856  protected function callEditor($a_cmd, $a_param, $a_value)
857  {
858  global $ilTabs;
859 
860  $ilTabs->clearSubTabs();
861  $_REQUEST[$a_param] = $a_value;
862 
863  call_user_func(array($this->editor_gui, $a_cmd));
864  }
865 
871  protected function splitPage($a_id)
872  {
873  $pages = $this->object->getSurveyPages();
874  $source = $pages[$this->current_page-1];
875 
876  $block_questions = array();
877  $add = $block_id = false;
878  foreach($source as $idx => $item)
879  {
880  if($item["question_id"] == $a_id)
881  {
882  $block_id = $item["questionblock_id"];
883  $add = $idx;
884  }
885  if($add)
886  {
887  $block_questions[] = $item["question_id"];
888  }
889  }
890 
891  // just 1 question left: block is obsolete
892  if($add == 1)
893  {
894  $this->object->unfoldQuestionblocks(array($block_id));
895  }
896  // remove questions from block
897  else
898  {
899  foreach($block_questions as $qid)
900  {
901  $this->object->removeQuestionFromBlock($qid, $block_id);
902  }
903  }
904 
905  // more than 1 moved?
906  if(sizeof($block_questions) > 1)
907  {
908  // create new block and move target questions
909  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
910  $block_questions);
911  }
912 
913  $this->current_page++;
914  }
915 
921  protected function moveNext($a_id)
922  {
923  $pages = $this->object->getSurveyPages();
924  $source = $pages[$this->current_page-1];
925  $target = $pages[$this->current_page];
926  if(sizeof($target))
927  {
928  $target_id = $target;
929  $target_id = array_shift($target_id);
930  $target_block_id = $target_id["questionblock_id"];
931  $target_id = $target_id["question_id"];
932 
933  // nothing to do if no block
934  if(sizeof($source) > 1)
935  {
936  $block_id = $source;
937  $block_id = array_shift($block_id);
938  $block_id = $block_id["questionblock_id"];
939 
940  // source pages block is obsolete
941  if(sizeof($source) == 2)
942  {
943  // delete block
944  $this->object->unfoldQuestionblocks(array($block_id));
945  }
946  else
947  {
948  // remove question from block
949  $this->object->removeQuestionFromBlock($a_id, $block_id);
950  }
951  }
952 
953  // move source question to target
954  $this->object->moveQuestions(array($a_id), $target_id, 0);
955 
956  // new page has no block yet
957  if(sizeof($target) < 2)
958  {
959  // create block and move target question and source into block
960  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
961  array($a_id, $target_id));
962  }
963  else
964  {
965  // add source question to block
966  $this->object->addQuestionToBlock($a_id, $target_block_id);
967  }
968 
969  // only if current page is not "deleted"
970  if(sizeof($source) > 1)
971  {
972  $this->current_page++;
973  }
974  }
975  }
976 
982  protected function movePrevious($a_id)
983  {
984  $pages = $this->object->getSurveyPages();
985  $source = $pages[$this->current_page-1];
986  $target = $pages[$this->current_page-2];
987  if(sizeof($target))
988  {
989  $target_id = $target;
990  $target_id = array_pop($target_id);
991  $target_block_id = $target_id["questionblock_id"];
992  $target_id = $target_id["question_id"];
993 
994  // nothing to do if no block
995  if(sizeof($source) > 1)
996  {
997  $block_id = $source;
998  $block_id = array_shift($block_id);
999  $block_id = $block_id["questionblock_id"];
1000 
1001  // source pages block is obsolete
1002  if(sizeof($source) == 2)
1003  {
1004  // delete block
1005  $this->object->unfoldQuestionblocks(array($block_id));
1006  }
1007  else
1008  {
1009  // remove question from block
1010  $this->object->removeQuestionFromBlock($a_id, $block_id);
1011  }
1012  }
1013 
1014  // move source question to target
1015  $this->object->moveQuestions(array($a_id), $target_id, 1);
1016 
1017  // new page has no block yet
1018  if(sizeof($target) < 2)
1019  {
1020  // create block and move target question and source into block
1021  $this->object->createQuestionblock($this->getAutoBlockTitle(), true, false,
1022  array($target_id, $a_id));
1023  }
1024  else
1025  {
1026  // add source question to block
1027  $this->object->addQuestionToBlock($a_id, $target_block_id);
1028  }
1029 
1030  $this->current_page--;
1031  }
1032  }
1033 
1039  protected function editQuestion($a_id)
1040  {
1041  global $ilCtrl;
1042 
1043  $data = $this->object->getSurveyQuestions();
1044  $data = $data[$a_id];
1045 
1046  $q_gui = $data["type_tag"]."GUI";
1047  $ilCtrl->setParameterByClass($q_gui, "pgov", $this->current_page);
1048  $ilCtrl->setParameterByClass($q_gui, "q_id", $a_id);
1049 
1050  $ilCtrl->redirectByClass($q_gui, "editQuestion");
1051  }
1052 
1056  protected function addQuestionToolbarForm()
1057  {
1058  global $lng, $ilCtrl, $tpl;
1059 
1060  include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
1061  $form = new ilPropertyFormGUI();
1062  $form->setFormAction($ilCtrl->getFormAction($this, "addQuestionToolbar"));
1063  $form->setTitle($lng->txt("survey_add_new_question"));
1064 
1065  // question types
1066  include_once "./Modules/SurveyQuestionPool/classes/class.ilObjSurveyQuestionPool.php";
1067  $questiontypes = ilObjSurveyQuestionPool::_getQuestiontypes();
1068  $type_map = array();
1069  foreach($questiontypes as $trans => $item)
1070  {
1071  $type_map[$item["questiontype_id"]] = $trans;
1072  }
1073  include_once("./Services/Form/classes/class.ilSelectInputGUI.php");
1074  $si = new ilSelectInputGUI($lng->txt("question_type"), "qtype");
1075  $si->setOptions($type_map);
1076  $form->addItem($si);
1077 
1078  $pages = $this->object->getSurveyPages();
1079  if($pages)
1080  {
1081  $pages_drop = array("fst"=>$lng->txt("survey_at_beginning"));
1082  foreach($pages as $idx => $questions)
1083  {
1084  $question = array_shift($questions);
1085  if($question["questionblock_id"])
1086  {
1087  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".$question["questionblock_title"];
1088  }
1089  else
1090  {
1091  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".strip_tags($question["title"]);
1092  }
1093  }
1094  $pos = new ilSelectInputGUI($lng->txt("position"), "pgov");
1095  $pos->setOptions($pages_drop);
1096  $form->addItem($pos);
1097 
1098  $pos->setValue($this->current_page);
1099  }
1100  else
1101  {
1102  // #9089: 1st page
1103  $pos = new ilHiddenInputGUI("pgov");
1104  $pos->setValue("fst");
1105  $form->addItem($pos);
1106  }
1107 
1108  if($this->object->isPoolActive())
1109  {
1110  $this->editor_gui->createQuestionObject($form);
1111  }
1112 
1113  $form->addCommandButton("addQuestionToolbar", $lng->txt("create"));
1114  $form->addCommandButton("renderPage", $lng->txt("cancel"));
1115 
1116  return $tpl->setContent($form->getHTML());
1117  }
1118 
1122  protected function addQuestionToolbar()
1123  {
1124  global $ilCtrl, $lng;
1125 
1126  $pool_active = $this->object->isPoolActive();
1127 
1128  if(!$_POST["usage"] && $pool_active)
1129  {
1130  ilUtil::sendFailure($lng->txt("select_one"), true);
1131  return $this->addQuestionToolbarForm();
1132  }
1133 
1134  // make sure that it is set for current and next requests
1135  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
1136 
1137  if(!$this->addQuestion($_POST["qtype"], $pool_active, $_POST["pgov"], "toolbar"))
1138  {
1139  $this->renderPage();
1140  }
1141  }
1142 
1146  protected function movePageForm()
1147  {
1148  global $lng, $ilCtrl, $tpl;
1149 
1150  include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
1151  $form = new ilPropertyFormGUI();
1152  $form->setFormAction($ilCtrl->getFormAction($this, "movePage"));
1153  $form->setTitle($lng->txt("survey_move_page"));
1154 
1155  $old_pos = new ilHiddenInputGUI("old_pos");
1156  $old_pos->setValue($this->current_page);
1157  $form->addItem($old_pos);
1158 
1159  $pages = $this->object->getSurveyPages();
1160  if($pages)
1161  {
1162  $pages_drop = array();
1163  if($this->current_page != 1)
1164  {
1165  $pages_drop["fst"] = $lng->txt("survey_at_beginning");
1166  }
1167  foreach($pages as $idx => $questions)
1168  {
1169  if(($idx+1) != $this->current_page && ($idx+2) != $this->current_page)
1170  {
1171  $question = array_shift($questions);
1172  if($question["questionblock_id"])
1173  {
1174  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".$question["questionblock_title"];
1175  }
1176  else
1177  {
1178  $pages_drop[$idx+1] = $lng->txt("survey_behind_page")." ".strip_tags($question["title"]);
1179  }
1180  }
1181  }
1182  $pos = new ilSelectInputGUI($lng->txt("position"), "pgov");
1183  $pos->setOptions($pages_drop);
1184  $form->addItem($pos);
1185  }
1186 
1187  $form->addCommandButton("movePage", $lng->txt("submit"));
1188  $form->addCommandButton("renderPage", $lng->txt("cancel"));
1189 
1190  return $tpl->setContent($form->getHTML());
1191  }
1192 
1196  protected function movePage()
1197  {
1198  global $lng, $ilCtrl;
1199 
1200  // current_page is already set to new position
1201  $target_page = $this->current_page-1;
1202  $source_page = $_REQUEST["old_pos"]-1;
1203 
1204  $pages = $this->object->getSurveyPages();
1205  foreach($pages[$source_page] as $question)
1206  {
1207  $questions[] = $question["question_id"];
1208  }
1209 
1210  // move to first position
1211  $position = 0;
1212  if($_REQUEST["pgov"] != "fst")
1213  {
1214  $position = 1;
1215  }
1216 
1217  $target = $pages[$target_page];
1218  $target = array_shift($target);
1219  $this->object->moveQuestions($questions, $target["question_id"], $position);
1220 
1221  if($target_page < $source_page && $position)
1222  {
1223  $this->current_page++;
1224  }
1225 
1226  ilUtil::sendSuccess($lng->txt("survey_page_moved"), true);
1227  $ilCtrl->setParameter($this, "pgov", $this->current_page);
1228  $ilCtrl->redirect($this, "renderPage");
1229  }
1230 
1236  protected function renderToolbar($a_pages)
1237  {
1238  global $ilToolbar, $ilCtrl, $lng, $ilUser;
1239 
1240  include_once "Services/UIComponent/Button/classes/class.ilLinkButton.php";
1241 
1242  if(!$this->has_datasets)
1243  {
1244  $button = ilLinkButton::getInstance();
1245  $button->setCaption("survey_add_new_question");
1246  $button->setUrl($ilCtrl->getLinkTarget($this, "addQuestionToolbarForm"));
1247  $ilToolbar->addButtonInstance($button);
1248 
1249  if($this->object->isPoolActive())
1250  {
1251  $ilToolbar->addSeparator();
1252 
1253  $last_on_page = 0;
1254  if($a_pages &&
1255  is_array($a_pages[$this->current_page-1]))
1256  {
1257  $last_on_page = $a_pages[$this->current_page-1];
1258  $last_on_page = array_pop($last_on_page);
1259  $last_on_page = $last_on_page["question_id"];
1260  }
1261 
1262  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
1263  $ilCtrl->setParameter($this->editor_gui, "pgov_pos", $last_on_page."c");
1264 
1265  $cmd = ($ilUser->getPref('svy_insert_type') == 1 ||
1266  strlen($ilUser->getPref('svy_insert_type')) == 0)
1267  ? 'browseForQuestions'
1268  : 'browseForQuestionblocks';
1269 
1270  $button = ilLinkButton::getInstance();
1271  $button->setCaption("browse_for_questions");
1272  $button->setUrl($ilCtrl->getLinkTarget($this->editor_gui, $cmd));
1273  $ilToolbar->addButtonInstance($button);
1274 
1275  $ilCtrl->setParameter($this->editor_gui, "pgov", "");
1276  $ilCtrl->setParameter($this->editor_gui, "pgov_pos", "");
1277  }
1278 
1279  if($a_pages)
1280  {
1281  $ilToolbar->addSeparator();
1282  }
1283  }
1284 
1285  // parse data for pages drop-down
1286  if($a_pages)
1287  {
1288  // previous/next
1289 
1290  $ilCtrl->setParameter($this, "pg", $this->current_page-1);
1291  $button = ilLinkButton::getInstance();
1292  $button->setCaption("survey_prev_question");
1293  $button->setUrl($ilCtrl->getLinkTarget($this, "renderPage"));
1294  $button->setDisabled(!$this->has_previous_page);
1295  $ilToolbar->addButtonInstance($button);
1296 
1297  $ilCtrl->setParameter($this, "pg", $this->current_page+1);
1298  $button = ilLinkButton::getInstance();
1299  $button->setCaption("survey_next_question");
1300  $button->setUrl($ilCtrl->getLinkTarget($this, "renderPage"));
1301  $button->setDisabled(!$this->has_next_page);
1302  $ilToolbar->addButtonInstance($button);
1303 
1304  $ilCtrl->setParameter($this, "pg", $this->current_page); // #14615
1305 
1306  foreach($a_pages as $idx => $questions)
1307  {
1308  $page = $questions;
1309  $page = array_shift($page);
1310  if($page["questionblock_id"])
1311  {
1312  $pages_drop[$idx+1] = $page["questionblock_title"];
1313 
1314  if(sizeof($questions) > 1)
1315  {
1316  foreach($questions as $question)
1317  {
1318  $pages_drop[($idx+1)."__".$question["question_id"]] = "- ".$question["title"];
1319  }
1320  }
1321  }
1322  else
1323  {
1324  $pages_drop[$idx+1] = strip_tags($page["title"]);
1325  }
1326  }
1327  }
1328 
1329  // jump to page
1330  if(sizeof($pages_drop) > 1)
1331  {
1332  $ilToolbar->addSeparator();
1333 
1334  $ilToolbar->setFormAction($ilCtrl->getFormAction($this));
1335 
1336  include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
1337  $si = new ilSelectInputGUI($lng->txt("survey_jump_to"), "jump");
1338  $si->addCustomAttribute("onChange=\"forms['ilToolbar'].submit();\"");
1339  $si->setOptions($pages_drop);
1340  $si->setValue($this->current_page);
1341  $ilToolbar->addInputItem($si, true);
1342 
1343  // we need this to have to right cmd
1344  $cmd = new ilHiddenInputGUI("cmd[renderPage]");
1345  $cmd->setValue("1");
1346  $ilToolbar->addInputItem($cmd);
1347 
1348  if(!$this->has_datasets)
1349  {
1350  $ilToolbar->addSeparator();
1351 
1352  $ilCtrl->setParameter($this, "csum", md5(print_r($a_pages[$this->current_page-1], true)));
1353  $url = $ilCtrl->getLinkTarget($this, "deleteBlock");
1354  $ilCtrl->setParameter($this, "csum", "");
1355 
1356  $button = ilLinkButton::getInstance();
1357  $button->setCaption("survey_delete_page");
1358  $button->setUrl($url);
1359  $ilToolbar->addButtonInstance($button);
1360 
1361  $ilToolbar->addSeparator();
1362 
1363  $button = ilLinkButton::getInstance();
1364  $button->setCaption("survey_move_page");
1365  $button->setUrl($ilCtrl->getLinkTarget($this, "movePageForm"));
1366  $ilToolbar->addButtonInstance($button);
1367  }
1368  }
1369  }
1370 
1374  protected function renderPage()
1375  {
1376  global $ilCtrl, $lng, $tpl, $rbacsystem;
1377 
1378  $pages = $this->object->getSurveyPages();
1379  $this->has_next_page = ($this->current_page < sizeof($pages));
1380  $this->has_previous_page = ($this->current_page > 1);
1381  $this->has_datasets = $this->object->_hasDatasets($this->object->getSurveyId());
1382 
1383  if($this->has_datasets)
1384  {
1385  $link = $ilCtrl->getLinkTargetByClass(array("ilobjsurveygui", "ilsurveyparticipantsgui"), "maintenance");
1386  $link = "<a href=\"".$link."\">".$lng->txt("survey_has_datasets_warning_page_view_link")."</a>";
1387  ilUtil::sendInfo($lng->txt("survey_has_datasets_warning_page_view")." ".$link);
1388  }
1389 
1390  $ilCtrl->setParameter($this, "pg", $this->current_page);
1391  $ilCtrl->setParameter($this, "pgov", "");
1392 
1393  $this->renderToolbar($pages);
1394 
1395  if($pages)
1396  {
1397  $ttpl = new ilTemplate("tpl.il_svy_svy_page_view.html", true, true, "Modules/Survey");
1398  $ttpl->setVariable("FORM_ACTION", $ilCtrl->getFormAction($this));
1399  $lng->loadLanguageModule("form");
1400 
1401  $read_only = ($this->has_datasets || !$rbacsystem->checkAccess("write", $this->ref_id));
1402 
1403  $commands = $multi_commands = array();
1404 
1405  if(!$read_only)
1406  {
1407  // clipboard is empty
1408  if(!$_SESSION["survey_page_view"][$this->ref_id]["clipboard"])
1409  {
1410  $multi_commands[] = array("cmd"=>"multiDelete", "text"=>$lng->txt("delete"));
1411  $multi_commands[] = array("cmd"=>"multiCut", "text"=>$lng->txt("cut"));
1412  $multi_commands[] = array("cmd"=>"multiCopy", "text"=>$lng->txt("copy"));
1413  $multi_commands[] = array("cmd"=>"selectAll", "text"=>$lng->txt("select_all"));
1414  }
1415  else
1416  {
1417  if(!$this->suppress_clipboard_msg)
1418  {
1419  ilUtil::sendInfo($lng->txt("survey_clipboard_notice"));
1420  }
1421  $multi_commands[] = array("cmd"=>"clearClipboard", "text"=>$lng->txt("survey_dnd_clear_clipboard"));
1422  }
1423 
1424  // help - see ilPageObjectGUI::insertHelp()
1425  $lng->loadLanguageModule("content");
1426  $ttpl->setCurrentBlock("help_section");
1427  $ttpl->setVariable("TXT_ADD_EL", $lng->txt("cont_add_elements"));
1428  include_once("./Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php");
1429  $ttpl->setVariable("PLUS", ilGlyphGUI::get(ilGlyphGUI::ADD));
1430  $ttpl->setVariable("DRAG_ARROW", ilGlyphGUI::get(ilGlyphGUI::DRAG));
1431  $ttpl->setVariable("TXT_DRAG", $lng->txt("cont_drag_and_drop_elements"));
1432  $ttpl->setVariable("TXT_SEL", $lng->txt("cont_double_click_to_delete"));
1433  $ttpl->parseCurrentBlock();
1434 
1435  $ttpl->setVariable("DND_INIT_JS", "initDragElements();");
1436 
1437 
1438  // tiny mce
1439 
1440  include_once "./Services/AdvancedEditing/classes/class.ilObjAdvancedEditing.php";
1441  $tags = ilObjAdvancedEditing::_getUsedHTMLTags("survey");
1442 
1443  include_once "./Services/RTE/classes/class.ilTinyMCE.php";
1444  $tiny = new ilTinyMCE();
1445  $ttpl->setVariable("WYSIWYG_BLOCKFORMATS", $tiny->_buildAdvancedBlockformatsFromHTMLTags($tags));
1446  $ttpl->setVariable("WYSIWYG_VALID_ELEMENTS", $tiny->_getValidElementsFromHTMLTags($tags));
1447 
1448  $buttons_1 = $tiny->_buildAdvancedButtonsFromHTMLTags(1, $tags);
1449  $buttons_2 = $tiny->_buildAdvancedButtonsFromHTMLTags(2, $tags).','.
1450  $tiny->_buildAdvancedTableButtonsFromHTMLTags($tags).
1451  ($tiny->getStyleSelect() ? ',styleselect' : '');
1452  $buttons_3 = $tiny->_buildAdvancedButtonsFromHTMLTags(3, $tags);
1453  $ttpl->setVariable('WYSIWYG_BUTTONS_1', $tiny->_removeRedundantSeparators($buttons_1));
1454  $ttpl->setVariable('WYSIWYG_BUTTONS_2', $tiny->_removeRedundantSeparators($buttons_2));
1455  $ttpl->setVariable('WYSIWYG_BUTTONS_3', $tiny->_removeRedundantSeparators($buttons_3));
1456  }
1457 
1458  // commands
1459  if (count($multi_commands) > 0)
1460  {
1461  foreach($multi_commands as $cmd)
1462  {
1463  $ttpl->setCurrentBlock("multi_cmd");
1464  $ttpl->setVariable("ORG_CMD_MULTI", "renderPage");
1465  $ttpl->setVariable("MULTI_CMD", $cmd["cmd"]);
1466  $ttpl->setVariable("MULTI_CMD_TXT", $cmd["text"]);
1467  $ttpl->parseCurrentBlock();
1468  }
1469 
1470  $ttpl->setCurrentBlock("multi_cmds");
1471  $ttpl->setVariable("MCMD_ALT", $lng->txt("commands"));
1472  $ttpl->setVariable("MCMD_IMG", ilUtil::getImagePath("arrow_downright.svg"));
1473  $ttpl->parseCurrentBlock();
1474  }
1475 
1476  // nodes
1477  $ttpl->setVariable("NODES", $this->getPageNodes($pages[$this->current_page-1],
1478  $this->has_previous_page, $this->has_next_page, $read_only));
1479 
1480  $tpl->setContent($ttpl->get());
1481 
1482  // add js to template
1483  include_once("./Services/YUI/classes/class.ilYuiUtil.php");
1485  $tpl->addJavascript("./Modules/Survey/js/SurveyPageView.js");
1486  $tpl->addJavascript("./Services/RTE/tiny_mce_3_5_11/tiny_mce_src.js");
1487  }
1488  }
1489 
1499  function getPageNodes(array $a_questions, $a_has_previous_page = false, $a_has_next_page = false, $a_readonly = false)
1500  {
1501  global $ilCtrl, $lng;
1502 
1503  $ttpl = new ilTemplate("tpl.il_svy_svy_page_view_nodes.html", true, true, "Modules/Survey");
1504 
1505  $has_clipboard = (bool)$_SESSION["survey_page_view"][$this->ref_id]["clipboard"];
1506 
1507  // question block ?
1508 
1509  $first_question = $a_questions;
1510  $first_question = array_shift($first_question);
1511 
1512  if($first_question["questionblock_id"])
1513  {
1514  $menu = array();
1515 
1516  if(!$a_readonly && !$has_clipboard)
1517  {
1518  $menu[] = array("cmd" => "editBlock", "text" => $lng->txt("edit"));
1519  }
1520 
1521  if($first_question["questionblock_show_blocktitle"])
1522  {
1523  $block_status = $lng->txt("survey_block_visible");
1524  }
1525  else
1526  {
1527  $block_status = $lng->txt("survey_block_hidden");
1528  }
1529 
1530  $this->renderPageNode($ttpl, "block", $first_question["questionblock_id"],
1531  $first_question["questionblock_title"]." (".$block_status.")", $menu, false, false, $block_status);
1532  }
1533 
1534 
1535  // questions/headings
1536 
1537  include_once "./Modules/SurveyQuestionPool/classes/class.ilObjSurveyQuestionPool.php";
1538  $questiontypes = ilObjSurveyQuestionPool::_getQuestiontypes();
1539  $questionpools = array_keys($this->object->getQuestionpoolTitles(true));
1540 
1541  $counter = $question_count;
1542  $block_done = null;
1543  foreach($a_questions as $idx => $question)
1544  {
1545  // drop area
1546 
1547  $menu = array();
1548 
1549  if(!$a_readonly)
1550  {
1551  if(!$has_clipboard)
1552  {
1553  foreach($questiontypes as $trans => $item)
1554  {
1555  $menu[] = array("cmd"=> "addQuestion_".$item["questiontype_id"],
1556  "text"=> sprintf($lng->txt("svy_page_add_question"), $trans));
1557  }
1558 
1559  if($this->object->isPoolActive())
1560  {
1561  $menu[] = array("cmd"=> "addPoolQuestion",
1562  "text"=> $lng->txt("browse_for_questions"));
1563  }
1564  }
1565  else
1566  {
1567  $menu[] = array("cmd" => "paste", "text" => $lng->txt("survey_dnd_paste"));
1568  }
1569  }
1570 
1571  $this->renderPageNode($ttpl, "droparea", $question["question_id"], null, $menu, true);
1572 
1573  // question
1574  $question_gui = $this->object->getQuestionGUI($question["type_tag"], $question["question_id"]);
1575  $question_form = $question_gui->getWorkingForm(array(), $this->object->getShowQuestionTitles(),
1576  $question["questionblock_show_questiontext"], null, $this->object->getSurveyId());
1577 
1578  $menu = array();
1579 
1580  if(!$a_readonly && !$has_clipboard)
1581  {
1582  $menu[] = array("cmd" => "editQuestion", "text" => $lng->txt("edit"));
1583  $menu[] = array("cmd" => "cutQuestion", "text" => $lng->txt("cut"));
1584  $menu[] = array("cmd" => "copyQuestion", "text" => $lng->txt("copy"));
1585 
1586  if(sizeof($a_questions) > 1 && $idx > 0)
1587  {
1588  $menu[] = array("cmd" => "splitPage", "text" => $lng->txt("survey_dnd_split_page"));
1589  }
1590  if($a_has_next_page)
1591  {
1592  $menu[] = array("cmd" => "moveNext", "text" => $lng->txt("survey_dnd_move_next"));
1593  }
1594  if($a_has_previous_page)
1595  {
1596  $menu[] = array("cmd" => "movePrevious", "text" => $lng->txt("survey_dnd_move_previous"));
1597  }
1598 
1599  $menu[] = array("cmd" => "deleteQuestion", "text" => $lng->txt("delete"));
1600 
1601  // heading
1602  if($question["heading"])
1603  {
1604  $menu[] = array("cmd" => "editHeading", "text" => $lng->txt("survey_edit_heading"));
1605  $menu[] = array("cmd" => "deleteHeading", "text" => $lng->txt("survey_delete_heading"));
1606  }
1607  else
1608  {
1609  $menu[] = array("cmd" => "addHeading", "text" => $lng->txt("add_heading"));
1610  }
1611  }
1612 
1613  if($first_question["questionblock_show_questiontext"])
1614  {
1615  $question_title_status = $lng->txt("survey_question_text_visible");
1616  }
1617  else
1618  {
1619  $question_title_status = $lng->txt("survey_question_text_hidden");
1620  }
1621 
1622  $this->renderPageNode($ttpl, "question", $question["question_id"], $question_form, $menu,
1623  false, $question["title"], $question_title_status, $question["heading"]);
1624 
1625  $ilCtrl->setParameter($this, "eqid", "");
1626  }
1627 
1628 
1629  // last position (no question id)
1630 
1631  $menu = array();
1632 
1633  if(!$a_readonly)
1634  {
1635  if(!$has_clipboard)
1636  {
1637  foreach($questiontypes as $trans => $item)
1638  {
1639  $menu[] = array("cmd"=> "addQuestion_".$item["questiontype_id"],
1640  "text"=> sprintf($lng->txt("svy_page_add_question"), $trans));
1641  }
1642 
1643  if($this->object->isPoolActive())
1644  {
1645  $menu[] = array("cmd"=> "addPoolQuestion",
1646  "text"=> $lng->txt("browse_for_questions"));
1647  }
1648  }
1649  else
1650  {
1651  $menu[] = array("cmd" => "paste", "text" => $lng->txt("survey_dnd_paste"));
1652  }
1653  }
1654 
1655  $this->renderPageNode($ttpl, "page", "end", null, $menu, true);
1656 
1657  return $ttpl->get();
1658  }
1659 
1672  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)
1673  {
1674  global $ilCtrl, $lng;
1675 
1676  $node_id = $a_type."_".$a_id;
1677 
1678  if($a_spacer)
1679  {
1680  if($a_menu)
1681  {
1682  // drop area menu
1683  foreach($a_menu as $mcnt => $menu_item)
1684  {
1685  $ilCtrl->setParameter($this, "il_hform_node", $node_id);
1686  $ilCtrl->setParameter($this, "il_hform_subcmd", $menu_item["cmd"]);
1687  $url = $ilCtrl->getLinkTarget($this, "renderPage");
1688  $ilCtrl->setParameter($this, "il_hform_subcmd", "");
1689  $ilCtrl->setParameter($this, "il_hform_node", "");
1690 
1691  $a_tpl->setCurrentBlock("menu_cmd");
1692  $a_tpl->setVariable("TXT_MENU_CMD", $menu_item["text"]);
1693  $a_tpl->setVariable("URL_MENU_CMD", $url);
1694  $a_tpl->parseCurrentBlock();
1695  }
1696  }
1697 
1698  $a_tpl->setCurrentBlock("drop_area");
1699  include_once "Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php";
1700  $a_tpl->setVariable("ICON_ADD", ilGlyphGUI::get(ilGlyphGUI::ADD));
1701  $a_tpl->setVariable("DROP_ID", $a_id);
1702  $a_tpl->parseCurrentBlock();
1703  }
1704  else if($a_menu)
1705  {
1706  // question action menu
1707  foreach($a_menu as $mcnt => $menu_item)
1708  {
1709  $ilCtrl->setParameter($this, "il_hform_node", $node_id);
1710  $ilCtrl->setParameter($this, "il_hform_subcmd", $menu_item["cmd"]);
1711  $url = $ilCtrl->getLinkTarget($this, "renderPage");
1712  $ilCtrl->setParameter($this, "il_hform_subcmd", "");
1713  $ilCtrl->setParameter($this, "il_hform_node", "");
1714 
1715  $a_tpl->setCurrentBlock("action_cmd");
1716  $a_tpl->setVariable("TXT_ACTION_CMD", $menu_item["text"]);
1717  $a_tpl->setVariable("URL_ACTION_CMD", $url);
1718  $a_tpl->parseCurrentBlock();
1719  }
1720  }
1721 
1722  // add heading to content
1723  if($a_content !== null &&
1724  $a_type == "question" &&
1725  $a_heading)
1726  {
1727  $a_content = "<div class=\"questionheading\">".$a_heading."</div>".
1728  $a_content;
1729  }
1730 
1731  if($a_menu)
1732  {
1733  $a_tpl->setVariable("TXT_NODE_CONTENT_ACTIONS", $a_content);
1734  }
1735  else
1736  {
1737  $a_tpl->setVariable("TXT_NODE_CONTENT_NO_ACTIONS", $a_content);
1738  }
1739 
1740  if($a_content !== null)
1741  {
1742  $drag = "";
1743  $selectable = false;
1744  switch($a_type)
1745  {
1746  case "block":
1747  $caption = $lng->txt("questionblock");
1748  break;
1749 
1750  case "question":
1751  $caption = $lng->txt("question").": ".$a_subtitle;
1752  $drag = "_drag";
1753  $selectable = true;
1754  break;
1755 
1756  case "heading":
1757  $caption = $lng->txt("heading");
1758  break;
1759 
1760  default:
1761  return;
1762  }
1763 
1764  if($a_status)
1765  {
1766  $caption .= " (".$a_status.")";
1767  }
1768 
1769  $a_tpl->setCurrentBlock("list_item");
1770  $a_tpl->setVariable("NODE_ID", $node_id);
1771  $a_tpl->setVariable("NODE_DRAG", $drag);
1772  $a_tpl->setVariable("TXT_NODE_TYPE", $caption);
1773  if($selectable)
1774  {
1775  $a_tpl->setVariable("SELECTABLE", " selectable");
1776  }
1777  $a_tpl->parseCurrentBlock();
1778  }
1779 
1780  $a_tpl->touchBlock("element");
1781  }
1782 
1788  public function getAutoBlockTitle()
1789  {
1790  global $lng;
1791 
1792  return $lng->txt("survey_auto_block_title");
1793  }
1794 
1795  public function addPoolQuestion($pos, $node)
1796  {
1797  global $ilCtrl, $ilUser;
1798 
1799  if($node == "page_end")
1800  {
1801  $pos = $this->object->getSurveyPages();
1802  $pos = array_pop($pos[$this->current_page-1]);
1803  $pos = $pos["question_id"]."a";
1804  }
1805  else
1806  {
1807  $pos = $pos."b";
1808  }
1809 
1810  $ilCtrl->setParameter($this->editor_gui, "pgov", $this->current_page);
1811  $ilCtrl->setParameter($this->editor_gui, "pgov_pos", $pos);
1812 
1813  $cmd = ($ilUser->getPref('svy_insert_type') == 1 || strlen($ilUser->getPref('svy_insert_type')) == 0) ? 'browseForQuestions' : 'browseForQuestionblocks';
1814  $ilCtrl->redirect($this->editor_gui, $cmd);
1815  }
1816 }
1817 
1818 ?>