From f863ff96783f96b0d380317ec75730783d5bc8cb Mon Sep 17 00:00:00 2001 From: coderkun Date: Thu, 15 May 2014 23:37:26 +0200 Subject: [PATCH] listing of all Quests of a Seminary: improve filtering, sort Quests and do not load all at once (Issue #71) --- configs/AppConfig.inc | 6 +- controllers/QuestsController.inc | 59 ++++++++--------- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 14327 -> 14853 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 57 ++++++++++++++-- models/QuestsModel.inc | 7 +- views/html/quests/index.tpl | 69 +++++++++++++++----- 6 files changed, 142 insertions(+), 56 deletions(-) diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 8291a1f1..01237cc3 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -132,7 +132,8 @@ public static $misc = array( 'ranking_range' => 2, 'achievements_range' => 3, - 'title_delimiter' => ' – ' + 'title_delimiter' => ' – ', + 'questlist_limit' => 10 ); @@ -212,6 +213,7 @@ array('^questgroups/([^/]+)/(create)/?$', 'questgroups/$2/$1', true), array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true), array('^quests/([^/]+)/?$', 'quests/index/$1', true), + array('^quests/([^/]+)/all/?$', 'quests/index/$1/all', true), array('^quests/([^/]+)/(create|createmedia)/?$', 'quests/$2/$1' , true), array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions)/?$', 'quests/$4/$1/$2/$3', true), array('^quests/([^/]+)/([^/]+)/([^/]+)/(submission)/([^/]+)/?$', 'quests/$4/$1/$2/$3/$5', true), @@ -250,7 +252,7 @@ array('^seminaries/seminary/(.*)$', 'seminaries/$1', false), array('^questgroups/create/(.*)$', 'questgroups/$2/$1', true), array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true), - array('^quests/index/([^/]+)$', 'quests/$1', true), + array('^quests/index/(.+)$', 'quests/$1', true), array('^quests/quest/(.*)$', 'quests/$1', true), array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true), array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true), diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index c506219b..291b6cba 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -74,53 +74,49 @@ * List all Quests for a Seminary. * * @param string $seminaryUrl URL-Title of Seminary + * @param string $all Show all Quests */ - public function index($seminaryUrl) + public function index($seminaryUrl, $all=null) { // Get seminary $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); - // Prepare filters - $filters = array( - 'questgroups' => array(), - 'questtypes' => array() - ); - - // Get selected filters - $selectedFilters = array( - 'questgroup' => "0", - 'questtype' => "" - ); - if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('filters'))) { - $selectedFilters = $this->request->getPostParam('filters'); + // Set filters + $selectedQuestgroup = null; + $selectedQuesttype = null; + if($this->request->getRequestMethod() == 'GET') + { + $selectedQuestgroup = !empty($this->request->getGetParam('questgroup')) ? $this->request->getGetParam('questgroup') : null; + $selectedQuesttype = !empty($this->request->getGetParam('questtype')) ? $this->request->getGetParam('questtype') : null; } // Get Quests - $quests = array(); - foreach($this->Quests->getQuestsForSeminary($seminary['id']) as $quest) + $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); + foreach($quests as &$quest) { // Get Questgroup $quest['questgroup'] = $this->Questgroups->getQuestgroupById($quest['questgroup_id']); - if($selectedFilters['questgroup'] != "0" && $selectedFilters['questgroup'] != $quest['questgroup']['id']) { - continue; - } // Get Questtype $quest['questtype'] = $this->Questtypes->getQuesttypeById($quest['questtype_id']); - if($selectedFilters['questtype'] != "" && $selectedFilters['questtype'] != $quest['questtype']['classname']) { - continue; - } - - // Add filter values - $filters['questgroups'][$quest['questgroup']['id']] = $quest['questgroup']; - $filters['questtypes'][$quest['questtype']['classname']] = $quest['questtype']; // Add open submissions count $quest['opensubmissionscount'] = count($this->Characters->getCharactersSubmittedQuest($quest['id'])); - - $quests[] = $quest; } + // 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(); + // Set titile $this->addTitleLocalized('Quests'); @@ -128,9 +124,12 @@ // Pass data to view $this->set('seminary', $seminary); + $this->set('questgroups', $questgroups); + $this->set('questtypes', $questtypes); + $this->set('selectedQuestgroup', $selectedQuestgroup); + $this->set('selectedQuesttype', $selectedQuesttype); $this->set('quests', $quests); - $this->set('filters', $filters); - $this->set('selectedFilters', $selectedFilters); + $this->set('limit', $limit); } 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 82b2b8be1d027b7777ac4a74855e11a0d68db122..f634d175f4590331375b9c112c8cbb21dad8202e 100644 GIT binary patch delta 5327 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 'SELECT DISTINCT quests.id, quests.questgroup_id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.wrong_text, quests.questsmedia_id '. 'FROM questgroups '. 'INNER JOIN quests ON quests.questgroup_id = questgroups.id '. - 'WHERE questgroups.seminary_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), 'i', $seminaryId ); diff --git a/views/html/quests/index.tpl b/views/html/quests/index.tpl index 03724b57..576183ce 100644 --- a/views/html/quests/index.tpl +++ b/views/html/quests/index.tpl @@ -8,34 +8,73 @@

-
+
Filter - - + + +
- - + + +
- - +
+ +

+