diff --git a/agents/intermediate/CharactersAgent.inc b/agents/intermediate/CharactersAgent.inc new file mode 100644 index 00000000..25102198 --- /dev/null +++ b/agents/intermediate/CharactersAgent.inc @@ -0,0 +1,43 @@ + + * @copyright 2014 Heinrich-Heine-Universität Düsseldorf + * @license http://www.gnu.org/licenses/gpl.html + * @link https://bitbucket.org/coderkun/the-legend-of-z + */ + + namespace hhu\z\agents\intermediate; + + + /** + * Agent to list registered Characters and their data. + * + * @author Oliver Hanraths + */ + class CharactersAgent extends \nre\agents\IntermediateAgent + { + + + + + /** + * Action: index. + */ + public function index(\nre\core\Request $request, \nre\core\Response $response) + { + } + + + /** + * Action: character. + */ + public function character(\nre\core\Request $request, \nre\core\Response $response) + { + } + + } + +?> diff --git a/app/controllers/ToplevelController.inc b/app/controllers/ToplevelController.inc index 74f63667..544748a9 100644 --- a/app/controllers/ToplevelController.inc +++ b/app/controllers/ToplevelController.inc @@ -24,13 +24,23 @@ * * @var array */ - public $models = array('users', 'userroles'); + public $models = array('users', 'userroles', 'seminaries', 'characters'); /** * Current user * * @var array */ public static $user = null; + /** + * + */ + public static $seminary = null; + /** + * Character of current user and Seminary + * + * @var array + */ + public static $character = null; @@ -67,6 +77,15 @@ // Get userdata try { static::$user = $this->Users->getUserById($this->Auth->getUserId()); + + // Character + $controller = $this->agent->getIntermediateAgent()->controller; + if(in_array(\hhu\z\controllers\SeminaryRoleController::class, class_parents($controller))) + { + $seminaryUrl = $this->request->getParam(3); + static::$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + static::$character = $this->Characters->getCharacterForUserAndSeminary(static::$user['id'], static::$seminary['id']); + } } catch(\nre\exceptions\IdNotFoundException $e) { } @@ -76,6 +95,8 @@ // Set userdata $this->set('loggedUser', static::$user); + $this->set('loggedSeminary', static::$seminary); + $this->set('loggedCharacter', static::$character); } diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 4dd71853..8c388dce 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -82,6 +82,7 @@ array('^([^/]+)/([^/]+)/?$', 'questgropus/questgroup/$1/$2', true), // z/// ⇒ z/quests/quest/// array('^([^/]+)/([^/]+)/([^/]+)/?$', 'quests/quest/$1/$2/3', true)*/ + array('characters/(?!(index|character))', '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), @@ -100,6 +101,7 @@ array('users/([^/]+)/(.*)', 'users/$2/$1', true), array('seminaries/seminary/(.*)', 'seminaries/$1', false), //array('seminaries/seminary/(.*)', '$1', false) + array('characters/index/(.*)', 'characters/$1', true), array('charactergroup/index/(.*)', 'charactergroup/$1', true), array('charactergroupsquests/quest/(.*)', 'charactergroupsquests/$1', true), array('media/index/(.*)', 'media/$1', true) diff --git a/controllers/CharactergroupsController.inc b/controllers/CharactergroupsController.inc index e98e3dd1..1028d28c 100644 --- a/controllers/CharactergroupsController.inc +++ b/controllers/CharactergroupsController.inc @@ -123,6 +123,9 @@ // Get Character group $group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl); + // Get Characters + $characters = $this->Characters->getCharactersForGroup($group['id']); + // Get Character groups Quests $quests = $this->Charactergroupsquests->getQuestsForGroup($group['id']); @@ -131,6 +134,7 @@ $this->set('seminary', $seminary); $this->set('groupsgroup', $groupsgroup); $this->set('group', $group); + $this->set('characters', $characters); $this->set('quests', $quests); } diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc new file mode 100644 index 00000000..27c4edcb --- /dev/null +++ b/controllers/CharactersController.inc @@ -0,0 +1,97 @@ + + * @copyright 2014 Heinrich-Heine-Universität Düsseldorf + * @license http://www.gnu.org/licenses/gpl.html + * @link https://bitbucket.org/coderkun/the-legend-of-z + */ + + namespace hhu\z\controllers; + + + /** + * Controller of the Agent to list registered users and their data. + * + * @author Oliver Hanraths + */ + class CharactersController extends \hhu\z\Controller + { + /** + * User permissions + * + * @var array + */ + public $permissions = array( + 'index' => array('admin', 'moderator'), + 'character' => array('admin', 'moderator', 'user') + ); + /** + * Required models + * + * @var array + */ + public $models = array('seminaries', 'characters', 'users', 'charactergroups'); + + + + + /** + * Action: index. + * + * List registered Characters for a Seminary + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of a Seminary + */ + public function index($seminaryUrl) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get registered Characters + $characters = $this->Characters->getCharactersForSeminary($seminary['id']); + + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('characters', $characters); + } + + + /** + * Action: character. + * + * Show a Charater and its details. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of a Seminary + * @param string $characterUrl URL-name of a Charater + */ + public function character($seminaryUrl, $characterUrl) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Character + $character = $this->Characters->getCharacterByUrl($seminary['id'], $characterUrl); + + // Get User + $user = $this->Users->getUserById($character['user_id']); + + // Get Character groups + $groups = $this->Charactergroups->getGroupsForCharacter($character['id']); + + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('character', $character); + $this->set('user', $user); + $this->set('groups', $groups); + } + + } + +?> diff --git a/controllers/HtmlController.inc b/controllers/HtmlController.inc index d7660f5a..20795d5b 100644 --- a/controllers/HtmlController.inc +++ b/controllers/HtmlController.inc @@ -50,6 +50,8 @@ // Set userdata $this->set('loggedUser', static::$user); + $this->set('loggedSeminary', static::$seminary); + $this->set('loggedCharacter', static::$character); } } diff --git a/models/CharactergroupsModel.inc b/models/CharactergroupsModel.inc index 4fc32b80..ce6e8b61 100644 --- a/models/CharactergroupsModel.inc +++ b/models/CharactergroupsModel.inc @@ -88,8 +88,8 @@ public function getGroupsForGroupsgroup($groupsgroupId) { return $this->db->query( - 'SELECT id, name, url '. - 'FROM charactergroups '. + 'SELECT id, name, url, xps '. + 'FROM v_charactergroups '. 'WHERE charactergroupsgroup_id = ?', 'i', $groupsgroupId @@ -97,6 +97,26 @@ } + /** + * Get Character groups for a Character. + * + * @param int $characterId ID of the Character + * @return array Character groups + */ + public function getGroupsForCharacter($characterId) + { + return $this->db->query( + 'SELECT charactergroups.id, charactergroups.charactergroupsgroup_id, charactergroups.name, charactergroups.url, charactergroups.xps, charactergroupsgroups.id AS charactergroupsgroup_id, charactergroupsgroups.name AS charactergroupsgroup_name, charactergroupsgroups.url AS charactergroupsgroup_url '. + 'FROM characters_charactergroups '. + 'LEFT JOIN v_charactergroups AS charactergroups ON charactergroups.id = characters_charactergroups.charactergroup_id '. + 'LEFT JOIN charactergroupsgroups ON charactergroupsgroups.id = charactergroups.charactergroupsgroup_id '. + 'WHERE characters_charactergroups.character_id = ?', + 'i', + $characterId + ); + } + + /** * Get a Character group by its URL. * @@ -108,8 +128,8 @@ public function getGroupByUrl($groupsgroupId, $groupUrl) { $data = $this->db->query( - 'SELECT id, name, url '. - 'FROM charactergroups '. + 'SELECT id, name, url, xps '. + 'FROM v_charactergroups '. 'WHERE charactergroupsgroup_id = ? AND url = ?', 'is', $groupsgroupId, $groupUrl diff --git a/models/CharactersModel.inc b/models/CharactersModel.inc index c62f294c..0f637d19 100644 --- a/models/CharactersModel.inc +++ b/models/CharactersModel.inc @@ -43,8 +43,8 @@ public function getCharactersForUser($userId) { return $this->db->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. - 'FROM characters '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. + 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'WHERE user_id = ?', @@ -54,6 +54,46 @@ } + /** + * Get Characters for a Seminary. + * + * @param int $seminaryId ID of the Seminary + * @return array Characters + */ + public function getCharactersForSeminary($seminaryId) + { + return $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. + 'FROM v_characters AS characters '. + 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. + 'WHERE seminaries.id = ?', + 'i', + $seminaryId + ); + } + + + /** + * Get Characters for a Character group. + * + * @param int $groupId ID of the Character group + * @return array Characters + */ + public function getCharactersForGroup($groupId) + { + return $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '. + 'FROM v_characters AS characters '. + 'LEFT JOIN characters_charactergroups ON characters_charactergroups.character_id = characters.id '. + 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'WHERE characters_charactergroups.charactergroup_id = ?', + 'i', + $groupId + ); + } + + /** * Get the character of a user for a Seminary. * @@ -65,8 +105,8 @@ public function getCharacterForUserAndSeminary($userId, $seminaryId) { $data = $this->db->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '. - 'FROM characters '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '. + 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'WHERE characters.user_id = ? AND charactertypes.seminary_id = ?', 'ii', @@ -80,6 +120,33 @@ return $data[0]; } + + /** + * Get a Character by its Url. + * + * @throws IdNotFoundException + * @param int $seminaryId ID of the Seminary + * @param string $characterUrl URL-name of the Character + * @return array Character data + */ + public function getCharacterByUrl($seminaryId, $characterUrl) + { + $data = $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '. + 'FROM v_characters AS characters '. + 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'WHERE charactertypes.seminary_id = ? AND characters.url = ?', + 'is', + $seminaryId, $characterUrl + ); + if(empty($data)) { + throw new \nre\exceptions\IdNotFoundException($characterUrl); + } + + + return $data[0]; + } + } ?> diff --git a/views/html/charactergroups/group.tpl b/views/html/charactergroups/group.tpl index dc3932ef..f46b24b4 100644 --- a/views/html/charactergroups/group.tpl +++ b/views/html/charactergroups/group.tpl @@ -4,6 +4,19 @@

