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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 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 6d408ad1..7c3c9dac 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-05-16 00:20+0100\n" -"PO-Revision-Date: 2014-05-16 00:21+0100\n" +"POT-Creation-Date: 2014-05-17 13:42+0100\n" +"PO-Revision-Date: 2014-05-17 13:43+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -343,7 +343,8 @@ msgstr "Motto" #: views/html/charactergroups/creategroup.tpl:77 #: views/html/charactergroups/creategroupsgroup.tpl:50 #: views/html/charactergroupsquests/create.tpl:93 -#: views/html/characters/register.tpl:94 views/html/questgroups/create.tpl:17 +#: views/html/characters/register.tpl:94 views/html/library/create.tpl:46 +#: views/html/library/edit.tpl:124 views/html/questgroups/create.tpl:17 #: views/html/quests/create.tpl:43 views/html/seminaries/create.tpl:14 #: views/html/users/create.tpl:96 msgid "create" @@ -372,7 +373,8 @@ msgstr "Soll die %s-Gruppen „%s“ wirklich gelöscht werden?" #: views/html/charactergroups/deletegroup.tpl:15 #: views/html/charactergroups/deletegroupsgroup.tpl:14 #: views/html/charactergroupsquests/delete.tpl:15 -#: views/html/characters/delete.tpl:17 views/html/seminaries/delete.tpl:13 +#: views/html/characters/delete.tpl:17 views/html/library/delete.tpl:14 +#: views/html/library/edit.tpl:83 views/html/seminaries/delete.tpl:13 #: views/html/users/delete.tpl:11 msgid "delete" msgstr "löschen" @@ -380,8 +382,8 @@ msgstr "löschen" #: views/html/charactergroups/deletegroup.tpl:16 #: views/html/charactergroups/deletegroupsgroup.tpl:15 #: views/html/charactergroupsquests/delete.tpl:16 -#: views/html/characters/delete.tpl:18 views/html/seminaries/delete.tpl:14 -#: views/html/users/delete.tpl:12 +#: views/html/characters/delete.tpl:18 views/html/library/delete.tpl:15 +#: views/html/seminaries/delete.tpl:14 views/html/users/delete.tpl:12 msgid "cancel" msgstr "abbrechen" @@ -510,28 +512,38 @@ msgstr "Neue %s-Quest" #: views/html/charactergroupsquests/create.tpl:34 #: views/html/charactergroupsquests/edit.tpl:34 +#: views/html/library/create.tpl:22 views/html/library/edit.tpl:22 +#: views/html/library/edit.tpl:62 views/html/library/edit.tpl:100 #, php-format msgid "Title is too short (min. %d chars)" msgstr "Der Titel ist zu kurz (min. %d Zeichen)" #: views/html/charactergroupsquests/create.tpl:36 #: views/html/charactergroupsquests/edit.tpl:36 +#: views/html/library/create.tpl:24 views/html/library/edit.tpl:24 +#: views/html/library/edit.tpl:64 views/html/library/edit.tpl:102 #, php-format msgid "Title is too long (max. %d chars)" msgstr "Der Titel ist zu lang (max. %d Zeichen)" #: views/html/charactergroupsquests/create.tpl:38 #: views/html/charactergroupsquests/edit.tpl:38 +#: views/html/library/create.tpl:26 views/html/library/edit.tpl:26 +#: views/html/library/edit.tpl:66 views/html/library/edit.tpl:104 msgid "Title contains illegal characters" msgstr "Der Titel enthält ungültige Zeichen" #: views/html/charactergroupsquests/create.tpl:40 #: views/html/charactergroupsquests/edit.tpl:40 +#: views/html/library/create.tpl:28 views/html/library/edit.tpl:28 +#: views/html/library/edit.tpl:68 views/html/library/edit.tpl:106 msgid "Title already exists" msgstr "Der Titel existiert bereits" #: views/html/charactergroupsquests/create.tpl:42 #: views/html/charactergroupsquests/edit.tpl:42 +#: views/html/library/create.tpl:30 views/html/library/edit.tpl:30 +#: views/html/library/edit.tpl:70 views/html/library/edit.tpl:108 msgid "Title invalid" msgstr "Der Titel ist ungültig" @@ -555,6 +567,9 @@ msgstr "Die XP-Angabe ist ungültig" #: views/html/charactergroupsquests/create.tpl:75 #: views/html/charactergroupsquests/edit.tpl:75 #: views/html/charactergroupsquests/edit.tpl:76 +#: views/html/library/create.tpl:43 views/html/library/create.tpl:44 +#: views/html/library/edit.tpl:43 views/html/library/edit.tpl:44 +#: views/html/library/edit.tpl:121 views/html/library/edit.tpl:122 #: views/html/questgroups/create.tpl:14 views/html/questgroups/create.tpl:15 #: views/html/seminaries/create.tpl:11 views/html/seminaries/create.tpl:12 #: views/html/seminaries/edit.tpl:13 views/html/seminaries/edit.tpl:14 @@ -624,6 +639,7 @@ msgid "File invalid" msgstr "Die Datei ist ungültig" #: views/html/charactergroupsquests/manage.tpl:66 +#: views/html/library/edit.tpl:46 views/html/library/edit.tpl:86 #: views/html/seminaries/edit.tpl:16 views/html/users/edit.tpl:103 msgid "save" msgstr "speichern" @@ -732,7 +748,7 @@ msgstr "Das Kursfeld „%s“ ist ungültig" msgid "Seminary fields" msgstr "Kursfelder" -#: views/html/characters/index.tpl:13 views/html/library/managetopic.tpl:26 +#: views/html/characters/index.tpl:13 views/html/library/manage.tpl:39 #: views/html/users/index.tpl:7 msgid "Manage" msgstr "Verwalten" @@ -843,12 +859,43 @@ msgstr "Du hast Level %d erreicht" msgid "Introduction" msgstr "Einführung" -#: views/html/library/index.tpl:9 views/html/library/managetopic.tpl:8 -#: views/html/library/topic.tpl:8 views/html/seminarymenu/index.tpl:7 +#: views/html/library/create.tpl:8 views/html/library/delete.tpl:8 +#: views/html/library/edit.tpl:8 views/html/library/index.tpl:9 +#: views/html/library/manage.tpl:8 views/html/library/topic.tpl:8 +#: views/html/seminarymenu/index.tpl:7 msgid "Library" msgstr "Bibliothek" -#: views/html/library/index.tpl:10 +#: views/html/library/create.tpl:10 +msgid "New Questtopic" +msgstr "Neues Thema" + +#: views/html/library/delete.tpl:11 views/html/library/topic.tpl:14 +msgid "Delete Questtopic" +msgstr "Thema löschen" + +#: views/html/library/delete.tpl:12 +#, php-format +msgid "Should the Questtopic “%s” really be deleted?" +msgstr "Soll das Thema „%s“ wirklich gelöscht werden?" + +#: views/html/library/edit.tpl:11 views/html/library/topic.tpl:13 +msgid "Edit Questtopic" +msgstr "Thema bearbeiten" + +#: views/html/library/edit.tpl:49 +msgid "Edit Questsubtopics" +msgstr "Unterthemen bearbeiten" + +#: views/html/library/edit.tpl:89 +msgid "Create new Questsubtopic" +msgstr "Neues Unterthema erstellen" + +#: views/html/library/index.tpl:12 +msgid "Create new Questtopic" +msgstr "Neues Thema erstellen" + +#: views/html/library/index.tpl:15 #, php-format msgid "Library description, %s, %s" msgstr "" @@ -857,13 +904,17 @@ msgstr "" "Umfang der Bibliothek, spiele also regelmäßig weiter und schalte so Quest " "für Quest alle Inhalte frei." -#: views/html/library/index.tpl:12 +#: views/html/library/index.tpl:17 #, php-format msgid "Total progress: %d %%" msgstr "Gesamtfortschritt: %d%%" -#: views/html/library/topic.tpl:13 -msgid "Manage topic" +#: views/html/library/manage.tpl:27 +msgid "Add Quest" +msgstr "Quest hinzufügen" + +#: views/html/library/topic.tpl:15 +msgid "Manage Questtopic" msgstr "Thema verwalten" #: views/html/menu/index.tpl:2 views/html/users/create.tpl:5 @@ -1278,9 +1329,6 @@ msgstr "Rollen" #~ msgid "Character type" #~ msgstr "Charaktertyp" -#~ msgid "Questtopics" -#~ msgstr "Themen" - #~ msgid "Questname" #~ msgstr "Questname" diff --git a/models/QuesttopicsModel.inc b/models/QuesttopicsModel.inc index 31328572..4c7810bc 100644 --- a/models/QuesttopicsModel.inc +++ b/models/QuesttopicsModel.inc @@ -59,6 +59,30 @@ } + /** + * Get a Questtopic by its ID. + * + * @param int $questtopicId ID of Questtopic + * @return array Questtopic data + */ + public function getQuesttopicById($questtopicId) + { + $data = $this->db->query( + '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) : ?>