From 294731e8e231554fd2fafbf55dbabe3e639f9042 Mon Sep 17 00:00:00 2001 From: coderkun Date: Fri, 16 May 2014 16:04:56 +0200 Subject: [PATCH] use own method to get list of Quests for a Seminary ordered by open Character submissions --- controllers/QuestsController.inc | 16 +---------- models/QuestsModel.inc | 47 ++++++++++++++++++++++++++++---- views/html/quests/index.tpl | 4 +-- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index 291b6cba..cd69d925 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -92,27 +92,13 @@ // Get Quests $limit = (is_null($all) && is_null($selectedQuestgroup) && is_null($selectedQuesttype)) ? \nre\configs\AppConfig::$misc['questlist_limit'] : null; - $quests = $this->Quests->getQuestsForSeminary($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit); + $quests = $this->Quests->getQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit); foreach($quests as &$quest) { - // Get Questgroup - $quest['questgroup'] = $this->Questgroups->getQuestgroupById($quest['questgroup_id']); - // Get Questtype $quest['questtype'] = $this->Questtypes->getQuesttypeById($quest['questtype_id']); - - // Add open submissions count - $quest['opensubmissionscount'] = count($this->Characters->getCharactersSubmittedQuest($quest['id'])); } - // Sort Quests - usort($quests, function($a, $b) { - if($a['opensubmissionscount'] == $b['opensubmissionscount']) { - return 0; - } - return ($a['opensubmissionscount'] < $b['opensubmissionscount']) ? 1 : -1; - }); - // Get filter values $questgroups = $this->Questgroups->getQuestgroupsForSeminary($seminary['id']); $questtypes = $this->Questtypes->getQuesttypes(); diff --git a/models/QuestsModel.inc b/models/QuestsModel.inc index 420a88e5..d4b0f2ee 100644 --- a/models/QuestsModel.inc +++ b/models/QuestsModel.inc @@ -354,22 +354,57 @@ * @param int $seminaryId ID of Seminary * @return array Quests for this Seminary */ - public function getQuestsForSeminary($seminaryId, $questgroupId=null, $questtypeId=null, $limit=null) + public function getQuestsForSeminary($seminaryId) { return $this->db->query( - 'SELECT DISTINCT quests.id, quests.questgroup_id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.wrong_text, quests.questsmedia_id '. + 'SELECT DISTINCT quests.id, quests.questgroup_id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.wrong_text, quests.questsmedia_id, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url '. 'FROM questgroups '. 'INNER JOIN quests ON quests.questgroup_id = questgroups.id '. - 'WHERE questgroups.seminary_id = ?'. - (!empty($questgroupId) ? ' AND questgroups.id = '.intval($questgroupId) : null). - (!empty($questtypeId) ? ' AND quests.questtype_id = '.intval($questtypeId) : null). - (!empty($limit) ? ' LIMIT '.intval($limit) : null), + 'WHERE questgroups.seminary_id = ? '. + 'ORDER BY quests.title ASC', 'i', $seminaryId ); } + /** + * Get all Quests for a Seminary order by their count of open + * submissions. + * + * @param int $seminaryId ID of Seminary + * @param int $questgroupId ID of Questgroup (optional) + * @param int $questtypeId ID of Questtype (optional) + * @param int $limit Limit amount of Quests (optional) + * @param int $offset Offset (optional) + * @return array Quests for this Seminary + */ + public function getQuestsForSeminaryByOpenSubmissions($seminaryId, $questgroupId=null, $questtypeId=null, $limit=null, $offset=0) + { + return $this->db->query( + 'SELECT DISTINCT quests.id, quests.questgroup_id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.wrong_text, quests.questsmedia_id, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url, ('. + 'SELECT count(DISTINCT quests_characters.character_id) '. + 'FROM quests_characters '. + 'WHERE quests_characters.quest_id = quests.id AND quests_characters.status = ? AND NOT EXISTS ('. + 'SELECT id '. + 'FROM quests_characters AS qc '. + 'WHERE qc.quest_id = quests_characters.quest_id AND qc.character_id = quests_characters.character_id AND qc.created > quests_characters.created'. + ')'. + ') AS opensubmissionscount '. + 'FROM questgroups '. + 'INNER JOIN quests ON quests.questgroup_id = questgroups.id '. + 'WHERE questgroups.seminary_id = ? '. + (!empty($questgroupId) ? sprintf('AND questgroups.id = %d ', $questgroupId) : null). + (!empty($questtypeId) ? sprintf('AND quests.questtype_id = %d ', $questtypeId) : null). + 'ORDER BY opensubmissionscount DESC '. + (!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null), + 'ii', + self::QUEST_STATUS_SUBMITTED, + $seminaryId + ); + } + + /** * Get all Quests that are linked to a Questtopic. * diff --git a/views/html/quests/index.tpl b/views/html/quests/index.tpl index 576183ce..eb08bb7d 100644 --- a/views/html/quests/index.tpl +++ b/views/html/quests/index.tpl @@ -51,7 +51,7 @@