From b0e3dd116913a8a8569789fe17a6bdaedcaa892e Mon Sep 17 00:00:00 2001 From: coderkun Date: Mon, 2 Jun 2014 22:04:01 +0200 Subject: [PATCH] correctly link back to Quest choosen by Character at the end of an optional Questline --- .../QuestgroupshierarchypathController.inc | 3 +- controllers/QuestsController.inc | 7 ++-- models/QuesttextsModel.inc | 37 +++++++++++++++---- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/controllers/QuestgroupshierarchypathController.inc b/controllers/QuestgroupshierarchypathController.inc index fabf2bbb..907017d5 100644 --- a/controllers/QuestgroupshierarchypathController.inc +++ b/controllers/QuestgroupshierarchypathController.inc @@ -57,7 +57,8 @@ if(is_null($questgroup['hierarchy'])) { // Get related Questgroup - $questtext = $this->Questtexts->getRelatedQuesttextForQuestgroup($currentQuestgroup['id']); + $questtexts = $this->Questtexts->getRelatedQuesttextsForQuestgroup($currentQuestgroup['id']); + $questtext = $this->Questtexts->pickQuesttextLastEnteredByCharacter(\hhu\z\controllers\SeminaryController::$character['id'], $questtexts); $quest = $this->Quests->getQuestById($questtext['quest_id']); $currentQuestgroup = $this->Questgroups->getQuestgroupById($quest['questgroup_id']); $currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($currentQuestgroup['id']); diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index 61f5bb8a..d220071f 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -259,9 +259,10 @@ $solved = true; } - // Get (related) Questtext - $relatedQuesttext = $this->Questtexts->getRelatedQuesttextForQuestgroup($questgroup['id']); - if(!empty($relatedQuesttext)) { + // Get (related) Questtexts + $relatedQuesttexts = $this->Questtexts->getRelatedQuesttextsForQuestgroup($questgroup['id']); + $relatedQuesttext = $this->Questtexts->pickQuesttextLastEnteredByCharacter($character['id'], $relatedQuesttexts); + if(!is_null($relatedQuesttext)) { $relatedQuesttext['quest'] = $this->Quests->getQuestById($relatedQuesttext['quest_id']); if(!empty($relatedQuesttext['quest'])) { $relatedQuesttext['quest']['questgroup_url'] = $this->Questgroups->getQuestgroupById($relatedQuesttext['quest']['questgroup_id'])['url']; diff --git a/models/QuesttextsModel.inc b/models/QuesttextsModel.inc index 0cd931f1..5ac1d50d 100644 --- a/models/QuesttextsModel.inc +++ b/models/QuesttextsModel.inc @@ -129,15 +129,15 @@ /** - * Get corresponding Questtext for a Sidequest. + * Get corresponding Questtexts for a Questgroup. * * @throws IdNotFoundException - * @param int $sidequestId ID of the Sidequest to get the Questtext for - * @param array Questtext data + * @param int $questgroupId ID of Questgroup to get the Questtexst for + * @param array List of Questtexts */ - public function getRelatedQuesttextForQuestgroup($questgroupId) + public function getRelatedQuesttextsForQuestgroup($questgroupId) { - $data = $this->db->query( + return $this->db->query( 'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexts.quest_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. 'FROM questgroups_questtexts '. 'LEFT JOIN questtexts ON questtexts.id = questgroups_questtexts.questtext_id '. @@ -146,8 +146,31 @@ 'i', $questgroupId ); - if(!empty($data)) { - return $data[0]; + } + + + public function pickQuesttextLastEnteredByCharacter($characterId, $questtexts) + { + if(count($questtexts) == 0) { + return null; + } + $data = $this->db->query( + sprintf( + 'SELECT quest_id '. + 'FROM quests_characters '. + 'WHERE character_id = ? AND quest_id IN (%s) AND status = ? '. + 'ORDER BY created DESC '. + 'LIMIT 1', + implode(',', array_map(function($q) { return intval($q['quest_id']); }, $questtexts)) + ), + 'ii', + $characterId, + \hhu\z\models\QuestsModel::QUEST_STATUS_ENTERED + ); + foreach($questtexts as &$questtext) { + if($questtext['quest_id'] == $data[0]['quest_id']) { + return $questtext; + } }