diff --git a/app/QuesttypeController.inc b/app/QuesttypeController.inc index 6bbabdd2..25544ab2 100644 --- a/app/QuesttypeController.inc +++ b/app/QuesttypeController.inc @@ -59,12 +59,13 @@ * * Show the task of a Quest. * - * @param array $seminary Current Seminary data - * @param array $questgroup Current Questgroup data - * @param array $quest Current Quest data - * @param array $character Current Character data + * @param array $seminary Current Seminary data + * @param array $questgroup Current Questgroup data + * @param array $quest Current Quest data + * @param array $character Current Character data + * @param Exception $exception Character submission exception */ - public abstract function quest($seminary, $questgroup, $quest, $character); + public abstract function quest($seminary, $questgroup, $quest, $character, $exception); diff --git a/app/exceptions/SubmissionNotValidException.inc b/app/exceptions/SubmissionNotValidException.inc new file mode 100644 index 00000000..e2923bdf --- /dev/null +++ b/app/exceptions/SubmissionNotValidException.inc @@ -0,0 +1,77 @@ + + * @copyright 2014 Heinrich-Heine-Universität Düsseldorf + * @license http://www.gnu.org/licenses/gpl.html + * @link https://bitbucket.org/coderkun/the-legend-of-z + */ + + namespace hhu\z\exceptions; + + + /** + * Exception: Character submission not valid. + * + * @author Oliver Hanraths + */ + class SubmissionNotValidException extends \nre\core\Exception + { + /** + * Error code + * + * @var int + */ + const CODE = 200; + /** + * Error message + * + * @var string + */ + const MESSAGE = 'Character submission not valid'; + + /** + * Nested exception + * + * @var Exception + */ + private $nestedException; + + + + + /** + * Construct a new exception. + * + * @param string $nestedException Nested exception + */ + function __construct($nestedException, $message=self::MESSAGE, $code=self::CODE) + { + parent::__construct( + $message, + $code, + $nestedException + ); + + // Store value + $this->nestedException = $nestedException; + } + + + + + /** + * Get Nested exception. + * + * @return string Nested exception + */ + public function getNestedException() + { + return $this->nestedException; + } + + } + +?> diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index 4fcdedeb..e755fe01 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -277,17 +277,14 @@ $questmedia = $this->Media->getMediaById($quest['questsmedia_id']); } + // Get submitted Character submissions + $submittedSubmissionCharacters = $this->Characters->getCharactersSubmittedQuest($quest['id']); + // Get unsolved Character submissions - $unsolvedSubmissions = $this->Quests->getCharactersUnsolvedQuest($quest['id']); - foreach($unsolvedSubmissions as &$submission) { - $submission['character'] = $this->Characters->getCharacterById($submission['character_id']); - } + $unsolvedSubmissionCharacters = $this->Characters->getCharactersUnsolvedQuest($quest['id']); // Get solved Character submissions - $solvedSubmissions = $this->Quests->getCharactersSolvedQuest($quest['id']); - foreach($solvedSubmissions as &$submission) { - $submission['character'] = $this->Characters->getCharacterById($submission['character_id']); - } + $solvedSubmissionCharacters = $this->Characters->getCharactersSolvedQuest($quest['id']); // Pass data to view @@ -295,8 +292,9 @@ $this->set('questgroup', $questgroup); $this->set('quest', $quest); $this->set('media', $questmedia); - $this->set('unsolvedsubmissions', $unsolvedSubmissions); - $this->set('solvedsubmissions', $solvedSubmissions); + $this->set('submittedSubmissionCharacters', $submittedSubmissionCharacters); + $this->set('unsolvedSubmissionCharacters', $unsolvedSubmissionCharacters); + $this->set('solvedSubmissionCharacters', $solvedSubmissionCharacters); } @@ -380,27 +378,39 @@ $answers = $this->request->getPostParam('answers'); // Save answers in database - if(!$this->Quests->hasCharacterSolvedQuest($quest['id'], $character['id'])) { - $questtypeAgent->saveAnswersOfCharacter($seminary, $questgroup, $quest, $character, $answers); - } + try { + if(!$this->Quests->hasCharacterSolvedQuest($quest['id'], $character['id'])) { + $questtypeAgent->saveAnswersOfCharacter($seminary, $questgroup, $quest, $character, $answers); + } - // Match answers with correct ones - $status = $questtypeAgent->matchAnswersofCharacter($seminary, $questgroup, $quest, $character, $answers); - if($status === true) - { - // Mark Quest as solved - $this->Quests->setQuestSolved($quest['id'], $character['id']); + // Match answers with correct ones + $status = $questtypeAgent->matchAnswersofCharacter($seminary, $questgroup, $quest, $character, $answers); + if($status === true) + { + // Mark Quest as solved + $this->Quests->setQuestSolved($quest['id'], $character['id']); - // Redirect - $this->redirect($this->linker->link('Epilog', 5, true, array('status'=>'solved'))); + // Redirect + $this->redirect($this->linker->link('Epilog', 5, true, array('status'=>'solved'))); + } + elseif($status === false) + { + // Mark Quest as unsolved + $this->Quests->setQuestUnsolved($quest['id'], $character['id']); + + // Redirect + $this->redirect($this->linker->link('Prolog', 5, true, array('status'=>'unsolved'))); + } + else { + // Mark Quest as submitted + $this->Quests->setQuestSubmitted($quest['id'], $character['id']); + + // Redirect + $this->redirect($this->linker->link('Prolog', 5, true)); + } } - elseif($status === false) - { - // Mark Quest as unsolved - $this->Quests->setQuestUnsolved($quest['id'], $character['id']); - - // Redirect - $this->redirect($this->linker->link('Prolog', 5, true, array('status'=>'unsolved'))); + catch(\hhu\z\exceptions\SubmissionNotValidException $e) { + $response->addParam($e); } } diff --git a/models/CharactersModel.inc b/models/CharactersModel.inc index 7a3a5d6a..1f0c1f5e 100644 --- a/models/CharactersModel.inc +++ b/models/CharactersModel.inc @@ -254,6 +254,88 @@ return 1; } + + /** + * Get Characters that solved a Quest. + * + * @param int $questId ID of Quest to get Characters for + * @return array Characters data + */ + public function getCharactersSolvedQuest($questId) + { + return $data = $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.description AS avatar_description '. + 'FROM v_characters AS characters '. + 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. + 'LEFT JOIN avatarpictures ON avatarpictures.media_id = avatars.avatarpicture_id '. + 'LEFT JOIN media ON media.id = avatarpictures.media_id '. + 'WHERE EXISTS ('. + 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. + ')', + 'ii', + $questId, + QuestsModel::QUEST_STATUS_SOLVED + ); + } + + + /** + * Get Characters that did not solv a Quest. + * + * @param int $questId ID of Quest to get Characters for + * @return array Characters data + */ + public function getCharactersUnsolvedQuest($questId) + { + return $data = $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.description AS avatar_description '. + 'FROM v_characters AS characters '. + 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. + 'LEFT JOIN avatarpictures ON avatarpictures.media_id = avatars.avatarpicture_id '. + 'LEFT JOIN media ON media.id = avatarpictures.media_id '. + 'WHERE EXISTS ('. + 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. + ') AND NOT EXISTS ('. + 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. + ')', + 'iiii', + $questId, QuestsModel::QUEST_STATUS_UNSOLVED, + $questId, QuestsModel::QUEST_STATUS_SOLVED + ); + } + + + /** + * Get Characters that sent a submission for a Quest. + * + * @param int $questId ID of Quest to get Characters for + * @return array Characters data + */ + public function getCharactersSubmittedQuest($questId) + { + return $data = $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.description AS avatar_description '. + 'FROM v_characters AS characters '. + 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. + 'LEFT JOIN avatarpictures ON avatarpictures.media_id = avatars.avatarpicture_id '. + 'LEFT JOIN media ON media.id = avatarpictures.media_id '. + 'WHERE EXISTS ('. + 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. + ') AND NOT EXISTS ('. + 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. + ') AND NOT EXISTS ('. + 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. + ')', + 'iiiiii', + $questId, QuestsModel::QUEST_STATUS_SUBMITTED, + $questId, QuestsModel::QUEST_STATUS_UNSOLVED, + $questId, QuestsModel::QUEST_STATUS_SOLVED + ); + } + } ?> diff --git a/models/QuestsModel.inc b/models/QuestsModel.inc index 0ea48fc1..fb54519d 100644 --- a/models/QuestsModel.inc +++ b/models/QuestsModel.inc @@ -24,19 +24,25 @@ * * @var int; */ - const QUEST_STATUS_ENTERED = 1; + const QUEST_STATUS_ENTERED = 0; /** - * Quest-status: Solved + * Quest-status: submitted * * @var int; */ - const QUEST_STATUS_SOLVED = 0; + const QUEST_STATUS_SUBMITTED = 1; /** * Quest-status: Unsolved * * @var int; */ - const QUEST_STATUS_UNSOLVED = -1; + const QUEST_STATUS_UNSOLVED = 2; + /** + * Quest-status: Solved + * + * @var int; + */ + const QUEST_STATUS_SOLVED = 3; @@ -184,14 +190,14 @@ /** - * Mark a Quest as solved for a Character. + * Mark a Quest as submitted for a Character. * - * @param int $questId ID of Quest to mark as solved - * @param int $characterId ID of Character that solved the Quest + * @param int $questId ID of Quest to mark as unsolved + * @param int $characterId ID of Character that unsolved the Quest */ - public function setQuestSolved($questId, $characterId) + public function setQuestSubmitted($questId, $characterId) { - $this->setQuestStatus($questId, $characterId, static::QUEST_STATUS_SOLVED); + $this->setQuestStatus($questId, $characterId, static::QUEST_STATUS_SUBMITTED); } @@ -207,6 +213,18 @@ } + /** + * Mark a Quest as solved for a Character. + * + * @param int $questId ID of Quest to mark as solved + * @param int $characterId ID of Character that solved the Quest + */ + public function setQuestSolved($questId, $characterId) + { + $this->setQuestStatus($questId, $characterId, static::QUEST_STATUS_SOLVED, false); + } + + /** * Determine if the given Character has entered a Quest. * @@ -279,48 +297,6 @@ } - /** - * Get Characters that solved a Quest. - * - * @param int $questId ID of Quest to get Characters for - * @return array Characters data - */ - public function getCharactersSolvedQuest($questId) - { - return $data = $this->db->query( - 'SELECT character_id, created, text '. - 'FROM questtypes_submit_characters '. - 'WHERE quest_id = ? AND EXISTS ('. - 'SELECT character_id FROM quests_characters WHERE quest_id = questtypes_submit_characters.quest_id AND status = ?'. - ')', - 'ii', - $questId, - static::QUEST_STATUS_SOLVED - ); - } - - - /** - * Get Characters that did not solved a Quest. - * - * @param int $questId ID of Quest to get Characters for - * @return array Characters data - */ - public function getCharactersUnsolvedQuest($questId) - { - return $data = $this->db->query( - 'SELECT character_id, created, text '. - 'FROM questtypes_submit_characters '. - 'WHERE quest_id = ? AND NOT EXISTS ('. - 'SELECT character_id FROM quests_characters WHERE quest_id = questtypes_submit_characters.quest_id AND status = ?'. - ')', - 'ii', - $questId, - static::QUEST_STATUS_SOLVED - ); - } - - /** diff --git a/questtypes/dragndrop/DragndropQuesttypeController.inc b/questtypes/dragndrop/DragndropQuesttypeController.inc index 85b96844..2fc0b2b2 100644 --- a/questtypes/dragndrop/DragndropQuesttypeController.inc +++ b/questtypes/dragndrop/DragndropQuesttypeController.inc @@ -102,12 +102,13 @@ * Display a text with input fields and evaluate if user input * matches with stored regular expressions. * - * @param array $seminary Current Seminary data - * @param array $questgroup Current Questgroup data - * @param array $quest Current Quest data - * @param array $character Current Character data + * @param array $seminary Current Seminary data + * @param array $questgroup Current Questgroup data + * @param array $quest Current Quest data + * @param array $character Current Character data + * @param Exception $exception Character submission exception */ - public function quest($seminary, $questgroup, $quest, $character) + public function quest($seminary, $questgroup, $quest, $character, $exception) { // Get Drag&Drop field $dndField = $this->Dragndrop->getDragndrop($quest['id']); diff --git a/questtypes/dummy/DummyQuesttypeController.inc b/questtypes/dummy/DummyQuesttypeController.inc index d9ed7aab..a478cda5 100644 --- a/questtypes/dummy/DummyQuesttypeController.inc +++ b/questtypes/dummy/DummyQuesttypeController.inc @@ -61,12 +61,13 @@ * * Show the task of a Quest. * - * @param array $seminary Current Seminary data - * @param array $questgroup Current Questgroup data - * @param array $quest Current Quest data - * @param array $character Current Character data + * @param array $seminary Current Seminary data + * @param array $questgroup Current Questgroup data + * @param array $quest Current Quest data + * @param array $character Current Character data + * @param Exception $exception Character submission exception */ - public function quest($seminary, $questgroup, $quest, $character) + public function quest($seminary, $questgroup, $quest, $character, $exception) { // Nothing to do } diff --git a/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc b/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc index 14880743..456db617 100644 --- a/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc +++ b/questtypes/multiplechoice/MultiplechoiceQuesttypeController.inc @@ -112,12 +112,13 @@ * Display questions with a checkbox to let the user choose the * right ones. * - * @param array $seminary Current Seminary data - * @param array $questgroup Current Questgroup data - * @param array $quest Current Quest data - * @param array $character Current Character data + * @param array $seminary Current Seminary data + * @param array $questgroup Current Questgroup data + * @param array $quest Current Quest data + * @param array $character Current Character data + * @param Exception $exception Character submission exception */ - public function quest($seminary, $questgroup, $quest, $character) + public function quest($seminary, $questgroup, $quest, $character, $exception) { // Get count of questions $count = $this->Multiplechoice->getQuestionsCountOfQuest($quest['id']); diff --git a/questtypes/textinput/TextinputQuesttypeController.inc b/questtypes/textinput/TextinputQuesttypeController.inc index 13e48612..5be23690 100644 --- a/questtypes/textinput/TextinputQuesttypeController.inc +++ b/questtypes/textinput/TextinputQuesttypeController.inc @@ -90,12 +90,13 @@ * Display a text with input fields and evaluate if user input * matches with stored regular expressions. * - * @param array $seminary Current Seminary data - * @param array $questgroup Current Questgroup data - * @param array $quest Current Quest data - * @param array $character Current Character data + * @param array $seminary Current Seminary data + * @param array $questgroup Current Questgroup data + * @param array $quest Current Quest data + * @param array $character Current Character data + * @param Exception $exception Character submission exception */ - public function quest($seminary, $questgroup, $quest, $character) + public function quest($seminary, $questgroup, $quest, $character, $exception) { // Get Task $task = $this->Textinput->getTextinputQuest($quest['id']); diff --git a/views/html/quests/submission.tpl b/views/html/quests/submission.tpl index 6417f76e..9d13af65 100644 --- a/views/html/quests/submission.tpl +++ b/views/html/quests/submission.tpl @@ -5,6 +5,7 @@

+

diff --git a/views/html/quests/submissions.tpl b/views/html/quests/submissions.tpl index f14c2a8f..538b8565 100644 --- a/views/html/quests/submissions.tpl +++ b/views/html/quests/submissions.tpl @@ -12,20 +12,29 @@
+

+ +