From 7264b623c1f66f0f891538a67c479c4c71fec83f Mon Sep 17 00:00:00 2001 From: coderkun Date: Tue, 3 Jun 2014 14:30:26 +0200 Subject: [PATCH] implement CRUD for Questgroupshierarchy --- .../QuestgroupshierarchyAgent.inc | 24 ++ configs/AppConfig.inc | 8 + .../QuestgroupshierarchyController.inc | 342 ++++++++++++++++++ models/QuestgroupshierarchyModel.inc | 190 ++++++++++ views/html/questgroups/questgroup.tpl | 19 +- views/html/questgroupshierarchy/create.tpl | 64 ++++ views/html/questgroupshierarchy/delete.tpl | 16 + views/html/questgroupshierarchy/edit.tpl | 58 +++ views/html/questgroupshierarchy/movedown.tpl | 0 views/html/questgroupshierarchy/moveup.tpl | 0 views/html/seminaries/seminary.tpl | 20 +- 11 files changed, 737 insertions(+), 4 deletions(-) create mode 100644 agents/intermediate/QuestgroupshierarchyAgent.inc create mode 100644 controllers/QuestgroupshierarchyController.inc create mode 100644 views/html/questgroupshierarchy/create.tpl create mode 100644 views/html/questgroupshierarchy/delete.tpl create mode 100644 views/html/questgroupshierarchy/edit.tpl create mode 100644 views/html/questgroupshierarchy/movedown.tpl create mode 100644 views/html/questgroupshierarchy/moveup.tpl diff --git a/agents/intermediate/QuestgroupshierarchyAgent.inc b/agents/intermediate/QuestgroupshierarchyAgent.inc new file mode 100644 index 00000000..b84f3953 --- /dev/null +++ b/agents/intermediate/QuestgroupshierarchyAgent.inc @@ -0,0 +1,24 @@ + + * @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 manage Questgroupshierarchy. + * + * @author Oliver Hanraths + */ + class QuestgroupshierarchyAgent extends \nre\agents\IntermediateAgent + { + } + +?> diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 22ae23e1..5c68793f 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -216,6 +216,10 @@ 'minlength' => 1, 'maxlength' => 32 ), + 'questgroupshierarchytitle' => array( + 'minlength' => 1, + 'maxlength' => 64 + ) ); @@ -231,6 +235,8 @@ 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('^questgroupshierarchy/([^/]+)/create/?$', 'questgroupshierarchy/create/$1', true), + array('^questgroupshierarchy/([^/]+)/([^/]+)/(edit|delete|moveup|movedown)/?$', 'questgroupshierarchy/$3/$1/$2', true), array('^questgroups/([^/]+)/(create)/?$', 'questgroups/$2/$1', true), array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true), array('^quests/([^/]+)/?$', 'quests/index/$1', true), @@ -275,6 +281,8 @@ array('^users/user/(.*)$', 'users/$1', true), array('^users/([^/]+)/(.*)$', 'users/$2/$1', true), array('^seminaries/seminary/(.*)$', 'seminaries/$1', false), + array('^questgroupshierarchy/create/(.*)$', 'questgroupshierarchy/$1/create', true), + array('^questgroupshierarchy/([^/]+)/(.*)$', 'questgroupshierarchy/$2/$1', true), array('^questgroups/create/(.*)$', 'questgroups/$2/$1', true), array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true), array('^quests/index/(.+)$', 'quests/$1', true), diff --git a/controllers/QuestgroupshierarchyController.inc b/controllers/QuestgroupshierarchyController.inc new file mode 100644 index 00000000..5f6c3601 --- /dev/null +++ b/controllers/QuestgroupshierarchyController.inc @@ -0,0 +1,342 @@ + + * @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 QuestgroupsAgent to display Questgroups. + * + * @author Oliver Hanraths + */ + class QuestgroupshierarchyController extends \hhu\z\controllers\SeminaryController + { + /** + * Required components + * + * @var array + */ + public $components = array('validation'); + /** + * Required models + * + * @var array + */ + public $models = array('seminaries', 'questgroupshierarchy', 'questgroups'); + /** + * User permissions + * + * @var array + */ + public $permissions = array( + 'create' => array('admin', 'moderator', 'user'), + 'edit' => array('admin', 'moderator', 'user'), + 'delete' => array('admin', 'moderator', 'user') + ); + /** + * User seminary permissions + * + * @var array + */ + public $seminaryPermissions = array( + 'create' => array('admin', 'moderator'), + 'edit' => array('admin', 'moderator'), + 'delete' => array('admin') + ); + + + + + /** + * Action: create. + * + * Create a new Questgroupshierarchy. + * + * @param string $seminaryUrl URL-title of a Seminary + */ + public function create($seminaryUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get parent Questgroupshierarchy + $parentQuestgroupshierarchy = $this->Questgroupshierarchy->getHierarchyOfSeminary($seminary['id']); + + // Values + $titleSingular = ''; + $titlePlural = ''; + $validation = array(); + + // Create Questgroupshierarchy + if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create'))) + { + // Get params and validate them + $titleSingular = $this->request->getPostParam('title_singular'); + $validation = $this->Validation->addValidationResults( + $validation, + 'titleSingular', + $this->Validation->validate($titleSingular, \nre\configs\AppConfig::$validation['questgroupshierarchytitle']) + ); + if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titleSingular, $seminary['id'])) { + $validation = $this->Validation->addValidationResult($validation, 'titleSingular', 'exist', true); + } + $titlePlural = $this->request->getPostParam('title_plural'); + $validation = $this->Validation->addValidationResults( + $validation, + 'titlePlural', + $this->Validation->validate($titlePlural, \nre\configs\AppConfig::$validation['questgroupshierarchytitle']) + ); + if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titlePlural, $seminary['id'])) { + $validation = $this->Validation->addValidationResult($validation, 'titlePlural', 'exist', true); + } + + // Validate parent Questgroupshierarchy + $parentQuestgroupshierarchyIndex = null; + foreach($parentQuestgroupshierarchy as $index => &$parentHierarchy) + { + $parentHierarchy['selected'] = ($parentHierarchy['url'] == $this->request->getPostParam('parent')); + if($parentHierarchy['selected']) { + $parentQuestgroupshierarchyIndex = $index; + } + } + + // Create new Questgroupshierarchy + if($validation === true) + { + $questgroupshierarchyId = $this->Questgroupshierarchy->createQuestgroupshierarchy( + $this->Auth->getUserId(), + $seminary['id'], + (!is_null($parentQuestgroupshierarchyIndex) ? $parentQuestgroupshierarchy[$parentQuestgroupshierarchyIndex]['id'] : null), + $titleSingular, + $titlePlural + ); + $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyById($questgroupshierarchyId); + + // Redirect + $this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url']))); + } + } + + // Get validation settings + $validationSettings = array( + 'title' => \nre\configs\AppConfig::$validation['title'] + ); + + + // Set titile + $this->addTitleLocalized('Create Questgroupshierarchy'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('titleSingular', $titleSingular); + $this->set('titlePlural', $titlePlural); + $this->set('parentQuestgroupshierarchy', $parentQuestgroupshierarchy); + $this->set('validation', $validation); + $this->set('validationSettings', $validationSettings); + } + + + /** + * Action: edit. + * + * Edit a Questgroupshierarchy. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-title of Seminary + * @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy + */ + public function edit($seminaryUrl, $questgroupshierarchyUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroupshierarchy + $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl); + + // Values + $titleSingular = $questgroupshierarchy['title_singular']; + $titlePlural = $questgroupshierarchy['title_plural']; + $validation = array(); + + // Check request method + if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit'))) + { + // Get params and validate them + $titleSingular = $this->request->getPostParam('title_singular'); + $validation = $this->Validation->addValidationResults( + $validation, + 'titleSingular', + $this->Validation->validate($titleSingular, \nre\configs\AppConfig::$validation['questgroupshierarchytitle']) + ); + if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titleSingular, $seminary['id'], $questgroupshierarchy['id'])) { + $validation = $this->Validation->addValidationResult($validation, 'titleSingular', 'exist', true); + } + $titlePlural = $this->request->getPostParam('title_plural'); + $validation = $this->Validation->addValidationResults( + $validation, + 'titlePlural', + $this->Validation->validate($titlePlural, \nre\configs\AppConfig::$validation['questgroupshierarchytitle']) + ); + if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titlePlural, $seminary['id'], $questgroupshierarchy['id'])) { + $validation = $this->Validation->addValidationResult($validation, 'titlePlural', 'exist', true); + } + + + // Edit Questgroup + if($validation === true) + { + $this->Questgroupshierarchy->editQuestgroupshierarchy( + $questgroupshierarchy['id'], + $titleSingular, + $titlePlural + ); + $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyById($questgroupshierarchy['id']); + + // Redirect to Seminary page + $this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url']))); + } + } + + // Get validation settings + $validationSettings = array( + 'title' => \nre\configs\AppConfig::$validation['title'] + ); + + + // Set titile + $this->addTitleLocalized('Edit Questgroupshierarchy'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('titleSingular', $titleSingular); + $this->set('titlePlural', $titlePlural); + $this->set('validation', $validation); + $this->set('validationSettings', $validationSettings); + } + + + /** + * Action: moveup. + * + * Move a Questgroupshierarchy up (decrement position). + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-title of Seminary + * @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy + */ + public function moveup($seminaryUrl, $questgroupshierarchyUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroupshierarchy + $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl); + + // Set position + $this->Questgroupshierarchy->moveQuestgroupshierarchy($questgroupshierarchy, true); + + + // Redirect + $referer = $this->request->getGetParam('referer'); + if(!is_null($referer)) + { + try { + $questgroup = $this->Questgroups->getQuestgroupById($referer); + $this->redirect($this->linker->link(array('questgroups', 'questgroup', $seminary['url'], $questgroup['url']))); + } + catch(IdNotFoundException $e) { + } + } + $this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url']))); + } + + + /** + * Action: movedown. + * + * Move a Questgroupshierarchy down (increment position). + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-title of Seminary + * @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy + */ + public function movedown($seminaryUrl, $questgroupshierarchyUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroupshierarchy + $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl); + + // Set position + $this->Questgroupshierarchy->moveQuestgroupshierarchy($questgroupshierarchy, false); + + + // Redirect + $referer = $this->request->getGetParam('referer'); + if(!is_null($referer)) + { + try { + $questgroup = $this->Questgroups->getQuestgroupById($referer); + $this->redirect($this->linker->link(array('questgroups', 'questgroup', $seminary['url'], $questgroup['url']))); + } + catch(IdNotFoundException $e) { + } + } + $this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url']))); + } + + + /** + * Action: delete. + * + * Delete a Questgroupshierarchy. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-title of Seminary + * @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy + */ + public function delete($seminaryUrl, $questgroupshierarchyUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroupshierarchy + $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl); + + // Check request method + if($this->request->getRequestMethod() == 'POST') + { + // Check confirmation + if(!is_null($this->request->getPostParam('delete'))) + { + // Delete Questgroupshierarchy + $this->Questgroupshierarchy->deleteQuestgroupshierarchy($questgroupshierarchy['id']); + } + + // Redirect to Seminary page + $this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url']))); + } + + + // Set titile + $this->addTitleLocalized('Delete Questgroupshierarchy'); + + // Show confirmation + $this->set('seminary', $seminary); + $this->set('questgroupshierarchy', $questgroupshierarchy); + } + + } + +?> diff --git a/models/QuestgroupshierarchyModel.inc b/models/QuestgroupshierarchyModel.inc index c1dae116..72a1c78e 100644 --- a/models/QuestgroupshierarchyModel.inc +++ b/models/QuestgroupshierarchyModel.inc @@ -59,6 +59,32 @@ } + /** + * Get a Questgroup hierarchy by its URL. + * + * throws IdNotFoundException + * @param int $questgroupshierarchyURL URL of a Questgroup hierarchy + * @return array Questgroup hierarchy + */ + public function getHierarchyByUrl($seminaryId, $questgroupshierarchyUrl) + { + $data = $this->db->query( + 'SELECT id, seminary_id, parent_questgroupshierarchy_id, pos, title_singular, title_plural, url '. + 'FROM questgroupshierarchy '. + 'WHERE questgroupshierarchy.seminary_id = ? AND questgroupshierarchy.url = ?', + 'is', + $seminaryId, + $questgroupshierarchyUrl + ); + if(empty($data)) { + throw new \nre\exceptions\IdNotFoundException($questgroupshierarchyUrl); + } + + + return $data[0]; + } + + /** * Get the toplevel hierarchy entries of a Seminary. * @@ -123,6 +149,170 @@ ); } + + /** + * Check if a title for a Questgroupshierarchy already exists + * for a Seminary. + * + * @param string $title + * @param int $seminaryId + * @param int $questgroupshierarchyId Do not check this Questgroupshierarchy (for editing) + * @return Whether title already exists or not + */ + public function questgroupshierarchyTitleSingularExists($title, $seminaryId, $questgroupshierarchyId=null) + { + $data = $this->db->query( + 'SELECT id '. + 'FROM questgroupshierarchy '. + 'WHERE seminary_id = ? AND (title_singular = ? OR url = ?) ', + 'iss', + $seminaryId, + $title, + \nre\core\Linker::createLinkParam($title) + ); + + + return (!empty($data) && (is_null($questgroupshierarchyId) || $questgroupshierarchyId != $data[0]['id'])); + } + + + /** + * Create a new Questgroupshierarchy for a Seminary + * + * @param int $userId ID of creating user + * @param int $seminaryId ID of Seminary + * @param int $parentQuestgroupsierarchyId ID of parent Questgroupshierarchy + * @param string $title Title (singular) + * @param string $course Title (plural) + */ + public function createQuestgroupshierarchy($userId, $seminaryId, $parentQuestgroupsierarchyId, $titleSingular, $titlePlural) + { + // Get last position + $pos = $this->db->query( + 'SELECT COALESCE(MAX(pos),0) AS pos '. + 'FROM questgroupshierarchy '. + 'WHERE seminary_id = ? AND '. + 'parent_questgroupshierarchy_id '.(!is_null($parentQuestgroupsierarchyId) ? sprintf('= %d', $parentQuestgroupsierarchyId) : 'IS NULL'), + 'i', + $seminaryId + ); + $pos = intval($pos[0]['pos']); + + // Create Questgroupshierarchy + $this->db->query( + 'INSERT INTO questgroupshierarchy '. + '(created_user_id, seminary_id, parent_questgroupshierarchy_id, pos, title_singular, title_plural, url) '. + 'VALUES '. + '(?, ?, ?, ?, ?, ?, ?)', + 'iiiisss', + $userId, + $seminaryId, + $parentQuestgroupsierarchyId, + $pos + 1, + $titleSingular, + $titlePlural, + \nre\core\Linker::createLinkParam($titleSingular) + ); + + + return $this->db->getInsertId(); + } + + + /** + * Edit a Questgroupshierarchy. + * + * @param int $questgroupshierarchyId ID of Questgroupshierarchy to edit + * @param string $title New title (singular) + * @param string $course New title (plural) + */ + public function editQuestgroupshierarchy($questgroupshierarchyId, $titleSingular, $titlePlural) + { + $this->db->query( + 'UPDATE questgroupshierarchy '. + 'SET title_singular = ?, title_plural = ?, url = ? '. + 'WHERE id = ?', + 'sssi', + $titleSingular, + $titlePlural, + \nre\core\Linker::createLinkParam($titleSingular), + $questgroupshierarchyId + ); + } + + + /** + * Move a Questgroupshierarchy up (decrement position) or down + * (increment position). + * + * @param array $questgroupshierarchy Questgroupshierarchy to move + * @param boolean $up True for moving up, false for down + */ + public function moveQuestgroupshierarchy($questgroupshierarchy, $up) + { + $this->db->setAutocommit(false); + try { + // Set temporary position + $this->db->query( + 'UPDATE questgroupshierarchy '. + 'SET pos = 0 '. + 'WHERE id = ?', + 'i', + $questgroupshierarchy['id'] + ); + // Switch entry + if(is_null($questgroupshierarchy['parent_questgroupshierarchy_id'])) { + $this->db->query( + 'UPDATE questgroupshierarchy '. + 'SET pos = ? '. + 'WHERE parent_questgroupshierarchy_id IS NULL AND pos = ?', + 'ii', + $questgroupshierarchy['pos'], + $questgroupshierarchy['pos'] + ($up ? -1 : 1) + ); + } + else { + $this->db->query( + 'UPDATE questgroupshierarchy '. + 'SET pos = ? '. + 'WHERE parent_questgroupshierarchy_id = ? AND pos = ?', + 'iii', + $questgroupshierarchy['pos'], + $questgroupshierarchy['parent_questgroupshierarchy_id'], + $questgroupshierarchy['pos'] + ($up ? -1 : 1) + ); + } + // Set new position + $this->db->query( + 'UPDATE questgroupshierarchy '. + 'SET pos = ? '. + 'WHERE id = ?', + 'ii', + $questgroupshierarchy['pos'] + ($up ? -1 : 1), + $questgroupshierarchy['id'] + ); + + $this->db->commit(); + } + catch(\nre\exceptions\DatamodelException $e) { + $this->db->rollback(); + $this->db->setAutocommit(true); + throw $e; + } + $this->db->setAutocommit(true); + } + + + /** + * Delete a Questgroupshierarchy. + * + * @param int $seminaryId ID of the seminary to delete + */ + public function deleteQuestgroupshierarchy($questgroupshierarchyId) + { + $this->db->query('DELETE FROM questgroupshierarchy WHERE id = ?', 'i', $questgroupshierarchyId); + } + } ?> diff --git a/views/html/questgroups/questgroup.tpl b/views/html/questgroups/questgroup.tpl index d296deef..b5e7008c 100644 --- a/views/html/questgroups/questgroup.tpl +++ b/views/html/questgroups/questgroup.tpl @@ -19,9 +19,17 @@ - - 0) : ?> + &$hierarchy) : ?> + 0 || count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0) : ?>

+ 0) : ?> + +
  • @@ -51,6 +59,13 @@
+
+

+ : + : + + +
0) : ?> diff --git a/views/html/questgroupshierarchy/create.tpl b/views/html/questgroupshierarchy/create.tpl new file mode 100644 index 00000000..0d929b80 --- /dev/null +++ b/views/html/questgroupshierarchy/create.tpl @@ -0,0 +1,64 @@ + +
+ +
+ + + +

