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