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 zcmXZcTWnNC9LMq5ZZEs+ZZDv0DO+7zd!ZFuRxIf)5v31Wh&7<3q=pAsX-zG$?TRAp zu`Qw&wb7%%0~&mgf~HEXF=>q9A`hfNh@z=JAQ)mGq_v4i!UKZeU(alI&u3=NnVJ9m zXU-mNJJ@#g8^4oojA@D*lYviITW}%uXK)dA-~#N!9DECFa6dNUIjq7+zA@F!6GRHUh!Us?AHx!CM-BWQD)J9enfL_#cm$W>7;2(vWNb5s z2@Edv7Sw>5)Yn?qqcXe6u?=0Q2vevDcG&tG)?rMeeFPQA2bhNkP^tV9)&CeO;8Unf zOra+J9o6p=D!^-~OgQN=uMolGK4TW6wq&}{YrlvJ=qhS2uj3iKgDldVxyP6=Uctrq zFDkImy_^Ru#JjN)wY95J<3EMO;FwkldN74L14FnRN0G1jm5UD74QolM3ZC9=En2sWBT-d)tG2%`WRGYT_x> z>HiZIXpr==dnSfjKrL#eO{gtsMV*apIG=HJl)@nj0UxK_KCq8hfNYzOQGtDriu@ER zg}{P#L?0dOlq41+)m&FNRrIK|88rA8NoM>#)85J}T9RP|ux2W#%+Kgy*pivsldvd=yo8dMPLaU!fvCiQ3zr zZT&JTkn0%0H1fz;CWK1uO5|&vwC+Hy>@%#wG2~d83m8XVr59ik@>V#eoPtuf8a3cL z)I{y5%)Er!(|&vaKSlmy%vpR8XRR@As$Vl|AsbLzxCPU&A8T;{bqK$kzt8@kr;wmw z7S%Dn+&jJ1);iSdvj#Q6CR~8eS-WietEj^~Xnhld)Zam6bT8`vVbr!yV&+O3exMM> zDbxhh7{W`aJ)J>qL4f7ze$;IZRYe9U=`+r6r~6T8bEKEjRyFZ)Twl1}*Y7rlM|~;x zukeVk&rL-ftz-V9h3cH_QOylzFU@Ycj7}g`eNc z{9c=g+X$rcJ%a49Lb;bXCzkCC2HNRv0|?@F%tVP+55wJy1VDTp7We@p6C1h zKF_%yZ64b^cG~Zx8Dkp5#>n-UgH4!=TQG>dxCr}kF%Dujeuxj@C%6V@u>wo-jj6;Y z)cyUKiHEJn@Gj0z<{QVP(>P1Va{L1Iz*T$x7p~wuvdoxNY`|h{#3*jX7!INmID-o8 zto3UoCi4^O`5Tylw{8EOWsWyNxWJ339yQ@pxDq>21HX@|#4%JQPM{x?ScVg*i7p{y zn>nn;+=!RZIt+0BytNq@D(u*fUQ~oS*933a^MlqSm_q*ts6dY55*$U9@>A6Flc<2F zQI(iMO+1Tw?l)9`w@{UEvJ1UN7|;1AFKS6H6?y&FPyyXUt>HX=gTZ@@AxZN+X5kH7 zivOYl%e&W@5XLYMYf($P9yR_ZBnHQ{(a?o{EwxRaME4WZ`bX3AY8W}!zxxHb8SAc4pEm?;O{Kb{jKb6LQI<%P%AY++PREAR+ z#mm+pC(5i6m2o|4;tipQ4G&R_+8hHNWy9gA_v173jD$XnruerhOh$1s5IQFZ-XSZ9M9rF#k&Dk!0`QE4R{|5Rw zx;geFLyPM(+^54;={w?WiT0fx?w)W_D4r -
+
- + + + + + + - +
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 @@
- + + + + + + - +