+ +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ +
+
+ + />
+ + />
+ +
+ +
diff --git a/views/html/questgroupshierarchy/delete.tpl b/views/html/questgroupshierarchy/delete.tpl new file mode 100644 index 00000000..279aa899 --- /dev/null +++ b/views/html/questgroupshierarchy/delete.tpl @@ -0,0 +1,16 @@ + +
+ +
+ + + +

+ +
+ + +
diff --git a/views/html/questgroupshierarchy/edit.tpl b/views/html/questgroupshierarchy/edit.tpl new file mode 100644 index 00000000..d82681df --- /dev/null +++ b/views/html/questgroupshierarchy/edit.tpl @@ -0,0 +1,58 @@ + +
+ +
+ + + +

+ +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ +
+
+ + />
+ + />
+
+ +
diff --git a/views/html/questgroupshierarchy/movedown.tpl b/views/html/questgroupshierarchy/movedown.tpl new file mode 100644 index 00000000..e69de29b diff --git a/views/html/questgroupshierarchy/moveup.tpl b/views/html/questgroupshierarchy/moveup.tpl new file mode 100644 index 00000000..e69de29b diff --git a/views/html/seminaries/seminary.tpl b/views/html/seminaries/seminary.tpl index 10240c77..f7bc4fdd 100644 --- a/views/html/seminaries/seminary.tpl +++ b/views/html/seminaries/seminary.tpl @@ -20,8 +20,17 @@

- -

+ &$hierarchy) : ?> +

+ 0) : ?> + +
  • @@ -46,3 +55,10 @@
+ +
+

+ : + : + +