public function edit_action($questionnaire_id = null) { if (!$GLOBALS['perm']->have_perm("autor")) { throw new AccessDeniedException("Only for authors."); } $this->questionnaire = new Questionnaire($questionnaire_id); if ($this->questionnaire->isNew()) { PageLayout::setTitle(_("Neuer Fragebogen")); } else { PageLayout::setTitle(_("Fragebogen bearbeiten: ") . $this->questionnaire['title']); } if (!$this->questionnaire->isEditable()) { throw new AccessDeniedException("Fragebogen ist nicht bearbeitbar."); } if ($this->questionnaire->isStarted() && $this->questionnaire->countAnswers() > 0) { throw new Exception("Fragebogen ist gestartet worden und kann jetzt nicht mehr bearbeitet werden. Stoppen oder löschen Sie den Fragebogen stattdessen."); } if (Request::isPost()) { $questionnaire_data = Request::getArray("questionnaire"); $questionnaire_data['startdate'] = $questionnaire_data['startdate'] ? strtotime($questionnaire_data['startdate']) ?: time() : null; $questionnaire_data['stopdate'] = strtotime($questionnaire_data['stopdate']) ?: null; $questionnaire_data['anonymous'] = (int) $questionnaire_data['anonymous']; $questionnaire_data['editanswers'] = (int) $questionnaire_data['editanswers']; if ($this->questionnaire->isNew()) { $questionnaire_data['visible'] = $questionnaire_data['startdate'] <= time() && (!$questionnaire_data['stopdate'] || $questionnaire_data['stopdate'] >= time()) ? 1 : 0; } $this->questionnaire->setData($questionnaire_data); foreach (Request::getArray("question_types") as $question_id => $question_type) { $question = null; foreach ($this->questionnaire->questions as $index => $q) { if ($q->getId() === $question_id) { $question = $q; break; } } if (!$question) { $question = new $question_type($question_id); $question['questiontype'] = $question_type; $this->questionnaire->questions[] = $question; } $question['position'] = $index + 1; $question->createDataFromRequest(); } if (Request::submitted("questionnaire_store")) { //save everything $this->questionnaire['user_id'] = $GLOBALS['user']->id; $is_new = $this->questionnaire->isNew(); $this->questionnaire->store(); if ($is_new && Request::get("range_id") && Request::get("range_type")) { if (Request::get("range_id") === "start" && !$GLOBALS['perm']->have_perm("root")) { throw new Exception("Der Fragebogen darf nicht von Ihnen auf die Startseite eingehängt werden, sondern nur von einem Admin."); } if (Request::get("range_type") === "course" && !$GLOBALS['perm']->have_studip_perm("tutor", Request::get("range_id"))) { throw new Exception("Der Fragebogen darf nicht in die ausgewählte Veranstaltung eingebunden werden."); } $assignment = new QuestionnaireAssignment(); $assignment['questionnaire_id'] = $this->questionnaire->getId(); $assignment['range_id'] = Request::option("range_id"); $assignment['range_type'] = Request::get("range_type"); $assignment['user_id'] = $GLOBALS['user']->id; $assignment->store(); } if ($is_new) { $message = MessageBox::success(_("Der Fragebogen wurde erfolgreich erstellt.")); } else { $message = MessageBox::success(_("Der Fragebogen wurde gespeichert.")); } if (Request::isAjax()) { $this->questionnaire->restore(); $this->questionnaire->resetRelation("assignments"); $output = array('func' => "STUDIP.Questionnaire.updateOverviewQuestionnaire", 'payload' => array('questionnaire_id' => $this->questionnaire->getId(), 'overview_html' => $this->render_template_as_string("questionnaire/_overview_questionnaire.php"), 'widget_html' => $this->questionnaire->isStarted() ? $this->render_template_as_string("questionnaire/_widget_questionnaire.php") : "", 'message' => $this->questionnaire->isStarted() ? "" : $message->__toString())); $this->response->add_header("X-Dialog-Close", 1); $this->response->add_header("X-Dialog-Execute", json_encode(studip_utf8encode($output))); } else { PageLayout::postMessage($message); if (Request::get("range_type") === "user") { $this->redirect("profile"); } elseif (Request::get("range_type") === "course") { $this->redirect("course/overview"); } elseif (Request::get("range_id") === "start") { $this->redirect("start"); } else { $this->redirect("questionnaire/overview"); } $this->redirect("questionnaire/overview"); } } } if ($this->questionnaire->isNew() && count($this->questionnaire->questions) === 0) { $question = new Vote(); $question->setId($question->getNewId()); $question['questiontype'] = "Vote"; $this->questionnaire->questions[] = $question; } }