From a09254b8f2f8bc725aedf596f13d64dc101c692f Mon Sep 17 00:00:00 2001 From: coderkun Date: Wed, 23 Apr 2014 21:02:30 +0200 Subject: [PATCH] add page to manage Characters --- configs/AppConfig.inc | 2 +- controllers/CharactersController.inc | 86 +++++++++++++++++++- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 9448 -> 9727 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 59 ++++++++++---- models/CharacterrolesModel.inc | 43 ++++++++++ views/html/characters/index.tpl | 6 ++ views/html/characters/manage.tpl | 41 ++++++++++ 7 files changed, 216 insertions(+), 21 deletions(-) create mode 100644 views/html/characters/manage.tpl diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 28f4c00f..3575314e 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -155,7 +155,7 @@ array('^([^/]+)/([^/]+)/?$', 'questgropus/questgroup/$1/$2', true), // z/// ⇒ z/quests/quest/// array('^([^/]+)/([^/]+)/([^/]+)/?$', 'quests/quest/$1/$2/3', true)*/ - array('characters/(?!(index|character|register))', 'characters/index/$1', true), + array('characters/(?!(index|character|register|manage))', 'characters/index/$1', true), array('charactergroups/(?!(index|groupsgroup|group))', 'charactergroups/index/$1', true), array('charactergroupsquests/(?!(quest))', 'charactergroupsquests/quest/$1', true), array('media/(.*)', 'media/$1?layout=binary', false), diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index 37038999..2d94c75a 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -39,7 +39,8 @@ public $permissions = array( 'index' => array('admin', 'moderator'), 'character' => array('admin', 'moderator', 'user'), - 'register' => array('admin', 'moderator', 'user') + 'register' => array('admin', 'moderator', 'user'), + 'manage' => array('admin', 'moderator') ); /** * User seminary permissions @@ -48,7 +49,8 @@ */ public $seminaryPermissions = array( 'index' => array('admin', 'moderator'), - 'character' => array('admin', 'moderator', 'user') + 'character' => array('admin', 'moderator', 'user'), + 'manage' => array('admin', 'moderator') ); @@ -251,6 +253,86 @@ } + /** + * Action: manage. + * + * Manage Characters. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of a Seminary + */ + public function manage($seminaryUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Do action + if($this->request->getRequestMethod() == 'POST' && !empty($this->request->getPostParam('actions')) && !empty($this->request->getPostParam('characters'))) + { + $actions = $this->request->getPostParam('actions'); + $action = array_keys($actions)[0]; + $selectedCharacters = $this->request->getPostParam('characters'); + + switch($action) + { + // Add/remove role to/from Characters + case 'addrole': + case 'removerole': + // Determine role and check permissions + $role = null; + switch($actions[$action]) + { + case _('Admin'): + if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) <= 0 || !in_array('admin', \hhu\z\controllers\SeminaryController::$character['characterroles'])) { + throw new \nre\exceptions\AccessDeniedException(); + } + $role = 'admin'; + break; + case _('Moderator'): + if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) <= 0 || !in_array('admin', \hhu\z\controllers\SeminaryController::$character['characterroles'])) { + throw new \nre\exceptions\AccessDeniedException(); + } + $role = 'moderator'; + break; + case _('User'): + if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) <= 0 || count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) <= 0) { + throw new \nre\exceptions\AccessDeniedException(); + } + $role = 'user'; + break; + } + + // Add role + if($action == 'addrole') { + foreach($selectedCharacters as &$characterId) { + $this->Characterroles->addCharacterroleToCharacter($characterId, $role); + } + } + // Remove role + else { + foreach($selectedCharacters as &$characterId) { + $this->Characterroles->removeCharacterroleFromCharacter($characterId, $role); + } + } + break; + } + } + + // 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'])); + } + + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('characters', $characters); + } + + /** 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 93c1e10e148cb066710f15f592aa82b1db15e19c..55ce9cc15849ae427033cdb41394c67eb00df3b2 100644 GIT binary patch delta 3434 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 delta 3182 zcmezG{lc^Uo)F7a1_lO(9tH*m83qQ18WskI{R|8YcQ`6x}esMD}@GvkisPQl`2r)1)81pbN@G>wkxbZMB2rw`(gz!Mrr}8i`s4*}w z)bcPe@G&qjEa72bkY!+C*v!MgpvAyY&v224fkBLcf#DBCfI*lSVu2km1A_KPcE!3+k5U_J&0ZUzR1WGJ1_2k}ug9|Hp?0|P@R zAH)HZ`4|{j85kJm@j*gt3Dkmvd<+co3=9mH_!t-@7#J8n@i8z+GB7Z3^F!3B@QE>yfkkf9zNv<-p~mv;$5EbJGAxO}=GB*+#BLZV`=AjG2GQ2L-C zBu}U|_Hmf{14cK^#^kR1aaa2|?m`k`N?l z<_JL?vQ`M<^Q};gH=+EOLJ*(x3PT)jB+S5|z`(#@E(}TS5yA`%>I@7F^}-MbFBgU+ z;1u4KzL-`M+AP)N}1qnfRX$A%!Q2v*chWJQL8e)K% zG(@47G$hUvs-+nilt4u`lwL0l@xUc%NTPcw4RN5L3?#&4Wgt;wECcbF zr3?cD2O|T6iwpxpJ*Xt}m4yUNuq?#FVp)iTs$?OFrAro~ak4DLA@gJ*X=4{ue7`It z&QHlg9Cj0`?~g1b3R&gAWj%uel=hZ`c(hE8p&nfJcgaD5dZ8S|2P@?uiRGdkBsIT= z(xUPZpV-So;?z|h;?rVzNYvHKLmb{C5AnzxD7{!7;*nKQ{hQ?>_U)9fhiE(~4+-*f z@{l;Y1J(EuO8=0D1o3})NJxn(KpbMG00|iz1qKE~1_lOq1qKEy1_p*o1xUfPMFHZV z;|h?dyRHCbDK@L=DC^0bTfod%%t*8uf zSb#Fb2a(EqYRNW6{NN(X!frN~Z3WP7K0`a-J3dCGn zh67#KPj zAiw$42mEQDDD{`X(1BSDq?_y9!Sc8fq|hF)Q$iJJ4k?mfgu)@ z|3T~k1_p*I1_p*U21xvY#6Z}Gfq}t^0TO2*z9oo2!l1+ks&YXk989 z28L1wNYM>yc7fD1gBm3a3=9n*hg35#FvK%3FqknwQnnwc7Gr=UK2Uou3Zw(nTw-8g zNQbh+LG3#R1_l!bNUneigPUUoFb)GG{y}X;kPxWt7s$ZC;KjhekifvekO2||wf{hL z7Xt%>H3I`f5CbF?gHon9NCF9i8krz&C<7$nf!JXn0*bR3ASoSG3nnozFyt^m>U^j) zLmrF)YUDC7FgP+WFmyB2GcdR@Ffe2@Ffe!`DR5z6U`SzLUdb->query( + 'INSERT IGNORE INTO characters_characterroles '. + '(character_id, characterrole_id) '. + 'SELECT ?, id '. + 'FROM characterroles '. + 'WHERE name = ?', + 'is', + $characterId, + $characterrole + ); + } + + + /** + * Remove a role from a Character. + * + * @param int $characterId ID of Character to remove role from + * @param string $characterrole Role to remove + */ + public function removeCharacterroleFromCharacter($characterId, $characterrole) + { + $this->db->query( + 'DELETE FROM characters_characterroles '. + 'WHERE character_id = ? AND characterrole_id = ('. + 'SELECT id '. + 'FROM characterroles '. + 'WHERE name = ?'. + ')', + 'is', + $characterId, + $characterrole + ); + } + } ?> diff --git a/views/html/characters/index.tpl b/views/html/characters/index.tpl index 91833a0e..a0c10339 100644 --- a/views/html/characters/index.tpl +++ b/views/html/characters/index.tpl @@ -6,6 +6,12 @@

+ 0) : ?> + + +