1<?php
2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4/**
5* Class ilSurveyEditorGUI
6*
7* @author	Jörg Lützenkirchen <luetzenkirchen@leifos.com>
8* @version  $Id: class.ilObjSurveyGUI.php 43670 2013-07-26 08:41:31Z jluetzen $
9*
10* @ilCtrl_Calls ilSurveyEditorGUI: SurveyMultipleChoiceQuestionGUI, SurveyMetricQuestionGUI
11* @ilCtrl_Calls ilSurveyEditorGUI: SurveySingleChoiceQuestionGUI, SurveyTextQuestionGUI
12* @ilCtrl_Calls ilSurveyEditorGUI: SurveyMatrixQuestionGUI, ilSurveyPageGUI
13*
14* @ingroup ModulesSurvey
15*/
16class ilSurveyEditorGUI
17{
18    /**
19     * @var ilCtrl
20     */
21    protected $ctrl;
22
23    /**
24     * @var ilLanguage
25     */
26    protected $lng;
27
28    /**
29     * @var ilTemplate
30     */
31    protected $tpl;
32
33    /**
34     * @var ilTabsGUI
35     */
36    protected $tabs;
37
38    /**
39     * @var ilHelpGUI
40     */
41    protected $help;
42
43    /**
44     * @var ilToolbarGUI
45     */
46    protected $toolbar;
47
48    /**
49     * @var ilObjUser
50     */
51    protected $user;
52
53    /**
54     * @var ilTree
55     */
56    protected $tree;
57
58    protected $parent_gui; // [ilObjSurveyGUI]
59    protected $object; // [ilObjSurvey]
60
61    /**
62     * @var array
63     */
64    protected $print_options;
65
66    public function __construct(ilObjSurveyGUI $a_parent_gui)
67    {
68        global $DIC;
69
70        $this->tabs = $DIC->tabs();
71        $this->help = $DIC["ilHelp"];
72        $this->toolbar = $DIC->toolbar();
73        $this->user = $DIC->user();
74        $this->tree = $DIC->repositoryTree();
75        $ilCtrl = $DIC->ctrl();
76        $lng = $DIC->language();
77        $tpl = $DIC["tpl"];
78
79        $this->parent_gui = $a_parent_gui;
80        $this->object = $this->parent_gui->object;
81
82        $this->ctrl = $ilCtrl;
83        $this->lng = $lng;
84        $this->tpl = $tpl;
85
86        $this->ctrl->saveParameter($this, array("pgov", "pgov_pos"));
87
88        $this->print_options = array(
89            //0 => $this->lng->txt('none'),
90            ilObjSurvey::PRINT_HIDE_LABELS => $this->lng->txt('svy_print_hide_labels'),
91            //2 => $this->lng->txt('svy_print_label_only'),
92            ilObjSurvey::PRINT_SHOW_LABELS => $this->lng->txt('svy_print_show_labels')
93        );
94    }
95
96    public function executeCommand()
97    {
98        $ilTabs = $this->tabs;
99
100        $cmd = $this->ctrl->getCmd("questions");
101
102        if ($_REQUEST["pgov"]) {
103            if ($cmd == "questions") {
104                $this->ctrl->setCmdClass("ilsurveypagegui");
105                $this->ctrl->setCmd("renderpage");
106            } elseif ($cmd == "confirmRemoveQuestions") {
107                // #14324
108                $this->ctrl->setCmdClass("ilsurveypagegui");
109                $this->ctrl->setCmd("confirmRemoveQuestions");
110            }
111        }
112
113        $next_class = $this->ctrl->getNextClass($this);
114        switch ($next_class) {
115            case 'ilsurveypagegui':
116                $this->questionsSubtabs("page");
117                include_once './Modules/Survey/classes/class.ilSurveyPageGUI.php';
118                $pg = new ilSurveyPageGUI($this->object, $this);
119                $this->ctrl->forwardCommand($pg);
120                break;
121
122            default:
123                // question gui
124                if (stristr($next_class, "questiongui")) {
125                    $ilTabs->clearTargets();
126                    $this->ctrl->saveParameter($this, array("new_for_survey"));
127
128                    include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestionGUI.php";
129                    $q_gui = SurveyQuestionGUI::_getQuestionGUI(null, $_REQUEST["q_id"]);
130                    if (is_object($q_gui->object)) {
131                        $ilHelp = $this->help;
132                        $ilHelp->setScreenIdComponent("spl_qt" . $q_gui->object->getQuestionTypeId());
133                    }
134                    // $q_gui->object->setObjId($this->object->getId());
135                    $q_gui->setBackUrl($this->ctrl->getLinkTarget($this, "questions"));
136                    $q_gui->setQuestionTabs();
137                    $this->ctrl->forwardCommand($q_gui);
138
139                    if (!(int) $_REQUEST["new_for_survey"]) {
140                        // not on create
141                        $this->tpl->setTitle($this->lng->txt("question") . ": " . $q_gui->object->getTitle());
142                    }
143                } else {
144                    $cmd .= "Object";
145                    $this->$cmd();
146                }
147                break;
148        }
149    }
150
151    protected function questionsSubtabs($a_cmd)
152    {
153        $ilTabs = $this->tabs;
154
155        if ($a_cmd == "questions" && $_REQUEST["pgov"]) {
156            $a_cmd = "page";
157        }
158
159        $hidden_tabs = array();
160        $template = $this->object->getTemplate();
161        if ($template) {
162            include_once "Services/Administration/classes/class.ilSettingsTemplate.php";
163            $template = new ilSettingsTemplate($template);
164            $hidden_tabs = $template->getHiddenTabs();
165        }
166
167        $ilTabs->addSubTab(
168            "page",
169            $this->lng->txt("survey_per_page_view"),
170            $this->ctrl->getLinkTargetByClass("ilsurveypagegui", "renderPage")
171        );
172
173        if (!in_array("survey_question_editor", $hidden_tabs)) {
174            $this->ctrl->setParameter($this, "pgov", "");
175            $ilTabs->addSubTab(
176                "questions",
177                $this->lng->txt("survey_question_editor"),
178                $this->ctrl->getLinkTarget($this, "questions")
179            );
180            $this->ctrl->setParameter($this, "pgov", $_REQUEST["pgov"]);
181        }
182
183        $ilTabs->addSubTab(
184            "print",
185            $this->lng->txt("print_view"),
186            $this->ctrl->getLinkTarget($this, "printView")
187        );
188
189        if ($this->object->getSurveyPages()) {
190            if ($a_cmd == "page") {
191                $this->ctrl->setParameterByClass("ilsurveyexecutiongui", "pgov", max(1, $_REQUEST["pg"]));
192            }
193            $this->ctrl->setParameterByClass("ilsurveyexecutiongui", "prvw", 1);
194            $ilTabs->addSubTab(
195                "preview",
196                $this->lng->txt("preview"),
197                $this->ctrl->getLinkTargetByClass(array("ilobjsurveygui", "ilsurveyexecutiongui"), "preview")
198            );
199        }
200
201        $ilTabs->activateSubTab($a_cmd);
202    }
203
204
205    //
206    // QUESTIONS BROWSER INCL. MULTI-ACTIONS
207    //
208
209    public function questionsObject()
210    {
211        $ilToolbar = $this->toolbar;
212        $ilUser = $this->user;
213
214        // insert new questions?
215        if ($_GET["new_id"] > 0) {
216            // add a question to the survey previous created in a questionpool
217            $existing = $this->object->getExistingQuestions();
218            if (!in_array($_GET["new_id"], $existing)) {
219                $inserted = $this->object->insertQuestion($_GET["new_id"]);
220                if (!$inserted) {
221                    ilUtil::sendFailure($this->lng->txt("survey_error_insert_incomplete_question"));
222                }
223            }
224        }
225
226        $this->questionsSubtabs("questions");
227
228        $hasDatasets = ilObjSurvey::_hasDatasets($this->object->getSurveyId());
229        $read_only = $hasDatasets;
230
231        // toolbar
232        if (!$read_only) {
233            $qtypes = array();
234            include_once "./Modules/SurveyQuestionPool/classes/class.ilObjSurveyQuestionPool.php";
235            foreach (ilObjSurveyQuestionPool::_getQuestiontypes() as $translation => $data) {
236                $qtypes[$data["type_tag"]] = $translation;
237            }
238
239            $ilToolbar->setFormAction($this->ctrl->getFormAction($this));
240            include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
241            $types = new ilSelectInputGUI($this->lng->txt("create_new"), "sel_question_types");
242            $types->setOptions($qtypes);
243            $ilToolbar->addStickyItem($types, "");
244
245            include_once "Services/UIComponent/Button/classes/class.ilLinkButton.php";
246            include_once "Services/UIComponent/Button/classes/class.ilSubmitButton.php";
247
248            $button = ilSubmitButton::getInstance();
249            $button->setCaption("svy_create_question");
250            $button->setCommand("createQuestion");
251            $ilToolbar->addStickyItem($button);
252
253            if ($this->object->isPoolActive()) {
254                $ilToolbar->addSeparator();
255
256                $cmd = ($ilUser->getPref('svy_insert_type') == 1 ||
257                    strlen($ilUser->getPref('svy_insert_type')) == 0)
258                    ? 'browseForQuestions'
259                    : 'browseForQuestionblocks';
260
261                $button = ilLinkButton::getInstance();
262                $button->setCaption("browse_for_questions");
263                $button->setUrl($this->ctrl->getLinkTarget($this, $cmd));
264                $ilToolbar->addStickyItem($button);
265            }
266
267            $ilToolbar->addSeparator();
268
269            $button = ilLinkButton::getInstance();
270            $button->setCaption("add_heading");
271            $button->setUrl($this->ctrl->getLinkTarget($this, "addHeading"));
272            $ilToolbar->addInputItem($button);
273        }
274        $mess = "";
275        if ($hasDatasets) {
276            $mbox = new ilSurveyContainsDataMessageBoxGUI();
277            $mess = $mbox->getHTML();
278        }
279
280        // table gui
281
282        include_once "Modules/Survey/classes/class.ilSurveyQuestionTableGUI.php";
283        $table = new ilSurveyQuestionTableGUI(
284            $this,
285            "questions",
286            $this->object,
287            $read_only
288        );
289        $this->tpl->setContent($mess . $table->getHTML());
290    }
291
292    /**
293     * Gather (and filter) selected items from table gui
294     *
295     * @param bool $allow_blocks
296     * @param bool $allow_questions
297     * @param bool $allow_headings
298     * @param bool $allow_questions_in_blocks
299     * @return array (questions, blocks, headings)
300     */
301    protected function gatherSelectedTableItems($allow_blocks = true, $allow_questions = true, $allow_headings = false, $allow_questions_in_blocks = false)
302    {
303        $block_map = array();
304        foreach ($this->object->getSurveyQuestions() as $item) {
305            $block_map[$item["question_id"]] = $item["questionblock_id"];
306        }
307
308        $questions = $blocks = $headings = array();
309        if ($_POST["id"]) {
310            foreach ($_POST["id"] as $key) {
311                // questions
312                if ($allow_questions && preg_match("/cb_(\d+)/", $key, $matches)) {
313                    if (($allow_questions_in_blocks || !$block_map[$matches[1]]) &&
314                        !in_array($block_map[$matches[1]], $blocks)) {
315                        array_push($questions, $matches[1]);
316                    }
317                }
318                // blocks
319                if ($allow_blocks && preg_match("/cb_qb_(\d+)/", $key, $matches)) {
320                    array_push($blocks, $matches[1]);
321                }
322                // headings
323                if ($allow_headings && preg_match("/cb_tb_(\d+)/", $key, $matches)) {
324                    array_push($headings, $matches[1]);
325                }
326            }
327        }
328
329        return array("questions" => $questions,
330            "blocks" => $blocks,
331            "headings" => $headings);
332    }
333
334    public function saveObligatoryObject()
335    {
336        if (isset($_POST["order"])) {
337            $position = -1;
338            $order = array();
339            asort($_POST["order"]);
340            foreach (array_keys($_POST["order"]) as $id) {
341                // block items
342                if (substr($id, 0, 3) == "qb_") {
343                    $block_id = substr($id, 3);
344                    $block = $_POST["block_order"][$block_id];
345                    asort($block);
346                    foreach (array_keys($block) as $question_id) {
347                        $position++;
348                        $order[$question_id] = $position;
349                    }
350                } else {
351                    $question_id = substr($id, 2);
352                    $position++;
353                    $order[$question_id] = $position;
354                }
355            }
356            $this->object->updateOrder($order);
357        }
358
359        $obligatory = array();
360        foreach ($_POST as $key => $value) {
361            if (preg_match("/obligatory_(\d+)/", $key, $matches)) {
362                $obligatory[$matches[1]] = 1;
363            }
364        }
365        $this->object->setObligatoryStates($obligatory);
366        ilUtil::sendSuccess($this->lng->txt('msg_obj_modified'), true);
367        $this->ctrl->redirect($this, "questions");
368    }
369
370    public function unfoldQuestionblockObject()
371    {
372        $items = $this->gatherSelectedTableItems(true, false, false, false);
373        if (count($items["blocks"])) {
374            ilUtil::sendSuccess($this->lng->txt('msg_obj_modified'), true);
375            $this->object->unfoldQuestionblocks($items["blocks"]);
376        } else {
377            ilUtil::sendInfo($this->lng->txt("qpl_unfold_select_none"), true);
378        }
379        $this->ctrl->redirect($this, "questions");
380    }
381
382    public function moveQuestionsObject()
383    {
384        $items = $this->gatherSelectedTableItems(true, true, false, false);
385
386        $move_questions = $items["questions"];
387        foreach ($items["blocks"] as $block_id) {
388            foreach ($this->object->getQuestionblockQuestionIds($block_id) as $qid) {
389                array_push($move_questions, $qid);
390            }
391        }
392        if (count($move_questions) == 0) {
393            ilUtil::sendInfo($this->lng->txt("no_question_selected_for_move"), true);
394            $this->ctrl->redirect($this, "questions");
395        } else {
396            $_SESSION["move_questions"] = $move_questions;
397            $_SESSION["move_questions_survey_id"] = $this->object->getId();
398            ilUtil::sendInfo($this->lng->txt("select_target_position_for_move_question"));
399            $this->questionsObject();
400        }
401    }
402
403    public function insertQuestionsBeforeObject()
404    {
405        $this->insertQuestions(0);
406    }
407
408    public function insertQuestionsAfterObject()
409    {
410        $this->insertQuestions(1);
411    }
412
413    protected function insertQuestions($insert_mode)
414    {
415        $insert_id = null;
416        if ($_POST["id"]) {
417            $items = $this->gatherSelectedTableItems(true, true, false, false);
418
419            // we are using POST id for original order
420            while (!$insert_id && sizeof($_POST["id"])) {
421                $target = array_shift($_POST["id"]);
422                if (preg_match("/^cb_(\d+)$/", $target, $matches)) {
423                    // questions in blocks are not allowed
424                    if (in_array($matches[1], $items["questions"])) {
425                        $insert_id = $matches[1];
426                    }
427                }
428                if (!$insert_id && preg_match("/^cb_qb_(\d+)$/", $target, $matches)) {
429                    $ids = $this->object->getQuestionblockQuestionIds($matches[1]);
430                    if (count($ids)) {
431                        if ($insert_mode == 0) {
432                            $insert_id = $ids[0];
433                        } elseif ($insert_mode == 1) {
434                            $insert_id = $ids[count($ids) - 1];
435                        }
436                    }
437                }
438            }
439        }
440
441        if (!$insert_id) {
442            ilUtil::sendInfo($this->lng->txt("no_target_selected_for_move"), true);
443        } else {
444            ilUtil::sendSuccess($this->lng->txt('msg_obj_modified'), true);
445            $this->object->moveQuestions($_SESSION["move_questions"], $insert_id, $insert_mode);
446            unset($_SESSION["move_questions"]);
447            unset($_SESSION["move_questions_survey_id"]);
448        }
449
450        $this->ctrl->redirect($this, "questions");
451    }
452
453    public function removeQuestionsObject()
454    {
455        $items = $this->gatherSelectedTableItems(true, true, true, true);
456        if (count($items["blocks"]) + count($items["questions"]) + count($items["headings"]) > 0) {
457            ilUtil::sendQuestion($this->lng->txt("remove_questions"));
458            $this->removeQuestionsForm($items["blocks"], $items["questions"], $items["headings"]);
459            return;
460        } else {
461            ilUtil::sendInfo($this->lng->txt("no_question_selected_for_removal"), true);
462            $this->ctrl->redirect($this, "questions");
463        }
464    }
465
466    public function removeQuestionsForm($checked_questionblocks, $checked_questions, $checked_headings)
467    {
468        include_once("./Services/Utilities/classes/class.ilConfirmationGUI.php");
469        $cgui = new ilConfirmationGUI();
470        $cgui->setHeaderText($this->lng->txt("survey_sure_delete_questions"));
471
472        $cgui->setFormAction($this->ctrl->getFormAction($this, "confirmRemoveQuestions"));
473        $cgui->setCancel($this->lng->txt("cancel"), "questions");
474        $cgui->setConfirm($this->lng->txt("confirm"), "confirmRemoveQuestions");
475
476        $counter = 0;
477        $surveyquestions = &$this->object->getSurveyQuestions();
478        include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
479        foreach ($surveyquestions as $question_id => $data) {
480            if (in_array($data["question_id"], $checked_questions)) {
481                $type = SurveyQuestion::_getQuestionTypeName($data["type_tag"]);
482
483                $cgui->addItem(
484                    "id_" . $data["question_id"],
485                    $data["question_id"],
486                    $type . ": " . $data["title"]
487                );
488            } elseif ((in_array($data["questionblock_id"], $checked_questionblocks))) {
489                $type = SurveyQuestion::_getQuestionTypeName($data["type_tag"]);
490
491                $cgui->addItem(
492                    "id_qb_" . $data["questionblock_id"],
493                    $data["questionblock_id"],
494                    $data["questionblock_title"] . " - " . $type . ": " . $data["title"]
495                );
496            } elseif (in_array($data["question_id"], $checked_headings)) {
497                $cgui->addItem(
498                    "id_tb_" . $data["question_id"],
499                    $data["question_id"],
500                    $data["heading"]
501                );
502            }
503        }
504
505        $this->tpl->setContent($cgui->getHTML());
506    }
507
508    public function confirmRemoveQuestionsObject()
509    {
510        $checked_questions = array();
511        $checked_questionblocks = array();
512        $checked_headings = array();
513        foreach ($_POST as $key => $value) {
514            if (preg_match("/id_(\d+)/", $key, $matches)) {
515                array_push($checked_questions, $matches[1]);
516            }
517            if (preg_match("/id_qb_(\d+)/", $key, $matches)) {
518                array_push($checked_questionblocks, $matches[1]);
519            }
520            if (preg_match("/id_tb_(\d+)/", $key, $matches)) {
521                array_push($checked_headings, $matches[1]);
522            }
523        }
524
525        if (sizeof($checked_questions) || sizeof($checked_questionblocks)) {
526            $this->object->removeQuestions($checked_questions, $checked_questionblocks);
527        }
528        if ($checked_headings) {
529            foreach ($checked_headings as $q_id) {
530                $this->object->saveHeading("", $q_id);
531            }
532        }
533        $this->object->saveCompletionStatus();
534        ilUtil::sendSuccess($this->lng->txt("questions_removed"), true);
535        $this->ctrl->redirect($this, "questions");
536    }
537
538    public function copyQuestionsToPoolObject()
539    {
540        $items = $this->gatherSelectedTableItems(true, true, false, true);
541
542        // gather questions from blocks
543        $copy_questions = $items["questions"];
544        foreach ($items["blocks"] as $block_id) {
545            foreach ($this->object->getQuestionblockQuestionIds($block_id) as $qid) {
546                array_push($copy_questions, $qid);
547            }
548        }
549        $copy_questions = array_unique($copy_questions);
550
551        // only if not already in pool
552        if (count($copy_questions)) {
553            foreach ($copy_questions as $idx => $question_id) {
554                $question = ilObjSurvey::_instanciateQuestion($question_id);
555                if ($question->getOriginalId()) {
556                    unset($copy_questions[$idx]);
557                }
558            }
559        }
560        if (count($copy_questions) == 0) {
561            ilUtil::sendInfo($this->lng->txt("no_question_selected_for_copy_to_pool"), true);
562            $this->ctrl->redirect($this, "questions");
563        } else {
564            $this->questionsSubtabs("questions");
565
566            include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
567            $form = new ilPropertyFormGUI();
568
569            $form->setFormAction($this->ctrl->getFormAction($this, "executeCreateQuestion"));
570
571            $ids = new ilHiddenInputGUI("question_ids");
572            $ids->setValue(implode(";", $copy_questions));
573            $form->addItem($ids);
574
575            $questionpools = &$this->object->getAvailableQuestionpools(false, false, true, "write");
576            $pools = new ilSelectInputGUI($this->lng->txt("survey_copy_select_questionpool"), "sel_spl");
577            $pools->setOptions($questionpools);
578            $form->addItem($pools);
579
580            $form->addCommandButton("executeCopyQuestionsToPool", $this->lng->txt("submit"));
581            $form->addCommandButton("questions", $this->lng->txt("cancel"));
582
583            return $this->tpl->setContent($form->getHTML());
584        }
585    }
586
587    public function executeCopyQuestionsToPoolObject()
588    {
589        $question_ids = explode(";", $_POST["question_ids"]);
590        $pool_id = ilObject::_lookupObjId($_POST["sel_spl"]);
591
592        foreach ($question_ids as $qid) {
593            // create copy (== pool "original")
594            $new_question = ilObjSurvey::_instanciateQuestion($qid);
595            $new_question->setId();
596            $new_question->setObjId($pool_id);
597            $new_question->saveToDb();
598
599            // link "source" (survey) to copy (pool)
600            SurveyQuestion::_changeOriginalId($qid, $new_question->getId(), $pool_id);
601        }
602
603        ilUtil::sendSuccess($this->lng->txt("survey_copy_to_questionpool_success"), true);
604        $this->ctrl->redirect($this, "questions");
605    }
606
607
608    //
609    // QUESTION CREATION
610    //
611
612    public function createQuestionObject(ilPropertyFormGUI $a_form = null)
613    {
614        if (!$this->object->isPoolActive()) {
615            $_POST["usage"] = 1;
616            $_GET["sel_question_types"] = $_POST["sel_question_types"];
617            return $this->executeCreateQuestionObject();
618        }
619
620        if (!$a_form) {
621            $this->questionsSubtabs("questions");
622
623            include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
624            $form = new ilPropertyFormGUI();
625
626            $sel_question_types = (strlen($_POST["sel_question_types"])) ? $_POST["sel_question_types"] : $_GET["sel_question_types"];
627            $this->ctrl->setParameter($this, "sel_question_types", $sel_question_types);
628            $form->setFormAction($this->ctrl->getFormAction($this, "executeCreateQuestion"));
629        } else {
630            $form = $a_form;
631        }
632
633        $usage = new ilRadioGroupInputGUI($this->lng->txt("survey_pool_selection"), "usage");
634        $usage->setRequired(true);
635        $no_pool = new ilRadioOption($this->lng->txt("survey_no_pool"), 1);
636        $usage->addOption($no_pool);
637        $existing_pool = new ilRadioOption($this->lng->txt("survey_existing_pool"), 3);
638        $usage->addOption($existing_pool);
639        $new_pool = new ilRadioOption($this->lng->txt("survey_new_pool"), 2);
640        $usage->addOption($new_pool);
641        $form->addItem($usage);
642
643        if (isset($_SESSION["svy_qpool_choice"])) {
644            $usage->setValue($_SESSION["svy_qpool_choice"]);
645        } else {
646            // default: no pool
647            $usage->setValue(1);
648        }
649
650        $questionpools = &$this->object->getAvailableQuestionpools(false, true, true, "write");
651        $pools = new ilSelectInputGUI($this->lng->txt("select_questionpool"), "sel_spl");
652        $pools->setOptions($questionpools);
653        $existing_pool->addSubItem($pools);
654
655        $name = new ilTextInputGUI($this->lng->txt("spl_new"), "name_spl"); // #11740
656        $name->setSize(50);
657        $name->setMaxLength(50);
658        $new_pool->addSubItem($name);
659
660        if ($a_form) {
661            return $a_form;
662        }
663
664        $form->addCommandButton("executeCreateQuestion", $this->lng->txt("submit"));
665        $form->addCommandButton("questions", $this->lng->txt("cancel"));
666
667        return $this->tpl->setContent($form->getHTML());
668    }
669
670    public function executeCreateQuestionObject()
671    {
672        $_SESSION["svy_qpool_choice"] = $_POST["usage"];
673
674        $q_type = $_GET["sel_question_types"];
675
676        // no pool
677        if ($_POST["usage"] == 1) {
678            $obj_id = $this->object->getId();
679        }
680        // existing pool
681        elseif ($_POST["usage"] == 3 && strlen($_POST["sel_spl"])) {
682            $obj_id = ilObject::_lookupObjId($_POST["sel_spl"]);
683        }
684        // new pool
685        elseif ($_POST["usage"] == 2 && strlen($_POST["name_spl"])) {
686            $obj_id = $this->createQuestionPool($_POST["name_spl"]);
687        } else {
688            if (!$_POST["usage"]) {
689                ilUtil::sendFailure($this->lng->txt("select_one"), true);
690            } else {
691                ilUtil::sendFailure($this->lng->txt("err_no_pool_name"), true);
692            }
693            $this->ctrl->setParameter($this, "sel_question_types", $q_type);
694            $this->ctrl->redirect($this, "createQuestion");
695        }
696
697
698        // create question and redirect to question form
699
700        include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestionGUI.php";
701        $q_gui = SurveyQuestionGUI::_getQuestionGUI($q_type);
702        $q_gui->object->setObjId($obj_id); // survey/pool!
703        $q_gui->object->createNewQuestion();
704        $q_gui_class = get_class($q_gui);
705
706        if ($_REQUEST["pgov"]) {
707            $this->ctrl->setParameterByClass($q_gui_class, "pgov", $_REQUEST["pgov"]);
708            $this->ctrl->setParameterByClass($q_gui_class, "pgov_pos", $_REQUEST["pgov_pos"]);
709        }
710
711        $this->ctrl->setParameterByClass($q_gui_class, "ref_id", $this->object->getRefId());
712        $this->ctrl->setParameterByClass($q_gui_class, "new_for_survey", $this->object->getRefId());
713        $this->ctrl->setParameterByClass($q_gui_class, "q_id", $q_gui->object->getId());
714        $this->ctrl->setParameterByClass($q_gui_class, "sel_question_types", $q_gui->getQuestionType());
715        $this->ctrl->redirectByClass($q_gui_class, "editQuestion");
716    }
717
718    protected function createQuestionPool($name = "dummy")
719    {
720        $tree = $this->tree;
721
722        $parent_ref = $tree->getParentId($this->object->getRefId());
723
724        include_once "./Modules/SurveyQuestionPool/classes/class.ilObjSurveyQuestionPool.php";
725        $qpl = new ilObjSurveyQuestionPool();
726        $qpl->setType("spl");
727        $qpl->setTitle($name);
728        $qpl->setDescription("");
729        $qpl->create();
730        $qpl->createReference();
731        $qpl->putInTree($parent_ref);
732        $qpl->setPermissions($parent_ref);
733        $qpl->setOnline(1); // must be online to be available
734        $qpl->saveToDb();
735
736        return $qpl->getId();
737    }
738
739
740    //
741    // ADD FROM POOL
742    //
743
744    protected function setBrowseForQuestionsSubtabs()
745    {
746        $ilTabs = $this->tabs;
747        $ilToolbar = $this->toolbar;
748        $ilUser = $this->user;
749
750        if (!isset($_REQUEST["pgov"])) {
751            $link = $this->ctrl->getLinkTarget($this, "questions");
752        } else {
753            $link = $this->ctrl->getLinkTargetByClass("ilsurveypagegui", "renderpage");
754        }
755        $ilTabs->setBackTarget($this->lng->txt("menubacktosurvey"), $link);
756
757        // type selector
758        include_once "Services/Form/classes/class.ilSelectInputGUI.php";
759        $types = new ilSelectInputGUI($this->lng->txt("display_all_available"), "datatype");
760        $types->setOptions(array(
761            1 => $this->lng->txt("questions"),
762            2 => $this->lng->txt("questionblocks")
763        ));
764        $types->setValue($ilUser->getPref('svy_insert_type'));
765        $ilToolbar->addInputItem($types, true);
766        $ilToolbar->addFormButton($this->lng->txt("change"), "changeDatatype");
767        $ilToolbar->setFormAction($this->ctrl->getFormAction($this, "changeDatatype"));
768    }
769
770    public function changeDatatypeObject()
771    {
772        $ilUser = $this->user;
773
774        $ilUser->writePref('svy_insert_type', $_POST['datatype']);
775
776        switch ($_POST["datatype"]) {
777            case 2:
778                $this->ctrl->redirect($this, 'browseForQuestionblocks');
779                break;
780
781            case 1:
782            default:
783                $this->ctrl->redirect($this, 'browseForQuestions');
784                break;
785        }
786    }
787
788    public function browseForQuestionsObject()
789    {
790        $this->setBrowseForQuestionsSubtabs();
791
792        include_once "./Modules/Survey/classes/tables/class.ilSurveyQuestionbrowserTableGUI.php";
793        $table_gui = new ilSurveyQuestionbrowserTableGUI($this, 'browseForQuestions', $this->object, true);
794        $table_gui->setEditable(true);
795        $this->tpl->setContent($table_gui->getHTML());
796    }
797
798    public function filterQuestionBrowserObject()
799    {
800        include_once "./Modules/Survey/classes/tables/class.ilSurveyQuestionbrowserTableGUI.php";
801        $table_gui = new ilSurveyQuestionbrowserTableGUI($this, 'browseForQuestions', $this->object);
802        $table_gui->writeFilterToSession();
803        $this->ctrl->redirect($this, 'browseForQuestions');
804    }
805
806    public function resetfilterQuestionBrowserObject()
807    {
808        include_once "./Modules/Survey/classes/tables/class.ilSurveyQuestionbrowserTableGUI.php";
809        $table_gui = new ilSurveyQuestionbrowserTableGUI($this, 'browseForQuestions', $this->object);
810        $table_gui->resetFilter();
811        $this->ctrl->redirect($this, 'browseForQuestions');
812    }
813
814    public function insertQuestionsObject()
815    {
816        $inserted_objects = 0;
817        if (is_array($_POST['q_id'])) {
818            if ($_REQUEST["pgov"]) {
819                include_once "Modules/Survey/classes/class.ilSurveyPageGUI.php";
820                $page_gui = new ilSurveyPageGUI($this->object, $this);
821                $page_gui->determineCurrentPage();
822
823                // as target position is predefined, insert in reverse order
824                $_POST['q_id'] = array_reverse($_POST['q_id']);
825            }
826            foreach ($_POST['q_id'] as $question_id) {
827                if (!$_REQUEST["pgov"]) {
828                    $this->object->insertQuestion($question_id);
829                } else {
830                    // target position (pgov pos) is processed there
831                    $page_gui->insertNewQuestion($question_id);
832                }
833                $inserted_objects++;
834            }
835        }
836        if ($inserted_objects) {
837            $this->object->saveCompletionStatus();
838            ilUtil::sendSuccess($this->lng->txt("questions_inserted"), true);
839            if (!$_REQUEST["pgov"]) {
840                $this->ctrl->redirect($this, "questions");
841            } else {
842                $target_page = $_REQUEST["pgov"];
843                if (substr($_REQUEST["pgov_pos"], -1) == "c") {
844                    // see ilSurveyPageGUI::insertNewQuestion()
845                    if ((int) $_REQUEST["pgov_pos"]) {
846                        $target_page++;
847                    } else {
848                        $target_page = 1;
849                    }
850                }
851                $this->ctrl->setParameterByClass("ilsurveypagegui", "pgov", $target_page);
852                $this->ctrl->redirectByClass("ilsurveypagegui", "renderpage");
853            }
854        } else {
855            ilUtil::sendInfo($this->lng->txt("insert_missing_question"), true);
856            $this->ctrl->redirect($this, 'browseForQuestions');
857        }
858    }
859
860    public function browseForQuestionblocksObject()
861    {
862        $this->setBrowseForQuestionsSubtabs();
863
864        include_once "./Modules/Survey/classes/tables/class.ilSurveyQuestionblockbrowserTableGUI.php";
865        $table_gui = new ilSurveyQuestionblockbrowserTableGUI($this, 'browseForQuestionblocks', $this->object, true);
866        $table_gui->setEditable(true);
867        $this->tpl->setContent($table_gui->getHTML());
868    }
869
870    public function filterQuestionblockBrowserObject()
871    {
872        include_once "./Modules/Survey/classes/tables/class.ilSurveyQuestionblockbrowserTableGUI.php";
873        $table_gui = new ilSurveyQuestionblockbrowserTableGUI($this, 'browseForQuestionblocks', $this->object);
874        $table_gui->writeFilterToSession();
875        $this->ctrl->redirect($this, 'browseForQuestionblocks');
876    }
877
878    public function resetfilterQuestionblockBrowserObject()
879    {
880        include_once "./Modules/Survey/classes/tables/class.ilSurveyQuestionblockbrowserTableGUI.php";
881        $table_gui = new ilSurveyQuestionblockbrowserTableGUI($this, 'browseForQuestionblocks', $this->object);
882        $table_gui->resetFilter();
883        $this->ctrl->redirect($this, 'browseForQuestionblocks');
884    }
885
886    public function insertQuestionblocksObject()
887    {
888        $inserted_objects = 0;
889        if (is_array($_POST['cb'])) {
890            if ($_REQUEST["pgov"]) {
891                include_once "Modules/Survey/classes/class.ilSurveyPageGUI.php";
892                $page_gui = new ilSurveyPageGUI($this->object, $this);
893                $page_gui->determineCurrentPage();
894
895                // as target position is predefined, insert in reverse order
896                $_POST['cb'] = array_reverse($_POST['cb']);
897            }
898            foreach ($_POST['cb'] as $questionblock_id) {
899                if (!$_REQUEST["pgov"]) {
900                    $this->object->insertQuestionblock($questionblock_id);
901                } else {
902                    $page_gui->insertQuestionblock($questionblock_id);
903                }
904                $inserted_objects++;
905            }
906        }
907        if ($inserted_objects) {
908            $this->object->saveCompletionStatus();
909            ilUtil::sendSuccess(($inserted_objects == 1) ? $this->lng->txt("questionblock_inserted") : $this->lng->txt("questionblocks_inserted"), true);
910            if (!$_REQUEST["pgov"]) {
911                $this->ctrl->redirect($this, "questions");
912            } else {
913                $target_page = $_REQUEST["pgov"];
914                if (substr($_REQUEST["pgov_pos"], -1) == "c") {
915                    $target_page++;
916                }
917                $this->ctrl->setParameterByClass("ilsurveypagegui", "pgov", $target_page);
918                $this->ctrl->redirectByClass("ilsurveypagegui", "renderpage");
919            }
920        } else {
921            ilUtil::sendInfo($this->lng->txt("insert_missing_questionblock"), true);
922            $this->ctrl->redirect($this, 'browseForQuestionblocks');
923        }
924    }
925
926
927    //
928    // BLOCKS
929    //
930
931    public function editQuestionblockObject(ilPropertyFormGUI $a_form = null)
932    {
933        $block_id = (int) $_REQUEST["bl_id"];
934        $this->ctrl->setParameter($this, "bl_id", $block_id);
935
936        if (!$a_form) {
937            $a_form = $this->initQuestionblockForm($block_id);
938        }
939
940        $this->questionsSubtabs("questions");
941        $this->tpl->setContent($a_form->getHTML());
942    }
943
944    public function createQuestionblockObject(ilPropertyFormGUI $a_form = null)
945    {
946        if (!$a_form) {
947            // gather questions from table selected
948            $items = $this->gatherSelectedTableItems(false, true, false, false);
949
950            if (is_array($_POST["qids"]) && sizeof($_POST["qids"])) {
951                $items["questions"] = $_POST["qids"];
952            }
953            if (count($items["questions"]) < 2) {
954                ilUtil::sendInfo($this->lng->txt("qpl_define_questionblock_select_missing"), true);
955                $this->ctrl->redirect($this, "questions");
956            }
957
958            $a_form = $this->initQuestionblockForm(null, $items["questions"]);
959        }
960
961        $this->questionsSubtabs("questions");
962        $this->tpl->setContent($a_form->getHTML());
963    }
964
965    protected function initQuestionblockForm($a_block_id = null, $a_question_ids = null)
966    {
967        include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
968        $form = new ilPropertyFormGUI();
969        $form->setFormAction($this->ctrl->getFormAction($this, "saveDefineQuestionblock"));
970        $form->setTitle($this->lng->txt("define_questionblock"));
971
972        $title = new ilTextInputGUI($this->lng->txt("title"), "title");
973        $title->setRequired(true);
974        $form->addItem($title);
975
976        $toggle_blocktitle = new ilCheckboxInputGUI($this->lng->txt("survey_show_blocktitle"), "show_blocktitle");
977        $toggle_blocktitle->setInfo($this->lng->txt("survey_show_blocktitle_description"));
978        $form->addItem($toggle_blocktitle);
979
980        $toggle_questiontitle = new ilCheckboxInputGUI($this->lng->txt("show_questiontext"), "show_questiontext");
981        $toggle_questiontitle->setInfo($this->lng->txt("show_questiontext_description"));
982        $form->addItem($toggle_questiontitle);
983
984        if ($a_block_id) {
985            $questionblock = ilObjSurvey::_getQuestionblock($a_block_id);
986            $title->setValue($questionblock["title"]);
987            $toggle_blocktitle->setChecked($questionblock["show_blocktitle"]);
988            $toggle_questiontitle->setChecked($questionblock["show_questiontext"]);
989        } else {
990            $toggle_blocktitle->setChecked(true);
991            $toggle_questiontitle->setChecked(true);
992        }
993
994        $form->addCommandButton("saveDefineQuestionblock", $this->lng->txt("save"));
995        $form->addCommandButton("questions", $this->lng->txt("cancel"));
996
997        // reload?
998        if (!$a_question_ids && $_POST["qids"]) {
999            $a_question_ids = $_POST["qids"];
1000        }
1001
1002        if ($a_question_ids) {
1003            foreach ($a_question_ids as $q_id) {
1004                $hidden = new ilHiddenInputGUI("qids[]");
1005                $hidden->setValue($q_id);
1006                $form->addItem($hidden);
1007            }
1008        }
1009
1010        return $form;
1011    }
1012
1013    public function saveDefineQuestionblockObject()
1014    {
1015        $block_id = (int) $_REQUEST["bl_id"];
1016        $q_ids = $_POST["qids"];
1017
1018        $this->ctrl->setParameter($this, "bl_id", $block_id);
1019
1020        if (!$block_id && !is_array($q_ids)) {
1021            $this->ctrl->redirect($this, "questions");
1022        }
1023
1024        $form = $this->initQuestionblockForm($block_id);
1025        if ($form->checkInput()) {
1026            $title = $form->getInput("title");
1027            $show_questiontext = $form->getInput("show_questiontext");
1028            $show_blocktitle = $form->getInput("show_blocktitle") ;
1029            if ($block_id) {
1030                $this->object->modifyQuestionblock(
1031                    $block_id,
1032                    $title,
1033                    $show_questiontext,
1034                    $show_blocktitle
1035                );
1036            } elseif ($q_ids) {
1037                $this->object->createQuestionblock(
1038                    $title,
1039                    $show_questiontext,
1040                    $show_blocktitle,
1041                    $q_ids
1042                );
1043            }
1044
1045            ilUtil::sendSuccess($this->lng->txt('msg_obj_modified'), true);
1046            $this->ctrl->redirect($this, "questions");
1047        }
1048
1049        $form->setValuesByPost();
1050        $this->editQuestionblockObject($form);
1051    }
1052
1053
1054    //
1055    // HEADING
1056    //
1057
1058    protected function initHeadingForm($a_question_id = null)
1059    {
1060        $survey_questions = $this->object->getSurveyQuestions();
1061
1062        include_once("./Services/Form/classes/class.ilPropertyFormGUI.php");
1063        $form = new ilPropertyFormGUI();
1064        $form->setFormAction($this->ctrl->getFormAction($this, ""));
1065
1066        // heading
1067        $heading = new ilTextAreaInputGUI($this->lng->txt("heading"), "heading");
1068        $heading->setRows(10);
1069        $heading->setCols(80);
1070        $heading->setUseRte(true);
1071        include_once "./Services/AdvancedEditing/classes/class.ilObjAdvancedEditing.php";
1072        $heading->setRteTags(ilObjAdvancedEditing::_getUsedHTMLTags("survey"));
1073        $heading->removePlugin(ilRTE::ILIAS_IMG_MANAGER_PLUGIN);
1074        $heading->setRTESupport($this->object->getId(), "svy", "survey");
1075        $heading->setRequired(true);
1076        $form->addItem($heading);
1077
1078        $insertbefore = new ilSelectInputGUI($this->lng->txt("insert"), "insertbefore");
1079        $options = array();
1080        foreach ($survey_questions as $key => $value) {
1081            $options[$key] = $this->lng->txt("before") . ": \"" . $value["title"] . "\"";
1082        }
1083        $insertbefore->setOptions($options);
1084        $insertbefore->setRequired(true);
1085        $form->addItem($insertbefore);
1086
1087        $form->addCommandButton("saveHeading", $this->lng->txt("save"));
1088        $form->addCommandButton("questions", $this->lng->txt("cancel"));
1089
1090        if ($a_question_id) {
1091            $form->setTitle($this->lng->txt("edit_heading"));
1092
1093            $heading->setValue($this->object->prepareTextareaOutput($survey_questions[$a_question_id]["heading"]));
1094            $insertbefore->setValue($a_question_id);
1095            $insertbefore->setDisabled(true);
1096        } else {
1097            $form->setTitle($this->lng->txt("add_heading"));
1098        }
1099
1100        return $form;
1101    }
1102
1103    public function addHeadingObject(ilPropertyFormGUI $a_form = null)
1104    {
1105        $q_id = $_REQUEST["q_id"];
1106        $this->ctrl->setParameter($this, "q_id", $q_id);
1107
1108        $this->questionsSubtabs("questions");
1109
1110        if (!$a_form) {
1111            $a_form = $this->initHeadingForm($q_id);
1112        }
1113
1114        $this->tpl->setContent($a_form->getHTML());
1115    }
1116
1117    public function editHeadingObject(ilPropertyFormGUI $a_form = null)
1118    {
1119        $q_id = $_REQUEST["q_id"];
1120        $this->ctrl->setParameter($this, "q_id", $q_id);
1121
1122        $this->questionsSubtabs("questions");
1123
1124        if (!$a_form) {
1125            $a_form = $this->initHeadingForm($q_id);
1126        }
1127
1128        $this->tpl->setContent($a_form->getHTML());
1129    }
1130
1131    public function saveHeadingObject()
1132    {
1133        // #15474
1134        $q_id = (int) $_REQUEST["q_id"];
1135        $this->ctrl->setParameter($this, "q_id", $q_id);
1136
1137        $form = $this->initHeadingForm($q_id);
1138        if ($form->checkInput()) {
1139            include_once "./Services/AdvancedEditing/classes/class.ilObjAdvancedEditing.php";
1140            $this->object->saveHeading(
1141                ilUtil::stripSlashes(
1142                    $form->getInput("heading"),
1143                    true,
1144                    ilObjAdvancedEditing::_getUsedHTMLTagsAsString("survey")
1145                ),
1146                $form->getInput("insertbefore")
1147            );
1148            $this->ctrl->redirect($this, "questions");
1149        }
1150
1151        $form->setValuesByPost();
1152        $this->addHeadingObject($form);
1153    }
1154
1155    public function removeHeadingObject()
1156    {
1157        $q_id = (int) $_REQUEST["q_id"];
1158        $this->ctrl->setParameter($this, "q_id", $q_id);
1159
1160        if (!$q_id) {
1161            $this->ctrl->redirect($this, "questions");
1162        }
1163
1164        $this->questionsSubtabs("questions");
1165
1166        include_once("./Services/Utilities/classes/class.ilConfirmationGUI.php");
1167        $cgui = new ilConfirmationGUI();
1168        $cgui->setHeaderText($this->lng->txt("confirm_remove_heading"));
1169
1170        $cgui->setFormAction($this->ctrl->getFormAction($this, "confirmedRemoveHeading"));
1171        $cgui->setCancel($this->lng->txt("cancel"), "questions");
1172        $cgui->setConfirm($this->lng->txt("confirm"), "confirmedRemoveHeading");
1173
1174        $this->tpl->setContent($cgui->getHTML());
1175    }
1176
1177    public function confirmedRemoveHeadingObject()
1178    {
1179        $q_id = (int) $_REQUEST["q_id"];
1180        if (!$q_id) {
1181            $this->ctrl->redirect($this, "questions");
1182        }
1183
1184        $this->object->saveHeading("", $q_id);
1185        $this->ctrl->redirect($this, "questions");
1186    }
1187
1188    /**
1189    * Creates a print view of the survey questions
1190    *
1191    * @access public
1192    */
1193    public function printViewObject()
1194    {
1195        $ilToolbar = $this->toolbar;
1196
1197        $this->questionsSubtabs("print");
1198
1199        #21023 and #19448
1200        if (!$current_title = (int) $_REQUEST['export_label']) {
1201            $current_title = $this->object->getShowQuestionTitles();
1202        }
1203        /*if(!isset($_POST["export_label"]))
1204        {fir
1205            $_POST["export_label"] = $this->object->getShowQuestionTitles();
1206        }
1207        $current_title = (int)$_REQUEST["export_label"];
1208        */
1209
1210        include_once "Services/Form/classes/class.ilSelectInputGUI.php";
1211        $label = new ilSelectInputGUI($this->lng->txt("title") . "/" . $this->lng->txt("label"), "export_label");
1212
1213        #19448 comment none and label only options.
1214        $label->setOptions($this->print_options);
1215        $label->setValue($current_title);
1216
1217        $ilToolbar->addStickyItem($label, true);
1218
1219        $ilToolbar->setFormAction($this->ctrl->getFormAction($this, "printView"));
1220
1221        include_once "Services/UIComponent/Button/classes/class.ilSubmitButton.php";
1222        $button = ilSubmitButton::getInstance();
1223        $button->setCaption("show");
1224        $button->setCommand("printView");
1225        $ilToolbar->addStickyItem($button);
1226
1227        $ilToolbar->addSeparator();
1228
1229        include_once "Services/UIComponent/Button/classes/class.ilLinkButton.php";
1230        $button = ilLinkButton::getInstance();
1231        $button->setCaption("print");
1232        $button->setOnClick("window.print(); return false;");
1233        $button->setOmitPreventDoubleSubmission(true);
1234        $ilToolbar->addButtonInstance($button);
1235
1236        include_once './Services/WebServices/RPC/classes/class.ilRPCServerSettings.php';
1237        if (ilRPCServerSettings::getInstance()->isEnabled()) {
1238            $this->ctrl->setParameter($this, "export_label", $current_title);
1239            $this->ctrl->setParameter($this, "pdf", "1");
1240            $pdf_url = $this->ctrl->getLinkTarget($this, "printView");
1241            $this->ctrl->setParameter($this, "pdf", "");
1242            $this->ctrl->setParameter($this, "export_label", "");
1243
1244            $button = ilLinkButton::getInstance();
1245            $button->setCaption("pdf_export");
1246            $button->setUrl($pdf_url);
1247            $button->setOmitPreventDoubleSubmission(true);
1248            $ilToolbar->addButtonInstance($button);
1249        }
1250
1251        // defer rendering of tex to fo processing
1252        if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1)) {
1253            require_once('Services/MathJax/classes/class.ilMathJax.php');
1254            ilMathJax::getInstance()->init(ilMathJax::PURPOSE_DEFERRED_PDF);
1255        }
1256
1257        $template = new ilTemplate("tpl.il_svy_svy_printview.html", true, true, "Modules/Survey");
1258
1259        $pages = &$this->object->getSurveyPages();
1260        $required = false;
1261        foreach ($pages as $page) {
1262            if (count($page) > 0) {
1263                foreach ($page as $question) {
1264                    $questionGUI = $this->object->getQuestionGUI($question["type_tag"], $question["question_id"]);
1265                    if (is_object($questionGUI)) {
1266                        if (strlen($question["heading"])) {
1267                            $template->setCurrentBlock("textblock");
1268                            $template->setVariable("TEXTBLOCK", $question["heading"]);
1269                            $template->parseCurrentBlock();
1270                        }
1271                        $template->setCurrentBlock("question");
1272                        $template->setVariable("QUESTION_DATA", $questionGUI->getPrintView($current_title, $question["questionblock_show_questiontext"], $this->object->getSurveyId()));
1273                        $template->parseCurrentBlock();
1274
1275                        if ($question["obligatory"]) {
1276                            $required = true;
1277                        }
1278                    }
1279                }
1280                if (count($page) > 1 && $page[0]["questionblock_show_blocktitle"]) {
1281                    $template->setCurrentBlock("page");
1282                    $template->setVariable("BLOCKTITLE", $page[0]["questionblock_title"]);
1283                    $template->parseCurrentBlock();
1284                } else {
1285                    $template->setCurrentBlock("page");
1286                    $template->parseCurrentBlock();
1287                }
1288            }
1289        }
1290
1291        // #6412
1292        if ($required) {
1293            $template->setVariable("TEXT_REQUIRED", $this->lng->txt("required_field"));
1294        }
1295
1296        // $this->tpl->addCss("./Modules/Survey/templates/default/survey_print.css", "print");
1297        if (array_key_exists("pdf", $_GET) && ($_GET["pdf"] == 1)) {
1298            $printbody = new ilTemplate("tpl.il_as_tst_print_body.html", true, true, "Modules/Test");
1299            $printbody->setVariable("TITLE", sprintf($this->lng->txt("tst_result_user_name"), $uname));
1300            $printbody->setVariable("ADM_CONTENT", $template->get());
1301            $printoutput = $printbody->get();
1302            $printoutput = preg_replace("/href=\".*?\"/", "", $printoutput);
1303            $fo = $this->object->processPrintoutput2FO($printoutput);
1304
1305            // render tex as fo graphics
1306            require_once('Services/MathJax/classes/class.ilMathJax.php');
1307            $fo = ilMathJax::getInstance()
1308                ->init(ilMathJax::PURPOSE_PDF)
1309                ->setRendering(ilMathJax::RENDER_PNG_AS_FO_FILE)
1310                ->insertLatexImages($fo);
1311
1312            // #11436
1313            if (!$fo || !$this->object->deliverPDFfromFO($fo)) {
1314                ilUtil::sendFailure($this->lng->txt("msg_failed"), true);
1315                $this->ctrl->redirect($this, "printView");
1316            }
1317        } else {
1318            $this->tpl->setVariable("ADM_CONTENT", $template->get());
1319        }
1320    }
1321}
1322