+
+ XPs: +
+ +
+

+
    + +
  • ( XPs)
  • + +
+
+

diff --git a/views/html/charactergroups/groupsgroup.tpl b/views/html/charactergroups/groupsgroup.tpl index 9a24a91b..3108b483 100644 --- a/views/html/charactergroups/groupsgroup.tpl +++ b/views/html/charactergroups/groupsgroup.tpl @@ -5,7 +5,7 @@ diff --git a/views/html/characters/character.tpl b/views/html/characters/character.tpl new file mode 100644 index 00000000..aa8bdd78 --- /dev/null +++ b/views/html/characters/character.tpl @@ -0,0 +1,19 @@ +

+

+

+ +
+

+ XPs:
+ :
+

+
+ +
+

+
    + +
  • ( XPs)
  • + +
+
diff --git a/views/html/characters/index.tpl b/views/html/characters/index.tpl new file mode 100644 index 00000000..362d60c1 --- /dev/null +++ b/views/html/characters/index.tpl @@ -0,0 +1,8 @@ +

+

+ +
    + +
  • ( XPs)
  • + +
diff --git a/views/html/html.tpl b/views/html/html.tpl index 0eadc348..ad8f4648 100644 --- a/views/html/html.tpl +++ b/views/html/html.tpl @@ -17,6 +17,9 @@
+ + ( XPs) +
diff --git a/views/html/seminaries/seminary.tpl b/views/html/seminaries/seminary.tpl index 3e93b154..3ff9b9c0 100644 --- a/views/html/seminaries/seminary.tpl +++ b/views/html/seminaries/seminary.tpl @@ -5,6 +5,7 @@
  • diff --git a/views/html/users/user.tpl b/views/html/users/user.tpl index 2c081f2d..9be97544 100644 --- a/views/html/users/user.tpl +++ b/views/html/users/user.tpl @@ -11,7 +11,7 @@

      -
    • ()
    • +
    • ( XPs) ()