From bc63775920a5bff9c5a4ef6b614a42d86bfd5ac8 Mon Sep 17 00:00:00 2001 From: coderkun Date: Sat, 17 May 2014 13:46:23 +0200 Subject: [PATCH] implement CRUD for Questtopics (library) (Issue #290) --- configs/AppConfig.inc | 9 +- controllers/LibraryController.inc | 302 +++++++++++++++++- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 14898 -> 15432 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 80 ++++- models/QuesttopicsModel.inc | 190 ++++++++++- views/html/library/create.tpl | 47 +++ views/html/library/delete.tpl | 16 + views/html/library/edit.tpl | 125 ++++++++ views/html/library/index.tpl | 5 + .../library/{managetopic.tpl => manage.tpl} | 0 views/html/library/topic.tpl | 4 +- 11 files changed, 752 insertions(+), 26 deletions(-) create mode 100644 views/html/library/create.tpl create mode 100644 views/html/library/delete.tpl create mode 100644 views/html/library/edit.tpl rename views/html/library/{managetopic.tpl => manage.tpl} (100%) diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 60021cf4..1a70a84e 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -234,8 +234,9 @@ array('^charactergroupsquests/([^/]+)/([^/]+)/([^/]+)/(edit|delete|manage)/?$', 'charactergroupsquests/$4/$1/$2/$3', true), array('^achievements/([^/]+)/?$', 'achievements/index/$1', true), array('^library/([^/]+)/?$', 'library/index/$1', true), + array('^library/([^/]+)/create/?$', 'library/create/$1', true), array('^library/([^/]+)/([^/]+)/?$', 'library/topic/$1/$2', true), - array('^library/([^/]+)/([^/]+)/manage/?$', 'library/managetopic/$1/$2', true), + array('^library/([^/]+)/([^/]+)/(edit|delete|manage)/?$', 'library/$3/$1/$2', true), array('^media/(.*)$', 'media/$1?layout=binary', false), array('^uploads/(.*)$', 'uploads/$1?layout=binary', false) ); @@ -272,8 +273,10 @@ array('^charactergroupsquests/quest/(.*)$', 'charactergroupsquests/$1', true), array('^charactergroupsquests/(edit|delete|manage)/([^/]+)/([^/]+)/([^/]+)$', 'charactergroupsquests/$2/$3/$4/$1', true), array('^achievements/index/(.*)$', 'achievements/$1', true), - array('^library/(index|topic)/(.*)$', 'library/$2', true), - array('^library/managetopic/(.*)$', 'library/$1/manage', true) + array('^library/index/([^/]+)/?$', 'library/$1', true), + array('^library/create/([^/]+)/?$', 'library/$1/create', true), + array('^library/topic/([^/]+)/([^/]+)/?$', 'library/$1/$2', true), + array('^library/(edit|delete|manage)/([^/]+)/([^/]+)/?$', 'library/$2/$3/$1', true) ); diff --git a/controllers/LibraryController.inc b/controllers/LibraryController.inc index bd782950..01976e1b 100644 --- a/controllers/LibraryController.inc +++ b/controllers/LibraryController.inc @@ -25,6 +25,12 @@ * @var array */ public $models = array('questtopics', 'seminaries', 'quests', 'questgroups'); + /** + * Required components + * + * @var array + */ + public $components = array('validation'); /** * User permissions * @@ -33,7 +39,10 @@ public $permissions = array( 'index' => array('admin', 'moderator', 'user'), 'topic' => array('admin', 'moderator', 'user'), - 'managetopic' => array('admin', 'moderator', 'user') + 'manage' => array('admin', 'moderator', 'user'), + 'create' => array('admin', 'moderator', 'user'), + 'edit' => array('admin', 'moderator', 'user'), + 'delete' => array('admin', 'moderator', 'user') ); /** * User seminary permissions @@ -43,7 +52,10 @@ public $seminaryPermissions = array( 'index' => array('admin', 'moderator', 'user', 'guest'), 'topic' => array('admin', 'moderator', 'user', 'guest'), - 'managetopic' => array('admin', 'moderator') + 'manage' => array('admin', 'moderator'), + 'create' => array('admin', 'moderator'), + 'edit' => array('admin', 'moderator'), + 'delete' => array('admin', 'moderator') ); @@ -142,7 +154,7 @@ /** - * Action: managetopic. + * Action: manage. * * Manage a Questtopic and its Quests with Questsubtopics. * @@ -150,7 +162,7 @@ * @param string $eminaryUrl URL-Title of Seminary * @param string $questtopicUrl URL-Title of Questtopic */ - public function managetopic($seminaryUrl, $questtopicUrl) + public function manage($seminaryUrl, $questtopicUrl) { // Get Seminary $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); @@ -214,6 +226,288 @@ $this->set('allQuests', $allQuests); } + + /** + * Action: create. + * + * Create a new Questtopic for a Seminary. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of Seminary + */ + public function create($seminaryUrl) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Values + $title = ''; + $fields = array('title'); + $validation = array(); + + // Create new Questtopic + if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create'))) + { + // Get params and validate them + $validation = $this->Validation->validateParams($this->request->getPostParams(), $fields); + $title = $this->request->getPostParam('title'); + if($this->Questtopics->questtopicTitleExists($title)) { + $validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true); + } + + // Create + if($validation === true) + { + $questtopicId = $this->Questtopics->createQuesttopic( + $this->Auth->getUserId(), + $seminary['id'], + $title + ); + $questtopic = $this->Questtopics->getQuesttopicById($questtopicId); + + // Redirect to Questtopic + $this->redirect($this->linker->link(array('topic', $seminary['url'], $questtopic['url']), 1)); + } + } + + // Get validation settings + $validationSettings = array(); + foreach($fields as &$field) { + $validationSettings[$field] = \nre\configs\AppConfig::$validation[$field]; + } + + + // Set title + $this->addTitleLocalized('New Questtopic'); + $this->addTitleLocalized('Library'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('title', $title); + $this->set('validation', $validation); + $this->set('validationSettings', $validationSettings); + } + + + /** + * Action: edit. + * + * Edit a Questtopic of a Seminary and its Questsubtopics. + * + * @throws IdNotFoundException + * @param string $eminaryUrl URL-Title of Seminary + * @param string $questtopicUrl URL-Title of Questtopic + */ + public function edit($seminaryUrl, $questtopicUrl) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questtopic + $questtopic = $this->Questtopics->getQuesttopicByUrl($seminary['id'], $questtopicUrl); + + // Get Questsubtopics + $questsubtopics = $this->Questtopics->getSubtopicsForQuesttopic($questtopic['id']); + + // Values + $questtopicTitle = $questtopic['title']; + $subtopicsTitles = array(); + foreach($questsubtopics as &$questsubtopic) { + $subtopicsTitles[$questsubtopic['id']] = $questsubtopic['title']; + } + $deleteSubtopics = null; + $subtopicTitle = ''; + $validations = array( + 'edit' => true, + 'edit-subtopics' => true, + 'create-subtopic' => true + ); + + // Edit + $action = null; + if($this->request->getRequestMethod() == 'POST') + { + // Edit Questtopic + if(!is_null($this->request->getPostParam('edit'))) + { + $action = 'edit'; + + // Get params and validate them + $validations[$action] = $this->Validation->validateParams($this->request->getPostParams(), array('title')); + $questtopicTitle = $this->request->getPostParam('title'); + if($this->Questtopics->questsubtopicTitleExists($questtopicTitle, $questtopic['id'])) { + $validations[$action] = $this->Validation->addValidationResult($validations[$action], 'title', 'exist', true); + } + + // Edit + if($validations[$action] === true) + { + $this->Questtopics->editQuesttopic( + $questtopic['id'], + $questtopicTitle + ); + $questtopic = $this->Questtopics->getQuesttopicById($questtopic['id']); + + // Redirect + $this->redirect($this->linker->link(array('topic', $seminary['url'], $questtopic['url']), 1)); + } + } + + // Edit and delete Questsubtopics + elseif(!is_null($this->request->getPostParam('edit-subtopics'))) + { + $action = 'edit-subtopics'; + + // Get params and validate them + $subtopicsTitles = $this->request->getPostParam('subtopics'); + $deleteSubtopics = $this->request->getPostParam('delete-subtopics'); + foreach($questsubtopics as &$questsubtopic) + { + if(!is_null($deleteSubtopics) && array_key_exists($questsubtopic['id'], $deleteSubtopics)) { + continue; + } + + $title = $subtopicsTitles[$questsubtopic['id']]; + $subtopicValidation = $this->Validation->validate($title, \nre\configs\AppConfig::$validation['title']); + if($subtopicValidation !== true) + { + if(!is_array($validations['edit-subtopics'])) { + $validations['edit-subtopics'] = array(); + } + if(!array_key_exists($questsubtopic['id'], $validations['edit-subtopics']) || !is_array($validations['edit-subtopics'][$questsubtopic['id']])) { + $validations['edit-subtopics'][$questsubtopic['id']] = array(); + } + //$validations['edit-subtopics'][$questsubtopic['id']]['title'] = $subtopicValidation; + $validations['edit-subtopics'][$questsubtopic['id']] = $this->Validation->addValidationResults($validations['edit-subtopics'][$questsubtopic['id']], 'title', $subtopicValidation); + } + if($this->Questtopics->questsubtopicTitleExists($questtopic['id'], $title, $questsubtopic['id'])) + { + if(!is_array($validations['edit-subtopics'])) { + $validations['edit-subtopics'] = array(); + } + if(!array_key_exists($questsubtopic['id'], $validations['edit-subtopics']) || !is_array($validations['edit-subtopics'][$questsubtopic['id']])) { + $validations['edit-subtopics'][$questsubtopic['id']] = array(); + } + $validations['edit-subtopics'][$questsubtopic['id']] = $this->Validation->addValidationResult($validations['edit-subtopics'][$questsubtopic['id']], 'title', 'exist', true); + } + } + + // Edit and delete + if($validations['edit-subtopics'] === true) + { + foreach($questsubtopics as &$questsubtopic) + { + // Delete + if(!is_null($deleteSubtopics) && array_key_exists($questsubtopic['id'], $deleteSubtopics)) { + $this->Questtopics->deleteQuestsubtopic($questsubtopic['id']); + } + // Edit + elseif(!is_null($subtopicsTitles) && array_key_exists($questsubtopic['id'], $subtopicsTitles)) + { + $title = $subtopicsTitles[$questsubtopic['id']]; + $this->Questtopics->editQuestsubtopic($questsubtopic['id'], $title); + } + } + + // Redirect + $this->redirect($this->linker->link(array($seminary['url'], $questtopic['url']), 2)); + } + } + + // Create Questsubtopic + elseif(!is_null($this->request->getPostParam('create-subtopic'))) + { + $action = 'create-subtopic'; + + // Get params and validate them + $validations[$action] = $this->Validation->validateParams($this->request->getPostParams(), array('title')); + $subtopicTitle = $this->request->getPostParam('title'); + if($this->Questtopics->questsubtopicTitleExists($questtopic['id'], $subtopicTitle)) { + $validations[$action] = $this->Validation->addValidationResult($validations[$action], 'title', 'exist', true); + } + + // Create + if($validations[$action] === true) + { + $this->Questtopics->createQuestsubtopic( + $this->Auth->getUserId(), + $questtopic['id'], + $subtopicTitle + ); + $subtopicTitle = ''; + + // Redirect + $this->redirect($this->linker->link(null, 4)); + } + } + } + + // Get validation settings + $validationSettings = array( + 'title' => \nre\configs\AppConfig::$validation['title'] + ); + + + // Set title + $this->addTitleLocalized('Edit Questtopic'); + $this->addTitleLocalized('Library'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('questtopicTitle', $questtopicTitle); + $this->set('subtopicsTitles', $subtopicsTitles); + $this->set('deleteSubtopics', $deleteSubtopics); + $this->set('subtopicTitle', $subtopicTitle); + $this->set('action', $action); + $this->set('validations', $validations); + $this->set('validationSettings', $validationSettings); + } + + + /** + * Action: delete. + * + * Delete a Questtopic of a Seminary. + * + * @throws IdNotFoundException + * @param string $eminaryUrl URL-Title of Seminary + * @param string $questtopicUrl URL-Title of Questtopic + */ + public function delete($seminaryUrl, $questtopicUrl) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questtopic + $questtopic = $this->Questtopics->getQuesttopicByUrl($seminary['id'], $questtopicUrl); + + // Check request method + if($this->request->getRequestMethod() == 'POST') + { + // Check confirmation + if(!is_null($this->request->getPostParam('delete'))) + { + // Delete seminary + $this->Questtopics->deleteQuesttopic($questtopic['id']); + + // Redirect to overview + $this->redirect($this->linker->link(array('index', $seminary['url']), 1)); + } + } + + + // Set title + $this->addTitleLocalized('Delete Questtopic'); + $this->addTitleLocalized('Library'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('questtopic', $questtopic); + } + } ?> 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 cfd2b333030621307e9520e6415dabca3f1b5e8f..e28e5debe7c936283b0b78789cd39788c3409922 100644 GIT binary patch delta 5449 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 + 'SELECT id, title, url '. + 'FROM questtopics '. + 'WHERE id = ?', + 'i', + $questtopicId + ); + if(empty($data)) { + throw new \nre\exceptions\IdNotFoundException($questtopicId); + } + + + return $data[0]; + } + + /** * Get all Questtopics for a Seminary. * @@ -70,7 +94,8 @@ return $this->db->query( 'SELECT id, title, url '. 'FROM questtopics '. - 'WHERE seminary_id = ?', + 'WHERE seminary_id = ? '. + 'ORDER BY title ASC', 'i', $seminaryId ); @@ -162,7 +187,8 @@ 'SELECT DISTINCT id, questtopic_id, title, url '. 'FROM quests_questsubtopics '. 'INNER JOIN questsubtopics ON questsubtopics.id = quests_questsubtopics.questsubtopic_id '. - 'WHERE quests_questsubtopics.quest_id = ?', + 'WHERE quests_questsubtopics.quest_id = ? '. + 'ORDER BY questsubtopics.title ASC', 'i', $questId ); @@ -209,6 +235,166 @@ $this->db->setAutocommit(true); } + + /** + * Check if a Questtopic title already exists. + * + * @param string $title Questtopic title to check + * @param int $questtopicId Do not check this ID (for editing) + * @return boolean Whether Questtopic title exists or not + */ + public function questtopicTitleExists($title, $questtopicId=null) + { + $data = $this->db->query( + 'SELECT id '. + 'FROM questtopics '. + 'WHERE title = ? OR url = ?', + 'ss', + $title, + \nre\core\Linker::createLinkParam($title) + ); + + return (!empty($data) && (is_null($questtopicId) || $questtopicId != $data[0]['id'])); + } + + + /** + * Create a new Questtopic for a Seminary. + * + * @param int $userId ID of creating user + * @param int $seminaryId ID of Seminary + * @param string $title Title for new Questtopic + * @return int ID of newly created Questtopic + */ + public function createQuesttopic($userId, $seminaryId, $title) + { + $this->db->query( + 'INSERT INTO questtopics '. + '(created_user_id, seminary_id, title, url) '. + 'VALUES '. + '(?, ?, ?, ?) ', + 'iiss', + $userId, + $seminaryId, + $title, + \nre\core\Linker::createLinkParam($title) + ); + + return $this->db->getInsertId(); + } + + + /** + * Edit a Questtopic. + * + * @param int $questtopicId ID of Questtopic to edit + * @param string $title New title of Questtopic + */ + public function editQuesttopic($questtopicId, $title) + { + $this->db->query( + 'UPDATE questtopics '. + 'SET title = ?, url = ? '. + 'WHERE id = ?', + 'ssi', + $title, + \nre\core\Linker::createLinkParam($title), + $questtopicId + ); + } + + + /** + * Delete a Questtopic. + * + * @param int $questtopicId ID of Questtopic to delete + */ + public function deleteQuesttopic($questtopicId) + { + $this->db->query('DELETE FROM questtopics WHERE id = ?', 'i', $questtopicId); + } + + + /** + * Check if a Questsubtopic title already exists. + * + * @param int $questtopicId ID of Questtopic + * @param string $title Questsubtopic title to check + * @param int $questsubtopicId Do not check this ID (for editing) + * @return boolean Whether Questsubtopic title exists or not + */ + public function questsubtopicTitleExists($questtopicId, $title, $questsubtopicId=null) + { + $data = $this->db->query( + 'SELECT id '. + 'FROM questsubtopics '. + 'WHERE questtopic_id = ? AND (title = ? OR url = ?)', + 'iss', + $questtopicId, + $title, + \nre\core\Linker::createLinkParam($title) + ); + + return (!empty($data) && (is_null($questsubtopicId) || $questsubtopicId != $data[0]['id'])); + } + + + /** + * Create a new Questsubtopic for a Questtopic. + * + * @param int $userId ID of creating user + * @param int $questtopicId ID of Qusttopic + * @param string $title Title for new Questtopic + * @return int ID of newly created Questsubtopic + */ + public function createQuestsubtopic($userId, $questtopicId, $title) + { + $this->db->query( + 'INSERT INTO questsubtopics '. + '(created_user_id, questtopic_id, title, url) '. + 'VALUES '. + '(?, ?, ?, ?) ', + 'iiss', + $userId, + $questtopicId, + $title, + \nre\core\Linker::createLinkParam($title) + ); + + return $this->db->getInsertId(); + } + + + /** + * Edit a Questsubtopic. + * + * @param int $questsubtopicId ID of Questsubtopic to edit + * @param string $title New title of Questsubtopic + */ + public function editQuestsubtopic($questsubtopicId, $title) + { + $this->db->query( + 'UPDATE questsubtopics '. + 'SET title = ?, url = ? '. + 'WHERE id = ?', + 'ssi', + $title, + \nre\core\Linker::createLinkParam($title), + $questsubtopicId + ); + } + + + /** + * Delete a Questsubtopic. + * + * @param int $questsubtopicId ID of Questsubtopic to delete + */ + public function deleteQuestsubtopic($questtopicId) + { + $this->db->query('DELETE FROM questsubtopics WHERE id = ?', 'i', $questtopicId); + } + } ?> diff --git a/views/html/library/create.tpl b/views/html/library/create.tpl new file mode 100644 index 00000000..b1282434 --- /dev/null +++ b/views/html/library/create.tpl @@ -0,0 +1,47 @@ + +
+ +
+ + +

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

+ +
+ + +
diff --git a/views/html/library/edit.tpl b/views/html/library/edit.tpl new file mode 100644 index 00000000..2083eb76 --- /dev/null +++ b/views/html/library/edit.tpl @@ -0,0 +1,125 @@ + +
+ +
+ + + +

+ +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ +
+
+ + /> +
+ +
+ +

+
+ &$title) : ?> + +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ + /> + checked="checked" /> +
+ + + +
+ +

+ +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ +
+
+
+ +
diff --git a/views/html/library/index.tpl b/views/html/library/index.tpl index 8b42b8e9..2d1aaeb7 100644 --- a/views/html/library/index.tpl +++ b/views/html/library/index.tpl @@ -7,6 +7,11 @@
  • + 0) : ?> + +

    0) ? round($totalCharacterQuestcount/$totalQuestcount*100) : 0) ?>

    diff --git a/views/html/library/managetopic.tpl b/views/html/library/manage.tpl similarity index 100% rename from views/html/library/managetopic.tpl rename to views/html/library/manage.tpl diff --git a/views/html/library/topic.tpl b/views/html/library/topic.tpl index fa6711d0..0a737e65 100644 --- a/views/html/library/topic.tpl +++ b/views/html/library/topic.tpl @@ -10,7 +10,9 @@

    0) : ?>