From 2577779f804a647afa0da71012bd9a9554714eee Mon Sep 17 00:00:00 2001 From: coderkun Date: Fri, 29 Aug 2014 15:29:07 +0200 Subject: [PATCH] imlement task oditing for Questtype ?Multiplechoice? (Issue #36) --- configs/AppConfig.inc | 4 + locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 24169 -> 24621 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 42 +++++- .../MultiplechoiceQuesttypeController.inc | 96 +++++++++++- .../MultiplechoiceQuesttypeModel.inc | 109 ++++++++++++++ questtypes/multiplechoice/html/edittask.tpl | 138 +++++++++++++++++- 6 files changed, 384 insertions(+), 5 deletions(-) diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 1b86c448..6520b377 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -226,6 +226,10 @@ 'choice' => array( 'minlength' => 1, 'maxlength' => 128 + ), + 'answer' => array( + 'minlength' => 1, + 'maxlength' => 255 ) ); diff --git a/locale/de_DE/LC_MESSAGES/The Legend of Z.mo b/locale/de_DE/LC_MESSAGES/The Legend of Z.mo index fe054a8a8a20e1c75196b26e6dec445b949a3c91..f80a3f79d6dd3b8a260c902f049fc01a346e4fe3 100644 GIT binary patch delta 8142 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 delta 7823 zcmZ2`fbr!X#`=3gEK?a67#PwR85m?37#MuG85r&}GBDJLfkYV?e#kN~a4;}1{FG&2 z;ACK6V3LFIdE^)v>Kq;9+23;F4!x;A3E55SNEoqz0u8cH)RF}BL)VBU}Xk|dQcFy zK@I3phFCaR84`z!lp#TXR2kyq8&CsYDl;$$GB7ZFQ-%a3hYCcUiVDQ%<|+&f!VC-y zp(+rcXR0tTC^9fGG^j8zNHQ=mEK*@$kYHe7*rUQw4-U$!P=RME3=E#8w76t|eUsXtm1gS#OLb@u%-~v^ML%X2-*-(93RUr;M3YEX13UTO5 z)q03Q>}rspkx_&AOj8ZwGixY6Tn*xYOf^U+63hv z)_}y>V-1Lbe>5N#Flj;@$f*f2P+1cak`9`Xko47rB+7VAi2igb~YLQ89bEnra7f|#$P1#yU} z79?tI!SeMC43Sz87sqQs49OMmGjQaHui&XU?27Bp4(m;?t#O0Ctkhn_Hhd3-l9}-2C`jB#< zMITarOwfnK{Zgp@?fQ@?+@}w5*a>||6x`5;`f0mLI`p!6jJNTRO40k!D0 z0mNtjp%!o%LM)Urgw%RUh71h)pxVq3QhD?kGBDUOFfi;lWMFV(U|{%b$iQI2z`)>Q z#K54#z`#&x#K2(4z`(G~h=IYHfq~%$lrLfoF~`lAfx!S&|CbpJN5%x=0SyyK+#8rc>Ft7y>LHl}U&NB*=@QbiDLD7rtRUG�sK7%?e_HxfLWtY^)$b?_>pW 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 diff --git a/locale/de_DE/LC_MESSAGES/The Legend of Z.po b/locale/de_DE/LC_MESSAGES/The Legend of Z.po index e2054f68..db9566b3 100644 --- a/locale/de_DE/LC_MESSAGES/The Legend of Z.po +++ b/locale/de_DE/LC_MESSAGES/The Legend of Z.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: The Legend of Z\n" -"POT-Creation-Date: 2014-08-17 20:38+0100\n" -"PO-Revision-Date: 2014-08-17 20:39+0100\n" +"POT-Creation-Date: 2014-08-29 15:17+0100\n" +"PO-Revision-Date: 2014-08-29 15:17+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -106,7 +106,7 @@ msgid "Choice input invalid" msgstr "Die Auswahleingabe ist ungültig" #: questtypes/choiceinput/html/edittask.tpl:29 -#: questtypes/choiceinput/html/edittask.tpl:57 +#: questtypes/choiceinput/html/edittask.tpl:58 #, php-format msgid "Please select correct choice" msgstr "Bitte wähle die richtige Auswahleingabe aus" @@ -133,6 +133,7 @@ msgid "Preview" msgstr "Vorschau" #: questtypes/choiceinput/html/edittask.tpl:83 +#: questtypes/multiplechoice/html/edittask.tpl:79 #: questtypes/textinput/html/edittask.tpl:44 #: views/html/achievements/conditions.tpl:151 #: views/html/achievements/create.tpl:109 views/html/achievements/edit.tpl:112 @@ -153,6 +154,41 @@ msgstr "vertikal" msgid "horizontal" msgstr "horizontal" +#: questtypes/multiplechoice/html/edittask.tpl:12 +#: questtypes/multiplechoice/html/edittask.tpl:44 +#, php-format +msgid "Answer input is too short (min. %d chars)" +msgstr "Die Antwort ist zu kurz (min. %d Zeichen)" + +#: questtypes/multiplechoice/html/edittask.tpl:14 +#: questtypes/multiplechoice/html/edittask.tpl:46 +#, php-format +msgid "Answer input is too long (max. %d chars)" +msgstr "Die Antwort ist zu lang (max. %d Zeichen)" + +#: questtypes/multiplechoice/html/edittask.tpl:16 +#: questtypes/multiplechoice/html/edittask.tpl:48 +msgid "Answer input invalid" +msgstr "Die Anwort ist ungültig" + +#: questtypes/multiplechoice/html/edittask.tpl:30 +msgid "Questions" +msgstr "Fragen" + +#: questtypes/multiplechoice/html/edittask.tpl:34 +#: questtypes/multiplechoice/html/edittask.tpl:88 +msgid "Question" +msgstr "Frage" + +#: questtypes/multiplechoice/html/edittask.tpl:71 +#: questtypes/multiplechoice/html/edittask.tpl:90 +msgid "Remove question" +msgstr "Frage entfernen" + +#: questtypes/multiplechoice/html/edittask.tpl:75 +msgid "Add question" +msgstr "Frage hinzufügen" + #: questtypes/multiplechoice/html/quest.tpl:3 #, php-format msgid "Question %d of %d" diff --git a/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc b/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc index 485eab00..8bbca2d8 100644 --- a/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc +++ b/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc @@ -19,6 +19,12 @@ */ class MultiplechoiceQuesttypeController extends \hhu\z\controllers\QuesttypeController { + /** + * Required components + * + * @var array + */ + public $components = array('validation'); @@ -219,7 +225,7 @@ /** - * TODO Action: edittask. + * Action: edittask. * * Edit the task of a Quest. * @@ -229,6 +235,94 @@ */ public function edittask($seminary, $questgroup, $quest) { + // Get questions + $questions = $this->Multiplechoice->getQuestionsOfQuest($quest['id']); + foreach($questions as &$question) { + $question['answers'] = $this->Multiplechoice->getAnswersOfQuestion($question['id']); + } + + // Values + $validations = array(); + + // Save data + if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('save'))) + { + // Get params and validate them + $questions = $this->request->getPostParam('questions'); + if(is_null($questions)) { + $questions = array(); + } + $questions = array_values($questions); + foreach($questions as $questionIndex => &$question) + { + // Validate answers + $question['answers'] = array_values($question['answers']); + foreach($question['answers'] as $answerIndex => &$answer) + { + $answerValidation = $this->Validation->validate($answer['answer'], \nre\configs\AppConfig::$validation['answer']); + if($answerValidation !== true) + { + if(!array_key_exists($questionIndex, $validations) || !is_array($validations[$questionIndex])) { + $validations[$questionIndex] = array(); + } + if(!array_key_exists('answers', $validations[$questionIndex])) { + $validations[$questionIndex]['answers'] = array(); + } + $validations[$questionIndex]['answers'][$answerIndex] = $answerValidation; + } + } + } + + // Save and redirect + if(empty($validations)) + { + // Save questions + foreach($questions as $questionIndex => &$question) + { + // Save question + $this->Multiplechoice->setQuestionForQuest( + $this->Auth->getUserId(), + $quest['id'], + $questionIndex + 1, + $question['question'] + ); + + // Save answers + foreach($question['answers'] as $answerIndex => &$answer) + { + $this->Multiplechoice->setAnswerForQuestion( + $this->Auth->getUserId(), + $quest['id'], + $questionIndex + 1, + $answerIndex + 1, + $answer['answer'], + array_key_exists('tick', $answer) + ); + } + + // Delete deleted answers + $this->Multiplechoice->deleteAnswersOfQuestion( + $quest['id'], + $questionIndex + 1, + count($question['answers']) + ); + } + + // Delete deleted questions + $this->Multiplechoice->deleteQuestionsOfQuest( + $quest['id'], + count($questions) + ); + + // Redirect + $this->redirect($this->linker->link(array('quest', $seminary['url'], $questgroup['url'], $quest['url']), 1)); + } + } + + + // Pass data to view + $this->set('questions', $questions); + $this->set('validations', $validations); } diff --git a/questtypes/multiplechoice/MultiplechoiceQuesttypeModel.inc b/questtypes/multiplechoice/MultiplechoiceQuesttypeModel.inc index be8c704b..5f91d360 100644 --- a/questtypes/multiplechoice/MultiplechoiceQuesttypeModel.inc +++ b/questtypes/multiplechoice/MultiplechoiceQuesttypeModel.inc @@ -153,6 +153,115 @@ return false; } + + + /** + * Set a question for a multiplechoice Quest. + * + * @param int $userId ID of user + * @param int $questId ID of Quest to set question for + * @param int $pos Position of question + * @param string $question Question text + */ + public function setQuestionForQuest($userId, $questId, $pos, $question) + { + $this->db->query( + 'INSERT INTO questtypes_multiplechoice '. + '(created_user_id, quest_id, pos, question) '. + 'VALUES '. + '(?, ?, ?, ?) '. + 'ON DUPLICATE KEY UPDATE '. + 'question = ?', + 'iiiss', + $userId, + $questId, + $pos, + $question, + $question + ); + } + + + /** + * Delete questions of a Quest. + * + * @param int $questId ID of Quest to delete question of + * @param int $offset Only delete questions after this position + */ + public function deleteQuestionsOfQuest($questId, $offset) + { + $this->db->query( + 'DELETE FROM questtypes_multiplechoice '. + 'WHERE quest_id = ? AND pos > ?', + 'ii', + $questId, + $offset + ); + } + + + /** + * Set an answer for a question. + * + * @param int $userId ID of user + * @param int $questId ID of Quest to set answer for + * @param int $questionPos Position of question + * @param int $answerPos Position of answer + * @param string $answer Answer text + * @param boolean $tick Whether answer is correct or not + */ + public function setAnswerForQuestion($userId, $questId, $questionPos, $answerPos, $answer, $tick) + { + // Get question + $question = $this->getQuestionOfQuest($questId, $questionPos); + if(is_null($question)) { + return; + } + + // Add answer + $this->db->query( + 'INSERT INTO questtypes_multiplechoice_answers '. + '(created_user_id, questtypes_multiplechoice_id, pos, answer, tick) '. + 'VALUES '. + '(?, ?, ?, ?, ?) '. + 'ON DUPLICATE KEY UPDATE '. + 'answer = ?, tick = ?', + 'iiisisi', + $userId, + $question['id'], + $answerPos, + $answer, + $tick, + $answer, + $tick + ); + } + + + /** + * Delete answers of a question. + * + * @param int $questId ID of Quest to delete answers for + * @param int $questionPos Position of question + * @param int $offset Only delete answers after this position + */ + public function deleteAnswersOfQuestion($questId, $questionPos, $offset) + { + // Get question + $question = $this->getQuestionOfQuest($questId, $questionPos); + if(is_null($question)) { + return; + } + + // Delete answer + $this->db->query( + 'DELETE FROM questtypes_multiplechoice_answers '. + 'WHERE questtypes_multiplechoice_id = ? AND pos > ?', + 'ii', + $question['id'], + $offset + ); + } } diff --git a/questtypes/multiplechoice/html/edittask.tpl b/questtypes/multiplechoice/html/edittask.tpl index c65158e7..8da183b5 100644 --- a/questtypes/multiplechoice/html/edittask.tpl +++ b/questtypes/multiplechoice/html/edittask.tpl @@ -1 +1,137 @@ -

TODO

+ +
    + +
  • + + +
      + $value) : ?> +
    • + +
    • + +
    + + +
  • + +
+ +
+
+ +
    + &$question) : ?> +
  1. + : + + + +
      + + $value) : ?> +
    • + +
    • + + +
    + + +
      + &$answer) : ?> +
    • + checked="checked" /> + + +
    • + +
    • + +
    • +
    + +
  2. + +
  3. + +
  4. +
+
+ +
+ +