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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 + '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) : ?> + + +