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 93c1e10e..55ce9cc1 100644 Binary files a/locale/de_DE/LC_MESSAGES/The Legend of Z.mo and b/locale/de_DE/LC_MESSAGES/The Legend of Z.mo differ diff --git a/locale/de_DE/LC_MESSAGES/The Legend of Z.po b/locale/de_DE/LC_MESSAGES/The Legend of Z.po index e0e68d3e..af4cd3bb 100644 --- a/locale/de_DE/LC_MESSAGES/The Legend of Z.po +++ b/locale/de_DE/LC_MESSAGES/The Legend of Z.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: The Legend of Z\n" -"POT-Creation-Date: 2014-04-23 16:09+0100\n" -"PO-Revision-Date: 2014-04-23 16:10+0100\n" +"POT-Creation-Date: 2014-04-23 21:00+0100\n" +"PO-Revision-Date: 2014-04-23 21:01+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -119,8 +119,7 @@ msgstr "ungelöst" msgid "Error" msgstr "Fehler" -#: views/html/achievements/index.tpl:9 views/html/characters/character.tpl:31 -#: views/html/seminarymenu/index.tpl:4 +#: views/html/achievements/index.tpl:9 views/html/seminarymenu/index.tpl:4 msgid "Achievements" msgstr "Errungenschaften" @@ -169,8 +168,7 @@ msgstr "Platz" msgid "You achieved %d of %d Achievements so far" msgstr "Du hast bislang %d von insgesamt %d Errungenschaften erreicht" -#: views/html/achievements/index.tpl:59 views/html/characters/character.tpl:39 -#: views/html/seminarybar/index.tpl:28 +#: views/html/achievements/index.tpl:59 views/html/seminarybar/index.tpl:28 #, php-format msgid "achieved at: %s" msgstr "erhalten am: %s" @@ -186,7 +184,7 @@ msgstr "Spiele weiter, um diesen geheimen Erfolg freizuschalten" #: views/html/charactergroups/group.tpl:8 #: views/html/charactergroups/groupsgroup.tpl:8 #: views/html/charactergroups/index.tpl:9 -#: views/html/characters/character.tpl:51 views/html/seminarymenu/index.tpl:3 +#: views/html/characters/character.tpl:46 views/html/seminarymenu/index.tpl:3 msgid "Character Groups" msgstr "Charaktergruppen" @@ -198,14 +196,14 @@ msgstr "Mitglieder" msgid "Member" msgstr "Mitglied" -#: views/html/charactergroups/group.tpl:23 -#: views/html/characters/character.tpl:7 views/html/characters/index.tpl:7 -#: views/html/seminarymenu/index.tpl:2 views/html/users/user.tpl:15 +#: views/html/charactergroups/group.tpl:23 views/html/characters/index.tpl:7 +#: views/html/characters/manage.tpl:7 views/html/seminarymenu/index.tpl:2 +#: views/html/users/user.tpl:15 msgid "Characters" msgstr "Charaktere" #: views/html/charactergroups/group.tpl:38 -#: views/html/questgroups/questgroup.tpl:53 views/html/quests/create.tpl:7 +#: views/html/questgroups/questgroup.tpl:57 views/html/quests/create.tpl:7 #: views/html/quests/index.tpl:7 msgid "Quests" msgstr "Quests" @@ -236,21 +234,49 @@ msgid "Total progress" msgstr "Fortschritt" #: views/html/characters/character.tpl:20 +#: views/html/characters/character.tpl:63 #: views/html/characters/character.tpl:69 -#: views/html/characters/character.tpl:75 -#: views/html/characters/character.tpl:81 views/html/seminarybar/index.tpl:42 +#: views/html/characters/character.tpl:75 views/html/seminarybar/index.tpl:42 #: views/html/users/user.tpl:29 msgid "Level" msgstr "Level" -#: views/html/characters/character.tpl:63 +#: views/html/characters/character.tpl:57 msgid "Ranking" msgstr "Ranking" -#: views/html/characters/character.tpl:89 +#: views/html/characters/character.tpl:83 msgid "Topic progress" msgstr "Thematischer Fortschritt" +#: views/html/characters/index.tpl:11 views/html/characters/manage.tpl:8 +msgid "Manage" +msgstr "Verwalten" + +#: views/html/characters/manage.tpl:12 +msgid "Selection" +msgstr "Auswahl" + +#: views/html/characters/manage.tpl:26 +msgid "Add role" +msgstr "Füge Rolle hinzu" + +#: views/html/characters/manage.tpl:28 views/html/characters/manage.tpl:36 +msgid "Admin" +msgstr "Administrator" + +#: views/html/characters/manage.tpl:29 views/html/characters/manage.tpl:37 +msgid "Moderator" +msgstr "Moderator" + +#: views/html/characters/manage.tpl:31 views/html/characters/manage.tpl:39 +msgid "User" +msgstr "Benutzer" + +#: views/html/characters/manage.tpl:34 +msgid "Remove role" +msgstr "Entferne Rolle" + #: views/html/characters/register.tpl:7 msgid "Create Character" msgstr "Charakter erstellen" @@ -713,9 +739,6 @@ msgstr "Rollen" #~ msgid "Group Leader" #~ msgstr "Gruppenleiter" -#~ msgid "User" -#~ msgstr "Benutzer" - #~ msgid "as" #~ msgstr "als" diff --git a/models/CharacterrolesModel.inc b/models/CharacterrolesModel.inc index 013ff749..752d4a0a 100644 --- a/models/CharacterrolesModel.inc +++ b/models/CharacterrolesModel.inc @@ -52,6 +52,49 @@ ); } + + /** + * Add a role to a Character. + * + * @param int $characterId ID of Character to add role to + * @param string $characterrole Role to add + */ + public function addCharacterroleToCharacter($characterId, $characterrole) + { + $this->db->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) : ?> + + +