From c17ad8a4acbaebdc497ff87685a36ba229eb2b9d Mon Sep 17 00:00:00 2001 From: coderkun Date: Tue, 29 Apr 2014 21:40:12 +0200 Subject: [PATCH] implement sort functionality for listing and managing Characters (Issue #177) --- controllers/CharactersController.inc | 194 ++++++++++++++++---- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 11824 -> 11808 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 111 +++++------ views/html/characters/index.tpl | 17 +- views/html/characters/manage.tpl | 15 +- 5 files changed, 238 insertions(+), 99 deletions(-) diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index cb17db34..b179430b 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -69,40 +69,46 @@ // Get Seminary $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); - // Set default properties to show - $properties = array( - 'username', - 'xps' - ); - - // Select proprties to show - if($this->request->getRequestMethod() == 'POST') - { - $properties = $this->request->getPostParam('properties'); - if(!is_array($properties)) { - $properties = array(); - } - } + // Get Seminarycharacterfields + $characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']); // Get registered Characters $characters = $this->Characters->getCharactersForSeminary($seminary['id']); foreach($characters as &$character) { $character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); - $character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id'])); $character['user'] = $this->Users->getUserById($character['user_id']); - $character['characterfields'] = $this->Seminarycharacterfields->getFieldsForCharacter($character['id']); + $character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id'])); + $character['characterfields'] = array(); + foreach($this->Seminarycharacterfields->getFieldsForCharacter($character['id']) as &$value) { + $character['characterfields'][$value['url']] = $value; + } } - // Get Seminarycharacterfields - $characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']); + // Sort Characters + global $sortorder; + $sortorder = ($this->request->getRequestMethod() == 'GET') ? $this->request->getGetParam('sortorder') : null; + $sortorder = (!is_null($sortorder)) ? $sortorder : 'xps'; + $sortMethod = 'sortCharactersBy'.ucfirst(strtolower($sortorder)); + if(method_exists($this, $sortMethod)) { + usort($characters, array($this, $sortMethod)); + } + elseif(in_array($sortorder, array_map(function($f) { return $f['title']; }, $characterfields))) { + usort($characters, function($a, $b) { + global $sortorder; + return $this->sortCharactersByField($a, $b, $sortorder); + }); + } + else { + throw new \nre\exceptions\ParamsNotValidException($sortorder); + } // Pass data to view $this->set('seminary', $seminary); $this->set('characters', $characters); $this->set('characterfields', $characterfields); - $this->set('properties', $properties); + $this->set('sortorder', $sortorder); } @@ -316,14 +322,18 @@ ); $selectedCharacters = array(); + global $sortorder; if($this->request->getRequestMethod() == 'POST') { + // Set sortorder + $sortorder = $this->request->getPostParam('sortorder'); + // Do action + $selectedCharacters = $this->request->getPostParam('characters'); if(!is_null($this->request->getPostParam('actions')) && count($this->request->getPostParam('actions')) > 0 && !is_null($this->request->getPostParam('characters')) && count($this->request->getPostParam('characters')) > 0) { $actions = $this->request->getPostParam('actions'); $action = array_keys($actions)[0]; - $selectedCharacters = $this->request->getPostParam('characters'); switch($action) { @@ -369,34 +379,47 @@ break; } } - - // Properties to show - $properties = $this->request->getPostParam('properties'); - if(!is_array($properties)) { - $properties = array(); - } } + // Get Seminarycharacterfields + $characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']); + // Get registered Characters $characters = $this->Characters->getCharactersForSeminary($seminary['id']); foreach($characters as &$character) { $character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); - $character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id'])); $character['user'] = $this->Users->getUserById($character['user_id']); - $character['characterfields'] = $this->Seminarycharacterfields->getFieldsForCharacter($character['id']); + $character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id'])); + $character['characterfields'] = array(); + foreach($this->Seminarycharacterfields->getFieldsForCharacter($character['id']) as &$value) { + $character['characterfields'][$value['url']] = $value; + } } - // Get Seminarycharacterfields - $characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']); + // Sort Characters + $sortorder = (!is_null($sortorder)) ? $sortorder : 'xps'; + $sortMethod = 'sortCharactersBy'.ucfirst(strtolower($sortorder)); + if(method_exists($this, $sortMethod)) { + usort($characters, array($this, $sortMethod)); + } + elseif(in_array($sortorder, array_map(function($f) { return $f['title']; }, $characterfields))) { + usort($characters, function($a, $b) { + global $sortorder; + return $this->sortCharactersByField($a, $b, $sortorder); + }); + } + else { + throw new \nre\exceptions\ParamsNotValidException($sortorder); + } // Pass data to view $this->set('seminary', $seminary); $this->set('characters', $characters); $this->set('characterfields', $characterfields); - $this->set('properties', $properties); $this->set('selectedCharacters', $selectedCharacters); + $this->set('sortorder', $sortorder); } @@ -425,6 +448,115 @@ } } + + /** + * Compare two Characters by their name. + * + * @param array $a Character a + * @param array $b Character b + * @return int Result of comparison + */ + private function sortCharactersByCharactername($a, $b) + { + if($a['name'] == $b['name']) { + return 0; + } + + + return ($a['name'] < $b['name']) ? -1 : 1; + } + + + /** + * Compare two Characters by their XPs. + * + * @param array $a Character a + * @param array $b Character b + * @return int Result of comparison + */ + private function sortCharactersByXps($a, $b) + { + if($a['xps'] == $b['xps']) { + return 0; + } + + + return ($a['xps'] > $b['xps']) ? -1 : 1; + } + + + /** + * Compare two Characters by their Character roles. + * + * @param array $a Character a + * @param array $b Character b + * @return int Result of comparison + */ + private function sortCharactersByRole($a, $b) + { + $roles = array('admin', 'moderator', 'user', 'guest'); + + if(in_array('admin', $a['characterroles'])) + { + if(in_array('admin', $b['characterroles'])) { + return 0; + } + return -1; + } + if(in_array('moderator', $a['characterroles'])) + { + if(in_array('admin', $b['characterroles'])) { + return 1; + } + if(in_array('moderator', $b['characterroles'])) { + return 0; + } + return -1; + } + if(in_array('user', $a['characterroles'])) + { + if(in_array('admin', $b['characterroles']) || in_array('moderator', $b['characterroles'])) { + return 1; + } + if(in_array('user', $b['characterroles'])) { + return 0; + } + return -1; + } + if(in_array('guest', $a['characterroles'])) + { + if(in_array('admin', $b['characterroles']) || in_array('moderator', $b['characterroles']) || in_array('user', $b['characterroles'])) { + return 1; + } + if(in_array('guest', $b['characterroles'])) { + return 0; + } + return -1; + } + + + return 1; + } + + + /** + * Compare two Characters by one of their Seminary fields. + * + * @param array $a Character a + * @param array $b Character b + * @param string $field Field to compare + * @return int Result of comparison + */ + private function sortCharactersByField($a, $b, $field) + { + if($a['characterfields'][$field] == $b['characterfields'][$field]) { + return 0; + } + + + return ($a['characterfields'][$field] < $b['characterfields'][$field]) ? -1 : 1; + } + } ?> 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 56e47ff2890c5326dfdf0720429c348bb523938b..139cf8009f3dfa253403e0f02427f17c9092f268 100644 GIT binary patch delta 2217 zcmdlGvmj=}7Up^u1_lOKaRvrf1_lN%C>q1i`ogZrc)E}tR=35j`93=GT+3=Au! z7#K7e7#P+{K`gp1#lRrRz`*ccih;q1fq{Wj8WIvV(hLl23=9lDP&!x|60%YCP=P#Y zh!0DpAr@3Y`K?g8OPYa!iGhKkUmD_&Nzx1qf(#4{bEF{-Uk6pUUmD`zBhrwNI0ZHT zCRE=8X@~<~Nkc-So<#=2;FV!uIKarjASS~Aj*{!L5b^u65C^@Gg~a7&Sq6qP3=9na zWf>Tx7#JAN$T2YRFfcGYmt$ZMV_;zTA_s98w>$#_F9QREtULpQC<6n7wmc*x9OWVA z2g)-rNHZ|hGeklamdZoYK(jmpgDwLD!*Y2B26+YshO6?B#PtpDl z8od=ExgcDTfkA|UfguYjU#|$#$iOf|5#o>)iV&afSA_WdtRf^t?nC)+p!)tn^@%G% z9H6emz`$D%O3g};#Ni301C+o)!w{|niQ8f&1_mVt28I?Wy<7=m@hK%p>VK#NaVV!U z1A`0$1A~k*!~>Sf5Q|)uAs&oWhNO*rWr%}Il^Gc7LHW8_nSp_Wk%6HPs$jYbB)l)Dv%()q5^T)JrzhAd9MPAiXSQvpEIjM)Cs6UJR+qEvDi!%l1pql#%^Vro={WWPD85FZ{?h2--aQ2M_r#Aj-15FZ<W~oo169wX0dbJ921K8X2E;z4dJTvMEe%MVm}@{>=Bfel zQKSaMf()p}S`CN;nxS+TRDPlcB&e4`)g97+gv<#I1_omW28PQT3=CEb3=Hg=3=D=0 z3=B@15Pp4$CL{#bYeHOnND~sbm!SN|nh=M4)`a+gNsEC&gMop8TMH7jCR&i7^@q|` zS`eQt)q-T(wOWvDeOC*TEg7{TA)urU&TaJ!8rqPcbJT_y=&KE}C_@_(GKJcZIIYuW zV9;S;U|6Wlz#zxKz;I5RfkBUff#EHbmeGOe^VWfQBt!=ig(*6alCw^Sfx(i2fuT_c zk_dN$bFph3c8TgYXGIKbRpTtMHga0lrAJ_lc97TRJ>9bQiL}_>2|38 z9$iR?PSb^y56hwAJ9QZt*i0B07!K<~e0mCM&~;r%h&<4R#OWJdNEC4BK^!1HIg(qS zw~+w?HZm|U)J&er9nV|Bz`&3W5oD;J%*bQSSU1_0XE|f(oh?`Ar5to|0R{S4Feo=`+PG)h*=9LmVnOThtt&A)ur^_fqSeyH0{&G)l s({K>*E-flfWdM zFt9K%FgQpuFerc=EXly2#=yXkCdt5{4swtr!~dU$P!zfw&aJMK)3pzONJmgDL|9Ly;83;2BbokeDY035gX_3=GT+3=Es4 z7#K7e7#OxoK`eSG#lRrRz`*cRih;q1fq_9-8WI9-(hLl23=9lmP&!r`8p8EZfeLAe z4?%oTP`5z&{ZM*}Gy?+@0|UcMX^2DSNHZ`9GB7YKlZH5a2UOijX^4Z*Nkc;73e^0^ zP<^kYArAZ^4GD>QJ{br@T!w++03!o~f(!#VN*>BW#9zuneEdlk5{G|f85qtmFfee+ zF)&CmFfd$`V_@K6U|{$t$G{-Qz`*cN4&pFTc?Jev1_lOoc?Jei1_lOGc}Pfj%R|hM zmS!vT?Ph*jq(f(@(c_N_vImp>OYj$SAbX)uK;manF7SX zMg>U7bSgm7$YceGgSRL!FqktiFdTr&|4@JgJ(D8HLG=s_Vu}zKswpxsNH8!k*eF6Y zhAKjGL!u%Bg9rlyLkU#A6ReSeVUZ%lA)6E-K0T=j@%eQ{NQk_I^1ng#aVUW-WMEKK zf;hlXiGhK)9+aAuAc-RwN=GSygN7kd2@B23=9l?Ph#NsPTkktQL3F1&; zWd;Tr1_lN-Wrzoyl_3`SD?>b(tPDvTmC6tY*DEtH)PoXRuQCGz2O|T+45)&IDv+RG zt^#q`aTSQmFy_?`;HVJ}o5Y2>F0Br2FxAwK6-g{YHKg?L0o6=Jc2DkPV&rP z#AjQz7{GPGUM)zreyat^mV(-l5HQjP=eBwV3vEcy1!_YKjMau%RG|$CnMQ3$oc3um zFzA5F1#JcfIR*xXd)f>PdJGH8O_qfUF*L#$43O%tl!1YvW-~9p z4aa0ZaYOc;)Z~)P{JhCE;ql7 -
+
- + + + + + + - +
diff --git a/views/html/characters/manage.tpl b/views/html/characters/manage.tpl index e1312d17..e340944a 100644 --- a/views/html/characters/manage.tpl +++ b/views/html/characters/manage.tpl @@ -11,14 +11,15 @@
- + + + + + + - +