From 591ce2690bcb3283b894df1dc76417dd9e28b9b1 Mon Sep 17 00:00:00 2001 From: coderkun Date: Wed, 9 Jul 2014 13:02:54 +0200 Subject: [PATCH] implement CRUD for XP-levels --- agents/intermediate/XplevelsAgent.inc | 35 ++++ configs/AppConfig.inc | 8 + controllers/XplevelsController.inc | 188 ++++++++++++++++++++ locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 22065 -> 22187 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 35 +++- models/XplevelsModel.inc | 137 ++++++++++++++ views/html/seminaries/seminary.tpl | 4 +- views/html/xplevels/manage.tpl | 84 +++++++++ 8 files changed, 480 insertions(+), 11 deletions(-) create mode 100644 agents/intermediate/XplevelsAgent.inc create mode 100644 controllers/XplevelsController.inc create mode 100644 views/html/xplevels/manage.tpl diff --git a/agents/intermediate/XplevelsAgent.inc b/agents/intermediate/XplevelsAgent.inc new file mode 100644 index 00000000..087cbade --- /dev/null +++ b/agents/intermediate/XplevelsAgent.inc @@ -0,0 +1,35 @@ + + * @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 handle XP-levels of a Seminary. + * + * @author Oliver Hanraths + */ + class XplevelsAgent extends \nre\agents\IntermediateAgent + { + + + + + /** + * Action: index. + */ + public function index(\nre\core\Request $request, \nre\core\Response $response) + { + } + + } + +?> diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index a5eecdba..bd20e1d4 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -238,6 +238,7 @@ array('^users/(?!(index|login|register|logout|manage|create|edit|delete))/?', 'users/user/$1', true), array('^seminaries/([^/]+)/(edit|delete)/?$', 'seminaries/$2/$1', true), array('^seminaries/(?!(index|create|edit|delete|calculatexps))/?', 'seminaries/seminary/$1', true), + array('^xplevels/([^/]+)/(manage)/?$', 'xplevels/$2/$1', true), array('^questgroupshierarchy/([^/]+)/create/?$', 'questgroupshierarchy/create/$1', true), array('^questgroupshierarchy/([^/]+)/([^/]+)/(edit|delete|moveup|movedown)/?$', 'questgroupshierarchy/$3/$1/$2', true), array('^questgroups/([^/]+)/create/?$', 'questgroups/create/$1', true), @@ -254,6 +255,9 @@ array('^characters/([^/]+)/all/?$', 'characters/index/$1/all', true), array('^characters/([^/]+)/([^/]+)/(edit|delete)/?$', 'characters/$3/$1/$2', true), array('^characters/([^/]+)/(?!(index|register|manage))/?', 'characters/character/$1/$2', true), + array('^charactertypes/([^/]+)/?$', 'charactertypes/index/$1', true), + array('^charactertypes/([^/]+)/create/?$', 'charactertypes/create/$1', true), + array('^charactertypes/([^/]+)/([^/]+)/(edit|delete)/?$', 'charactertypes/$3/$1/$2', true), array('^charactergroups/([^/]+)/?$', 'charactergroups/index/$1', true), array('^charactergroups/([^/]+)/(create)/?$', 'charactergroups/creategroupsgroup/$1/$2', true), array('^charactergroups/([^/]+)/([^/]+)/?$', 'charactergroups/groupsgroup/$1/$2', true), @@ -287,6 +291,7 @@ array('^users/user/(.*)$', 'users/$1', true), array('^users/([^/]+)/(.*)$', 'users/$2/$1', true), array('^seminaries/seminary/(.*)$', 'seminaries/$1', false), + array('^xplevels/(manage)/(.*)$', 'xplevels/$2/$1', false), array('^questgroupshierarchy/create/(.*)$', 'questgroupshierarchy/$1/create', true), array('^questgroupshierarchy/([^/]+)/(.*)$', 'questgroupshierarchy/$2/$1', true), array('^questgroups/create/(.*)$', 'questgroups/$1/create', true), @@ -300,6 +305,9 @@ array('^characters/(index|character)/(.*)$', 'characters/$2', true), array('^characters/(register|manage)/([^/]+)$', 'characters/$2/$1', true), array('^characters/(edit|delete)/([^/]+)/([^/]+)$', 'characters/$2/$3/$1', true), + array('^charactertypes/index/([^/]+)$', 'charactertypes/$1', true), + array('^charactertypes/create/([^/]+)$', 'charactertypes/$1/create', true), + array('^charactertypes/(edit|delete)/([^/]+)/([^/]+)$', 'charactertypes/$2/$3/$1', true), array('^charactergroups/index/([^/]+)$', 'charactergroups/$1', true), array('^charactergroups/creategroupsgroup/([^/]+)$', 'charactergroups/$1/create', true), array('^charactergroups/groupsgroup/([^/]+)/([^/]+)$', 'charactergroups/$1/$2', true), diff --git a/controllers/XplevelsController.inc b/controllers/XplevelsController.inc new file mode 100644 index 00000000..1f21d697 --- /dev/null +++ b/controllers/XplevelsController.inc @@ -0,0 +1,188 @@ + + * @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 XplevelsAgent to handle XP-levels of a + * Seminary. + * + * @author Oliver Hanraths + */ + class XplevelsController extends \hhu\z\controllers\SeminaryController + { + /** + * Required components + * + * @var array + */ + public $components = array('validation'); + /** + * Required models + * + * @var array + */ + public $models = array('xplevels'); + /** + * User permissions + * + * @var array + */ + public $permissions = array( + 'manage' => array('admin', 'moderator', 'user') + ); + + + + + /** + * Action: manage. + * + * Manage XP-levels. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of a Seminary + */ + public function manage($seminaryUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Check permissions + if( + (is_null(self::$character) && count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0) && + $seminary['created_user_id'] != self::$user['id'] + ) { + throw new \nre\exceptions\AccessDeniedException(); + } + + // Get XP-levels + $xplevels = $this->Xplevels->getXPLevelsForSeminary($seminary['id']); + + // Values + $xplevelsValues = array(); + foreach($xplevels as &$xplevel) { + $xplevelsValues[$xplevel['id']] = $xplevel; + } + $deletes = array(); + $validations = array( + 'edit' => true, + 'create' => true + ); + + // Edit + $action = null; + if($this->request->getRequestMethod() == 'POST') + { + // Get params + $xplevelsValues = $this->request->getPostParam('xplevels'); + $deletes = $this->request->getPostParam('deletes'); + + // Edit and delete XP-levels + if(!is_null($this->request->getPostParam('edit'))) + { + $action = 'edit'; + + // Validate params + if(!is_array($deletes)) { + $deletes = array(); + } + foreach($xplevels as &$xplevel) + { + if(array_key_exists($xplevel['id'], $deletes)) { + continue; + } + + $xplevelValidation = $this->Validation->validateParams($xplevelsValues[$xplevel['id']], array('xps')); + if($xplevelValidation !== true) + { + if(!is_array($validations['edit'])) { + $validations['edit'] = array(); + } + if(!array_key_exists($xplevel['id'], $validations['edit']) || !is_array($validations['edit'][$xplevel['id']])) { + $validations['edit'][$xplevel['id']] = array(); + } + $validations['edit'][$xplevel['id']] = $this->Validation->addValidationResults($validations['edit'][$xplevel['id']], 'xps', $xplevelValidation); + } + } + + // Edit and delete + if($validations['edit'] === true) + { + foreach($xplevels as &$xplevel) + { + // Delete + if(array_key_exists($xplevel['id'], $deletes)) { + $this->Xplevels->deleteXPLevel($xplevel); + } + // Edit + elseif(array_key_exists($xplevel['id'], $xplevelsValues)) + { + $this->Xplevels->editXPLevel( + $xplevel['id'], + $xplevelsValues[$xplevel['id']]['xps'] + ); + } + } + + // Redirect + $this->redirect($this->linker->link(null, 3)); + } + } + + // Create XP-level + if(!is_null($this->request->getPostParam('create'))) + { + $action = 'create'; + + // Get params and validate them + $xplevel = $xplevelsValues['new']; + $validations[$action] = $this->Validation->validateParams($xplevel, array('xps')); + + // Create + if($validations[$action] === true) + { + $this->Xplevels->createXPLevel( + $this->Auth->getUserId(), + $seminary['id'], + $xplevel['xps'] + ); + + // Redirect + $this->redirect($this->linker->link(null, 3)); + } + } + } + + // Get validation settings + $validationSettings = array( + 'xps' => \nre\configs\AppConfig::$validation['xps'] + ); + + + // Set titile + $this->addTitleLocalized('Manage XP-levels'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('xplevels', $xplevels); + $this->set('xplevelsValues', $xplevelsValues); + $this->set('deletes', $deletes); + $this->set('action', $action); + $this->set('validations', $validations); + $this->set('validationSettings', $validationSettings); + } + + } + +?> 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 a87a3de3a71655ec0a35abd685c5c73b83be7492..a1cddf7deed081a6f52376b5bf69740d334b1747 100644 GIT binary patch delta 7267 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 delta 7184 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 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 77dedfe8..66f372da 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-07-09 11:21+0100\n" -"PO-Revision-Date: 2014-07-09 11:29+0100\n" +"POT-Creation-Date: 2014-07-09 13:01+0100\n" +"PO-Revision-Date: 2014-07-09 13:02+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -387,6 +387,7 @@ msgstr "Achievement" #: views/html/questgroupshierarchy/delete.tpl:14 #: views/html/quests/delete.tpl:11 views/html/quests/edittexts.tpl:53 #: views/html/seminaries/delete.tpl:13 views/html/users/delete.tpl:11 +#: views/html/xplevels/manage.tpl:45 msgid "delete" msgstr "löschen" @@ -400,6 +401,7 @@ msgstr "Neue Bedingung" #: views/html/charactergroupsquests/manage.tpl:66 #: views/html/charactertypes/manage.tpl:52 views/html/library/edit.tpl:46 #: views/html/library/edit.tpl:86 views/html/users/edit.tpl:105 +#: views/html/xplevels/manage.tpl:49 msgid "save" msgstr "speichern" @@ -839,7 +841,7 @@ msgstr "Motto" #: views/html/library/edit.tpl:124 views/html/questgroups/create.tpl:76 #: views/html/questgroupshierarchy/create.tpl:63 #: views/html/quests/create.tpl:108 views/html/seminaries/create.tpl:75 -#: views/html/users/create.tpl:96 +#: views/html/users/create.tpl:96 views/html/xplevels/manage.tpl:83 msgid "create" msgstr "erstellen" @@ -925,7 +927,8 @@ msgstr "%squests" #: views/html/characters/manage.tpl:17 #: views/html/questgroups/questgroup.tpl:62 views/html/quests/create.tpl:72 #: views/html/quests/create.tpl:73 views/html/quests/edit.tpl:75 -#: views/html/quests/edit.tpl:76 +#: views/html/quests/edit.tpl:76 views/html/xplevels/manage.tpl:43 +#: views/html/xplevels/manage.tpl:81 msgid "XPs" msgstr "XP" @@ -968,6 +971,7 @@ msgstr "Neue %s-Quest" #: views/html/charactergroupsquests/create.tpl:47 #: views/html/charactergroupsquests/edit.tpl:47 #: views/html/quests/create.tpl:43 views/html/quests/edit.tpl:43 +#: views/html/xplevels/manage.tpl:26 views/html/xplevels/manage.tpl:63 #, php-format msgid "XPs not set" msgstr "XP nicht angegeben" @@ -975,12 +979,14 @@ msgstr "XP nicht angegeben" #: views/html/charactergroupsquests/create.tpl:49 #: views/html/charactergroupsquests/edit.tpl:49 #: views/html/quests/create.tpl:45 views/html/quests/edit.tpl:45 +#: views/html/xplevels/manage.tpl:28 views/html/xplevels/manage.tpl:65 msgid "XPs contain illegal characters" msgstr "Die XP-Angabe enthält ungültige Zeichen" #: views/html/charactergroupsquests/create.tpl:51 #: views/html/charactergroupsquests/edit.tpl:51 #: views/html/quests/create.tpl:47 views/html/quests/edit.tpl:47 +#: views/html/xplevels/manage.tpl:30 views/html/xplevels/manage.tpl:67 msgid "XPs invalid" msgstr "Die XP-Angabe ist ungültig" @@ -1075,7 +1081,7 @@ msgstr "Fortschritt" #: views/html/characters/character.tpl:77 #: views/html/characters/character.tpl:83 #: views/html/characters/character.tpl:89 views/html/seminarybar/index.tpl:43 -#: views/html/users/user.tpl:41 +#: views/html/users/user.tpl:41 views/html/xplevels/manage.tpl:41 msgid "Level" msgstr "Level" @@ -1207,7 +1213,7 @@ msgid "Please choose an avatar" msgstr "Bitte wähle einen Avatar aus" #: views/html/charactertypes/manage.tpl:9 views/html/seminaries/index.tpl:38 -#: views/html/seminaries/seminary.tpl:14 +#: views/html/seminaries/seminary.tpl:15 msgid "Manage Charactertypes" msgstr "Charakterrassen verwalten" @@ -1663,9 +1669,9 @@ msgstr "Erstelle einen Charakter" msgid "Your Character “%s” has not been activated yet" msgstr "Dein Charakter „%s“ wurde noch nicht aktiviert" -#: views/html/seminaries/seminary.tpl:15 -msgid "Manage Questgroups" -msgstr "Questgruppen verwalten" +#: views/html/seminaries/seminary.tpl:14 views/html/xplevels/manage.tpl:9 +msgid "Manage XP-levels" +msgstr "XP-Level verwalten" #: views/html/seminaries/seminary.tpl:19 msgid "Show Quests" @@ -1849,6 +1855,14 @@ msgstr "Registrieren" msgid "Roles" msgstr "Rollen" +#: views/html/xplevels/manage.tpl:11 +msgid "Edit XP-levels" +msgstr "XP-Level bearbeiten" + +#: views/html/xplevels/manage.tpl:52 +msgid "Create new XP-level" +msgstr "Neues XP-Level erstellen" + #: views/htmlmail/mail/characterregistration.tpl:1 #: views/textmail/mail/characterregistration.tpl:1 #, php-format @@ -1884,6 +1898,9 @@ msgstr "Ein neuer Benutzer wurde registriert" msgid "Hello %s" msgstr "Hallo %s" +#~ msgid "Manage Questgroups" +#~ msgstr "Questgruppen verwalten" + #, fuzzy #~ msgid "Edit Questgrouphierarchy" #~ msgstr "bearbeiten" diff --git a/models/XplevelsModel.inc b/models/XplevelsModel.inc index 895362ea..5535012e 100644 --- a/models/XplevelsModel.inc +++ b/models/XplevelsModel.inc @@ -57,6 +57,143 @@ return $data[0]; } + + + /** + * Get all XP-levels for a Seminary. + * + * @throws IdNotFoundException + * @param int $seminaryId ID of Seminary + * @return array List of XP-level + */ + public function getXPLevelsForSeminary($seminaryId) + { + return $this->db->query( + 'SELECT id, seminary_id, xps, level, name '. + 'FROM xplevels '. + 'WHERE seminary_id = ? '. + 'ORDER BY level ASC', + 'i', + $seminaryId + ); + } + + + /** + * Create a new XP-level for a Seminary. + * + * @param int $userId ID of creating user + * @param int $seminaryId ID of Seminary + * @param int $xps XPs of new XP-level + * @param string $name Name of new XP-level (optional) + */ + public function createXPLevel($userId, $seminaryId, $xps, $name=null) + { + // Get level + $level = $this->db->query( + 'SELECT COALESCE(MAX(level),0)+1 AS level '. + 'FROM xplevels '. + 'WHERE seminary_id = ?', + 'i', + $seminaryId + ); + $level = $level[0]['level']; + + $this->db->setAutocommit(false); + try { + // Create XP-level + $this->db->query( + 'INSERT INTO xplevels '. + '(created_user_id, seminary_id, xps, level, name) '. + 'VALUES '. + '(?, ?, ?, ?, ?)', + 'iiiis', + $userId, + $seminaryId, + $xps, + $level, + $name + ); + $xplevelId = $this->db->getInsertId(); + + // Create avatars + $this->db->query( + 'INSERT INTO avatars '. + '(created_user_id, charactertype_id, xplevel_id) '. + 'SELECT ?, charactertypes.id, ? '. + 'FROM charactertypes '. + 'WHERE seminary_id = ?', + 'iii', + $userId, + $xplevelId, + $seminaryId + ); + + $this->db->commit(); + } + catch(\Exception $e) { + $this->db->rollback(); + $this->db->setAutocommit(true); + throw $e; + } + + $this->db->setAutocommit(true); + } + + + /** + * Edit a XP-level. + * + * @param int $xplevelId ID of XP-level to edit + * @param int $xps New XPs of XP-level + * @param string $name New name of XP-level (optional) + */ + public function editXPLevel($xplevelId, $xps, $name=null) + { + $this->db->query( + 'UPDATE xplevels '. + 'SET xps = ?, name = ? '. + 'WHERE id = ?', + 'isi', + $xps, + $name, + $xplevelId + ); + } + + + /** + * Delete a XP-level. + * + * @param int $xplevel XP-level to delete + */ + public function deleteXPLevel($xplevel) + { + $this->db->setAutocommit(false); + try { + // Delete XP-level + $this->db->query('DELETE FROM xplevels WHERE id = ?', 'i', $xplevel['id']); + + // Adjust levels + $this->db->query( + 'UPDATE xplevels '. + 'SET level = level - 1 '. + 'WHERE seminary_id = ? AND level > ?', + 'ii', + $xplevel['seminary_id'], + $xplevel['level'] + ); + + $this->db->commit(); + } + catch(\Exception $e) { + $this->db->rollback(); + $this->db->setAutocommit(true); + throw $e; + } + + $this->db->setAutocommit(true); + } } diff --git a/views/html/seminaries/seminary.tpl b/views/html/seminaries/seminary.tpl index 8a163d2e..ea68c600 100644 --- a/views/html/seminaries/seminary.tpl +++ b/views/html/seminaries/seminary.tpl @@ -11,8 +11,8 @@