From f655749be3070a79d4a71c4a7d34b31511f3835a Mon Sep 17 00:00:00 2001 From: coderkun Date: Sun, 25 May 2014 00:47:29 +0200 Subject: [PATCH] use AJAX to dynamicall load list of all Quests for a Seminary (Issue #287) --- controllers/QuestsController.inc | 12 +++++-- models/QuestsModel.inc | 29 ++++++++++++++++ views/ajax/quests/index.tpl | 37 ++++++++++++++++++++ views/html/quests/index.tpl | 59 +++++++++++++++++++++++++++++--- 4 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 views/ajax/quests/index.tpl diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index 87d158b8..b0480943 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -84,17 +84,22 @@ // Set filters $selectedQuestgroup = null; $selectedQuesttype = null; + $page = 1; if($this->request->getRequestMethod() == 'GET') { $selectedQuestgroup = $this->request->getGetParam('questgroup'); $selectedQuestgroup = !empty($selectedQuestgroup) ? $selectedQuestgroup : null; $selectedQuesttype = $this->request->getGetParam('questtype'); $selectedQuesttype = !empty($selectedQuesttype) ? $selectedQuesttype : null; + $page = $this->request->getGetParam('page'); + $page = !empty($page) ? intval($page) : 1; } // Get Quests - $limit = (is_null($all) && is_null($selectedQuestgroup) && is_null($selectedQuesttype)) ? \nre\configs\AppConfig::$misc['questlist_limit'] : null; - $quests = $this->Quests->getQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit); + $limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['questlist_limit'] : null; + $offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0; + $questsCount = $this->Quests->getCountForQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype); + $quests = $this->Quests->getQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit, $offset); foreach($quests as &$quest) { // Get Questtype @@ -117,6 +122,9 @@ $this->set('selectedQuestgroup', $selectedQuestgroup); $this->set('selectedQuesttype', $selectedQuesttype); $this->set('quests', $quests); + $this->set('questsCount', $questsCount); + $this->set('all', $all); + $this->set('page', $page); $this->set('limit', $limit); } diff --git a/models/QuestsModel.inc b/models/QuestsModel.inc index d4b0f2ee..ba749db9 100644 --- a/models/QuestsModel.inc +++ b/models/QuestsModel.inc @@ -368,6 +368,35 @@ } + /** + * Get count of all Quests for a Seminary. + * + * @param int $seminaryId ID of Seminary + * @param int $questgroupId ID of Questgroup (optional) + * @param int $questtypeId ID of Questtype (optional) + * @return int Count of Quests for this Seminary + */ + public function getCountForQuestsForSeminaryByOpenSubmissions($seminaryId, $questgroupId=null, $questtypeId=null) + { + $data = $this->db->query( + 'SELECT count(DISTINCT quests.id) AS c '. + '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), + 'i', + $seminaryId + ); + if(!empty($data)) { + return $data[0]['c']; + } + + + return 0; + } + + /** * Get all Quests for a Seminary order by their count of open * submissions. diff --git a/views/ajax/quests/index.tpl b/views/ajax/quests/index.tpl new file mode 100644 index 00000000..538c6c2a --- /dev/null +++ b/views/ajax/quests/index.tpl @@ -0,0 +1,37 @@ + + $seminary, + 'quests' => $quests, + 'more' => (($page*$limit) < $questsCount) +))?> diff --git a/views/html/quests/index.tpl b/views/html/quests/index.tpl index 4b0f0801..136bee60 100644 --- a/views/html/quests/index.tpl +++ b/views/html/quests/index.tpl @@ -48,7 +48,7 @@ -