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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 delta 4814 zcmYk-3w)1N9LMpqyRn%Wwye!&7niwhb6p6z6iE}hnaXTgEVT`D$zzHoDp?v)atRqy z(-bSqDsxF$S@f!uS9*0(saMgm(&zhsj$V6SzI&hZ{QuAMobx;9`CD9YX@>JvOW#$7 z<21RJeCuyaf|oHnf_2uIK`o7Gf`c&-N80{4Y(_r=!!ZYwun2>2CpO1@sOt}-AJ!uO z%qjlx2*>qFVD1Oh)x@!w|e5 z`HGp1*Whw{ehcdU6{!0h(s`b5&e2dQ|Fn8B9hEc~wF(KSnWthT4zcGap_XJiYKF5= zGb}=t`f=2fK4mRK4WI_w;c0XtXw=itNL%t$UC;%!hBu)qFahAIiVZYp*G{!s0%KmmcWa zhx*=Xq?%?IYDOPm93Dqi;&Os3v1Fk|%`I@JBXM^*9<)b-wM7zW^&0JmX+QLkATs~nC(7&x zyV0Be8>kV#iP}U5Q4jhQ_5E|Gnf-{W*ag&sub{5;r<@vS3)GA|TT`*hi?<1N{XcPz z`vo8Bs1XIBDiDsxFb;Wx%mvi0Zbn`8K1ZMi)*ZE$gHf;J7*r*)kX11=k)IH=3bm(p zAuoWbK=!Mtb!g}YzoItRKiCyx6Wtq(LG9)l*7c|Xe1sbCcc>fxhMIZ3{oIEg*oS^w z)DnzE4J;cq&{?Q~Im>CNgfFAkcn|7}$56ZW3)B~XL*1xpNB1?2MpYo$_HRIaJ^?kM z2khsCsLDNox?d^kdpq2|W2$IqL?=-X{>gsfGU`Sl>_C5vvc{uIn1nGn0<|}$BFk## zSl6K{bpRQ=sY6ZhU)1kRo6cGS*1r=Cm2x=xVmfL-6HvQ+I_gI2QG25THG_kw@71Ah zcpm-m3TohfN$!2aunC(k8ufXHF7DEHMSq@eM$^#D$6*jo!9aW%^`LpE2Rw}`;YQov zi>k~KY=S4SDSnPYcn)=+-%%B7Kn);*4W>#&qodOFrlFZnLhbfUWW$>UsF`m<_LbRZ z{RXvXnsjq#8jhMk0%`!gusIGw4SWphZJ3N2=pxi}mUW~4RLgAPggk+|paJ>yH6h*I z-Q5*6&|awbIs;ioGuyfWRf(gh8P=jIbqcj)KcgyAk0I#a!~K4n9@JkWisFPWOvC`} zg8E`l)P+Ma7}HTpat}7geAI&$p{_4Q4deyuX8U;=Y6+@P-}?epsk06Z4d7?g`+5<3 zVYg(rKLtn8Ux)lN-}5I8+orgc8jl+2RBVBTw!aiLz%{5nunqN`*Rdn+M=gQ#Ee)0a zinVj9TY>RNwM+);hv`X-!Pn4JV$_UIVFLbv+Ei_Ox=WQ}y$kjGu?V#kYf<0ZiVVmx z2WY6oHK_OZB(hP>U#S0-5-11T!3?$Lqh_)ZHS;pm_4`qKqXxb4ENYLOLk%>fw_C9! z>_>kfhU@(=q@fE}AVo0SZU0Nu11_OT7{L0-P;8BnsDUJ-)-ugH%$~m$^;X?!orJnR z6SY*i7^?Swf&E|wYV$mgn$ZT-19qWGw-+^&YSh}Ev7i5f{JxlH$dlwwGK8!onMBu& zCs&UQ8u_G_IGW*Ra`iY!<5SzwGUzCG@yz-J?PcU9d#)3fk!ML?5=I^*I#v*ET21mf zau-=jUMBW%%miASZ0{{RMQ*YESMVNkk~~GUQQsvxa)~z96tbFVH|y19xjofthl7bK z8AI+R1ITBDt!1{5IM2{%Xrt+PjMR`DNdb9-j3y(<_2lX?md4HGJ#v`LBs%oQXfHHA zZl^Pw3?d(p#>Y;TCZ70^F=Re@lx!uFNjhmybi73Nk|)SxthKBDJ)Hk0JH$8+4l-(oU~yiVqlKBSK57)N+1{y)0X3MO~kGaYa{ z`H*M>>&PZ0q*@)0(=Lt~Nh6O`kdE$2lZ6T7VcVa9>&b1lFT%;=wqJ>d$WgL^>>&@4 zvn)y4mwdb->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 '. '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 - - + + +
- - + + +
- - +
+ +

+