From 66bd4ee08b9dcd730cf4988201faed7566df6b7c Mon Sep 17 00:00:00 2001 From: coderkun Date: Tue, 1 Jul 2014 17:00:43 +0200 Subject: [PATCH] implement basic CRUD for Quests --- agents/intermediate/QuestsAgent.inc | 27 ++ configs/AppConfig.inc | 14 +- controllers/QuestsController.inc | 376 +++++++++++++++++--- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 19351 -> 19958 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 164 ++++++--- models/QuestsModel.inc | 161 ++++++++- views/html/quests/create.tpl | 125 +++++-- views/html/quests/delete.tpl | 13 + views/html/quests/edit.tpl | 114 ++++++ views/html/quests/quest.tpl | 8 + 10 files changed, 843 insertions(+), 159 deletions(-) create mode 100644 views/html/quests/delete.tpl create mode 100644 views/html/quests/edit.tpl diff --git a/agents/intermediate/QuestsAgent.inc b/agents/intermediate/QuestsAgent.inc index 273a47ab..4afacc3c 100644 --- a/agents/intermediate/QuestsAgent.inc +++ b/agents/intermediate/QuestsAgent.inc @@ -48,6 +48,33 @@ { $this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4), true); } + + + /** + * Action: create. + */ + public function create(\nre\core\Request $request, \nre\core\Response $response) + { + $this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4), true); + } + + + /** + * Action: edit. + */ + public function edit(\nre\core\Request $request, \nre\core\Response $response) + { + $this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4), true); + } + + + /** + * Action: delete. + */ + public function delete(\nre\core\Request $request, \nre\core\Response $response) + { + $this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4), true); + } } diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index e69f095b..70510962 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -242,8 +242,8 @@ array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true), array('^quests/([^/]+)/?$', 'quests/index/$1', true), array('^quests/([^/]+)/all/?$', 'quests/index/$1/all', true), - array('^quests/([^/]+)/(create|createmedia)/?$', 'quests/$2/$1' , true), - array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions)/?$', 'quests/$4/$1/$2/$3', true), + array('^quests/([^/]+)/([^/]+)/(create|createmedia)/?$', 'quests/$3/$1/$2', true), + array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions|edit|delete)/?$', 'quests/$4/$1/$2/$3', true), array('^quests/([^/]+)/([^/]+)/([^/]+)/(submission)/([^/]+)/?$', 'quests/$4/$1/$2/$3/$5', true), array('^quests/(?!(index|create|createmedia))/?', 'quests/quest/$1', true), array('^characters/([^/]+)/(register|manage)/?$', 'characters/$2/$1', true), @@ -287,11 +287,11 @@ array('^questgroups/create/(.*)$', 'questgroups/$1/create', true), array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true), array('^questgroups/(edit|delete|moveup|movedown)/(.*)$', 'questgroups/$2/$1', true), - array('^quests/index/(.+)$', 'quests/$1', true), - array('^quests/quest/(.*)$', 'quests/$1', true), - array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true), - array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true), - array('^quests/(submission)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$', 'quests/$2/$3/$4/$1/$5', true), + array('^quests/index/(.+)$', 'quests/$1', true), + array('^quests/quest/(.*)$', 'quests/$1', true), + array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true), + array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true), + array('^quests/(submission|edit|delete)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$', 'quests/$2/$3/$4/$1/$5', true), array('^characters/(index|character)/(.*)$', 'characters/$2', true), array('^characters/(register|manage)/([^/]+)$', 'characters/$2/$1', true), array('^characters/(edit|delete)/([^/]+)/([^/]+)$', 'characters/$2/$3/$1', true), diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index 50a8ae63..3c3f05c9 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -25,6 +25,12 @@ * @var array */ public $models = array('seminaries', 'questgroups', 'quests', 'questtexts', 'media', 'questtypes', 'questgroupshierarchy', 'xplevels'); + /** + * Required components + * + * @var array + */ + public $components = array('validation'); /** * User permissions * @@ -35,7 +41,9 @@ 'quest' => array('admin', 'moderator', 'user'), 'submissions' => array('admin', 'moderator', 'user'), 'submission' => array('admin', 'moderator', 'user'), - 'create' => array('admin', 'moderator', 'user') + 'create' => array('admin', 'moderator', 'user'), + 'edit' => array('admin', 'moderator', 'user'), + 'delete' => array('admin', 'moderator', 'user') ); /** * User seminary permissions @@ -47,7 +55,9 @@ 'quest' => array('admin', 'moderator', 'user'), 'submissions' => array('admin', 'moderator'), 'submission' => array('admin', 'moderator'), - 'create' => array('admin', 'moderator') + 'create' => array('admin', 'moderator'), + 'edit' => array('admin', 'moderator'), + 'delete' => array('admin') ); @@ -445,42 +455,49 @@ * Create a new Quest. * * @param string $seminaryUrl URL-Title of a Seminary + * @param string $questgroupUrl URL-Title of Questgroup */ - public function create($seminaryUrl) + public function create($seminaryUrl, $questgroupUrl) { // Get seminary $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroup + $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); + $questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); + $questgroup['picture'] = (!is_null($questgroup['questgroupspicture_id'])) ? $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']) : null; - // Quest groups - $questgroups = $this->Questgroups->getQuestgroupsForSeminary($seminary['id']); - - // Quest types + // Get Quest types $questtypes = $this->Questtypes->getQuesttypes(); + foreach($questtypes as &$questtype) { + $questtype['selected'] = false; + } + + // Get allowed mimetypes + $mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics']; + + // Values + $title = ''; + $xps = 0; + $task = ''; + $entryText = ''; + $wrongText = ''; + $fields = array('title', 'xps'); + $validation = array(); - // Create Quest - $validation = true; + // Check request method if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create'))) { - // TODO Validation - $name = $this->request->getPostParam('name'); + // Get params and validate them + $validation = $this->Validation->validateParams($this->request->getPostParams(), $fields); + $title = $this->request->getPostParam('title'); + if($this->Quests->questTitleExists($title, $seminary['id'])) { + $validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true); + } $xps = $this->request->getPostParam('xps'); - $prolog = $this->request->getPostParam('prolog'); - $entrytext = $this->request->getPostParam('entrytext'); - $wrongtext = $this->request->getPostParam('wrongtext'); $task = $this->request->getPostParam('task'); - - // Validate Questgroup - $questgroupIndex = null; - foreach($questgroups as $index => &$questgroup) - { - $questgroup['selected'] = ($questgroup['url'] == $this->request->getPostParam('questgroup')); - if($questgroup['selected']) { - $questgroupIndex = $index; - } - } - if(is_null($questgroupIndex)) { - throw new \nre\exceptions\ParamsNotValidException($questgroup); - } + $entryText = $this->request->getPostParam('entrytext'); + $wrongText = $this->request->getPostParam('wrongtext'); // Validate Questtype $questtypeIndex = null; @@ -495,15 +512,32 @@ throw new \nre\exceptions\ParamsNotValidException($questtype); } - // Questmedia - $questmedia = null; - if(array_key_exists('questmedia', $_FILES) && !empty($_FILES['questmedia']) && $_FILES['questmedia']['error'] == 0) { - $questmedia = $_FILES['questmedia']; - } - - // Process Prolog - if(!empty($prolog)) { - $prolog = preg_split('/\s*(_|=){5,}\s*/', $prolog, -1, PREG_SPLIT_NO_EMPTY); + // Validate media + $media = null; + if(!empty($_FILES) && array_key_exists('media', $_FILES) && $_FILES['media']['error'] != UPLOAD_ERR_NO_FILE) + { + $media = $_FILES['media']; + + // Check error + if($media['error'] !== UPLOAD_ERR_OK) { + $validation = $this->Validation->addValidationResult($validation, 'media', 'error', $media['error']); + } + + // Check mimetype + $mediaMimetype = null; + $media['mimetype'] = \hhu\z\Utils::getMimetype($media['tmp_name'], $media['type']); + foreach($mimetypes as &$mimetype) { + if($mimetype['mimetype'] == $media['mimetype']) { + $mediaMimetype = $mimetype; + break; + } + } + if(is_null($mediaMimetype)) { + $validation = $this->Validation->addValidationResult($validation, 'media', 'mimetype', $media['mimetype']); + } + elseif($media['size'] > $mediaMimetype['size']) { + $validation = $this->Validation->addValidationResult($validation, 'media', 'size', $mediaMimetype['size']); + } } // Create new Quest @@ -511,41 +545,42 @@ { $questId = $this->Quests->createQuest( $this->Auth->getUserId(), - $name, - $questgroups[$questgroupIndex]['id'], + $questgroup['id'], $questtypes[$questtypeIndex]['id'], + $title, $xps, - $entrytext, - $wrongtext, - $task + $task, + $entryText, + $wrongText ); + $quest = $this->Quests->getQuestById($questId); - // Create Questmedia - if(!is_null($questmedia)) + // Update picture + if(!is_null($media)) { $questsmediaId = $this->Media->createQuestMedia( $this->Auth->getUserId(), $seminary['id'], - $questmedia['name'], - $name, - $questmedia['type'], - $questmedia['tmp_name'] + $media['name'], + $title, + $media['type'], + $media['tmp_name'] ); if($questsmediaId > 0) { - $this->Quests->setQuestmedia($questId, $questsmediaId); + $this->Quests->setQuestmedia($quest['id'], $questsmediaId); } } - // Add Prolog-texts - if(!empty($prolog)) { - $this->Questtexts->addQuesttextsToQuest($this->Auth->getUserId(), $questId, 'Prolog', $prolog); - } - - // Redirect - $this->redirect($this->linker->link(array('quests', 'index', $seminary['url']))); + $this->redirect($this->linker->link(array('quest', $seminary['url'], $questgroup['url'], $quest['url']), 1)); } } + + // Get validation settings + $validationSettings = array(); + foreach($fields as &$field) { + $validationSettings[$field] = \nre\configs\AppConfig::$validation[$field]; + } // Set titile @@ -554,8 +589,237 @@ // Pass data to view $this->set('seminary', $seminary); - $this->set('questgroups', $questgroups); + $this->set('questgroup', $questgroup); + $this->set('mimetypes', $mimetypes); $this->set('questtypes', $questtypes); + $this->set('title', $title); + $this->set('task', $task); + $this->set('entryText', $entryText); + $this->set('wrongText', $wrongText); + $this->set('xps', $xps); + $this->set('questtype_id', $questtype); + $this->set('validation', $validation); + $this->set('validationSettings', $validationSettings); + } + + + /** + * Action: edit. + * + * Edit a Quest of a Seminary. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of Seminary + * @param string $questgroupUrl URL-Title of Questgroup + * @param string $questUrl URL-Title of Quest + */ + public function edit($seminaryUrl, $questgroupUrl, $questUrl) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroup + $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); + $questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); + $questgroup['picture'] = (!is_null($questgroup['questgroupspicture_id'])) ? $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']) : null; + + // Get Quest + $quest = $this->Quests->getQuestByUrl($seminary['id'], $questgroup['id'], $questUrl); + + // Get Quest media + $questmedia = null; + if(!is_null($quest['questsmedia_id'])) { + $questmedia = $this->Media->getSeminaryMediaById($quest['questsmedia_id']); + } + + // Get Quest types + $questtypes = $this->Questtypes->getQuesttypes(); + foreach($questtypes as &$questtype) { + $questtype['selected'] = ($questtype['id'] == $quest['questtype_id']); + } + + // Get allowed mimetypes + $mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics']; + + // Values + $title = $quest['title']; + $xps = $quest['xps']; + $task = $quest['task']; + $entryText = $quest['entry_text']; + $wrongText = $quest['wrong_text']; + $fields = array('title', 'xps'); + $validation = array(); + + // Check request method + if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit'))) + { + // Get params and validate them + $validation = $this->Validation->validateParams($this->request->getPostParams(), $fields); + $title = $this->request->getPostParam('title'); + if($this->Quests->questTitleExists($title, $seminary['id'], $quest['id'])) { + $validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true); + } + $xps = $this->request->getPostParam('xps'); + $task = $this->request->getPostParam('task'); + $entryText = $this->request->getPostParam('entrytext'); + $wrongText = $this->request->getPostParam('wrongtext'); + + // Validate Questtype + $questtypeIndex = null; + foreach($questtypes as $index => &$questtype) + { + $questtype['selected'] = ($questtype['url'] == $this->request->getPostParam('questtype')); + if($questtype['selected']) { + $questtypeIndex = $index; + } + } + if(is_null($questtypeIndex)) { + throw new \nre\exceptions\ParamsNotValidException($questtype); + } + + // Validate media + $media = null; + if(!empty($_FILES) && array_key_exists('media', $_FILES) && $_FILES['media']['error'] != UPLOAD_ERR_NO_FILE) + { + $media = $_FILES['media']; + + // Check error + if($media['error'] !== UPLOAD_ERR_OK) { + $validation = $this->Validation->addValidationResult($validation, 'media', 'error', $media['error']); + } + + // Check mimetype + $mediaMimetype = null; + $media['mimetype'] = \hhu\z\Utils::getMimetype($media['tmp_name'], $media['type']); + foreach($mimetypes as &$mimetype) { + if($mimetype['mimetype'] == $media['mimetype']) { + $mediaMimetype = $mimetype; + break; + } + } + if(is_null($mediaMimetype)) { + $validation = $this->Validation->addValidationResult($validation, 'media', 'mimetype', $media['mimetype']); + } + elseif($media['size'] > $mediaMimetype['size']) { + $validation = $this->Validation->addValidationResult($validation, 'media', 'size', $mediaMimetype['size']); + } + } + + // Edit Quest + if($validation === true) + { + $this->Quests->editQuest( + $quest['id'], + $questtypes[$questtypeIndex]['id'], + $title, + $xps, + $task, + $entryText, + $wrongText + ); + $quest = $this->Quests->getQuestById($quest['id']); + + // Update picture + if(!is_null($media)) + { + $questsmediaId = $this->Media->createQuestMedia( + $this->Auth->getUserId(), + $seminary['id'], + $media['name'], + $title, + $media['type'], + $media['tmp_name'] + ); + if($questsmediaId > 0) { + $this->Quests->setQuestmedia($quest['id'], $questsmediaId); + } + } + + // Redirect to entry + $this->redirect($this->linker->link(array('quest', $seminary['url'], $questgroup['url'], $quest['url']), 1)); + } + } + + // Get validation settings + $validationSettings = array(); + foreach($fields as &$field) { + $validationSettings[$field] = \nre\configs\AppConfig::$validation[$field]; + } + + + // Set titile + $this->addTitleLocalized('Edit Quest'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('questgroup', $questgroup); + $this->set('quest', $quest); + $this->set('media', $questmedia); + $this->set('mimetypes', $mimetypes); + $this->set('questtypes', $questtypes); + $this->set('title', $title); + $this->set('task', $task); + $this->set('entryText', $entryText); + $this->set('wrongText', $wrongText); + $this->set('xps', $xps); + $this->set('questtype_id', $questtype); + $this->set('validation', $validation); + $this->set('validationSettings', $validationSettings); + } + + + /** + * Action: delete. + * + * Delete a Quest of a Seminary. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of Seminary + * @param string $questgroupUrl URL-Title of Questgroup + * @param string $questUrl URL-Title of Quest + */ + public function delete($seminaryUrl, $questgroupUrl, $questUrl) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroup + $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); + $questgroup['picture'] = null; + if(!is_null($questgroup['questgroupspicture_id'])) { + $questgroup['picture'] = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']); + } + + // Get Quest + $quest = $this->Quests->getQuestByUrl($seminary['id'], $questgroup['id'], $questUrl); + + // Check request method + if($this->request->getRequestMethod() == 'POST') + { + // Check confirmation + if(!is_null($this->request->getPostParam('delete'))) + { + // Delete seminary + $this->Quests->deleteQuest($quest['id']); + + // Redirect to Questgroup + $this->redirect($this->linker->link(array('questgroups', 'questgroup', $seminary['url'], $questgroup['url']))); + } + + // Redirect to entry + $this->redirect($this->linker->link(array('seminary', $seminary['url']), 1)); + } + + + // Set titile + $this->addTitleLocalized('Delete Quest'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('questgroup', $questgroup); + $this->set('quest', $quest); } 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 e75c4fa1e0493e993a17f63967dc3d1da1e802f3..93d0ec1a91d1313f675a3c6b6dee49a25e10e046 100644 GIT binary patch delta 6629 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 delta 6203 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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 ada8f3b8..76bf60f2 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-06-24 21:56+0100\n" -"PO-Revision-Date: 2014-06-24 21:56+0100\n" +"POT-Creation-Date: 2014-07-01 15:40+0100\n" +"PO-Revision-Date: 2014-07-01 15:41+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -63,8 +63,8 @@ msgstr "Neuer Lösungsvorschlag" msgid "Character submission approved" msgstr "Lösungsvorschlag bewertet" -#: controllers/QuestsController.inc:740 -#: questtypes/submit/html/submission.tpl:30 views/html/quests/quest.tpl:45 +#: controllers/QuestsController.inc:1004 +#: questtypes/submit/html/submission.tpl:30 views/html/quests/quest.tpl:53 #: views/html/quests/submissions.tpl:30 msgid "solved" msgstr "Richtig!" @@ -76,7 +76,7 @@ msgstr "Richtig!" msgid "lost" msgstr "verloren" -#: questtypes/bossfight/html/quest.tpl:41 views/html/quests/quest.tpl:120 +#: questtypes/bossfight/html/quest.tpl:41 views/html/quests/quest.tpl:128 msgid "Choose" msgstr "Wählen" @@ -132,6 +132,7 @@ msgstr "Fehler beim Dateiupload: %s" #: views/html/charactergroupsquests/edit.tpl:67 #: views/html/charactergroupsquests/manage.tpl:63 #: views/html/questgroups/create.tpl:65 views/html/questgroups/edit.tpl:53 +#: views/html/quests/create.tpl:62 views/html/quests/edit.tpl:65 #: views/html/seminaries/create.tpl:60 views/html/seminaries/edit.tpl:62 msgid "Allowed file types" msgstr "Erlaubte Dateiformate" @@ -143,6 +144,7 @@ msgstr "Erlaubte Dateiformate" #: views/html/charactergroupsquests/edit.tpl:70 #: views/html/charactergroupsquests/manage.tpl:63 #: views/html/questgroups/create.tpl:68 views/html/questgroups/edit.tpl:56 +#: views/html/quests/create.tpl:65 views/html/quests/edit.tpl:68 #: views/html/seminaries/create.tpl:63 views/html/seminaries/edit.tpl:65 #, php-format msgid "%s-files" @@ -155,6 +157,7 @@ msgstr "%s-Dateien" #: views/html/charactergroupsquests/edit.tpl:70 #: views/html/charactergroupsquests/manage.tpl:63 #: views/html/questgroups/create.tpl:68 views/html/questgroups/edit.tpl:56 +#: views/html/quests/create.tpl:65 views/html/quests/edit.tpl:68 #: views/html/seminaries/create.tpl:63 views/html/seminaries/edit.tpl:65 msgid "max." msgstr "max." @@ -188,47 +191,55 @@ msgstr "Bewertet von %s am %s um %s Uhr" msgid "Comment" msgstr "Kommentar" -#: questtypes/submit/html/submission.tpl:31 views/html/quests/quest.tpl:50 +#: questtypes/submit/html/submission.tpl:31 views/html/quests/quest.tpl:58 #: views/html/quests/submissions.tpl:20 msgid "unsolved" msgstr "Leider falsch!" -#: views/ajax/quests/index.tpl:9 views/html/quests/index.tpl:27 +#: views/ajax/quests/index.tpl:9 views/html/quests/create.tpl:79 +#: views/html/quests/edit.tpl:82 views/html/quests/index.tpl:27 #: views/html/quests/index.tpl:59 msgid "Questtype Empty" msgstr "Leere Aufgabe" -#: views/ajax/quests/index.tpl:11 views/html/quests/index.tpl:29 +#: views/ajax/quests/index.tpl:11 views/html/quests/create.tpl:81 +#: views/html/quests/edit.tpl:84 views/html/quests/index.tpl:29 #: views/html/quests/index.tpl:61 msgid "Questtype bossfight" msgstr "Boss-Fight" -#: views/ajax/quests/index.tpl:13 views/html/quests/index.tpl:31 +#: views/ajax/quests/index.tpl:13 views/html/quests/create.tpl:83 +#: views/html/quests/edit.tpl:86 views/html/quests/index.tpl:31 #: views/html/quests/index.tpl:63 msgid "Questtype choiceinput" msgstr "Auswahleingabe" -#: views/ajax/quests/index.tpl:15 views/html/quests/index.tpl:33 +#: views/ajax/quests/index.tpl:15 views/html/quests/create.tpl:85 +#: views/html/quests/edit.tpl:88 views/html/quests/index.tpl:33 #: views/html/quests/index.tpl:65 msgid "Questtype crossword" msgstr "Kreuzworträtsel" -#: views/ajax/quests/index.tpl:17 views/html/quests/index.tpl:35 +#: views/ajax/quests/index.tpl:17 views/html/quests/create.tpl:87 +#: views/html/quests/edit.tpl:90 views/html/quests/index.tpl:35 #: views/html/quests/index.tpl:67 msgid "Questtype dragndrop" msgstr "Drag&Drop" -#: views/ajax/quests/index.tpl:19 views/html/quests/index.tpl:37 +#: views/ajax/quests/index.tpl:19 views/html/quests/create.tpl:89 +#: views/html/quests/edit.tpl:92 views/html/quests/index.tpl:37 #: views/html/quests/index.tpl:69 msgid "Questtype multiplechoice" msgstr "Multiple Choice" -#: views/ajax/quests/index.tpl:21 views/html/quests/index.tpl:39 +#: views/ajax/quests/index.tpl:21 views/html/quests/create.tpl:91 +#: views/html/quests/edit.tpl:94 views/html/quests/index.tpl:39 #: views/html/quests/index.tpl:71 msgid "Questtype submit" msgstr "Abgabeaufgabe" -#: views/ajax/quests/index.tpl:23 views/html/quests/index.tpl:41 +#: views/ajax/quests/index.tpl:23 views/html/quests/create.tpl:93 +#: views/html/quests/edit.tpl:96 views/html/quests/index.tpl:41 #: views/html/quests/index.tpl:73 msgid "Questtype textinput" msgstr "Texteingabe" @@ -453,8 +464,7 @@ msgstr "Icon" #: views/html/charactergroups/editgroupsgroup.tpl:46 #: views/html/charactergroups/editgroupsgroup.tpl:47 #: views/html/charactertypes/manage.tpl:88 -#: views/html/charactertypes/manage.tpl:89 views/html/quests/create.tpl:15 -#: views/html/quests/create.tpl:16 views/html/users/user.tpl:23 +#: views/html/charactertypes/manage.tpl:89 views/html/users/user.tpl:23 msgid "Name" msgstr "Name" @@ -472,7 +482,7 @@ msgstr "Motto" #: views/html/charactertypes/manage.tpl:91 views/html/library/create.tpl:46 #: views/html/library/edit.tpl:124 views/html/questgroups/create.tpl:76 #: views/html/questgroupshierarchy/create.tpl:63 -#: views/html/quests/create.tpl:43 views/html/seminaries/create.tpl:75 +#: views/html/quests/create.tpl:110 views/html/seminaries/create.tpl:75 #: views/html/users/create.tpl:96 msgid "create" msgstr "erstellen" @@ -504,7 +514,8 @@ msgstr "Soll die %s-Gruppen „%s“ wirklich gelöscht werden?" #: views/html/library/delete.tpl:14 views/html/library/edit.tpl:83 #: views/html/questgroups/delete.tpl:17 #: views/html/questgroupshierarchy/delete.tpl:14 -#: views/html/seminaries/delete.tpl:13 views/html/users/delete.tpl:11 +#: views/html/quests/delete.tpl:11 views/html/seminaries/delete.tpl:13 +#: views/html/users/delete.tpl:11 msgid "delete" msgstr "löschen" @@ -514,7 +525,8 @@ msgstr "löschen" #: views/html/characters/delete.tpl:18 views/html/library/delete.tpl:15 #: views/html/questgroups/delete.tpl:18 #: views/html/questgroupshierarchy/delete.tpl:15 -#: views/html/seminaries/delete.tpl:14 views/html/users/delete.tpl:12 +#: views/html/quests/delete.tpl:12 views/html/seminaries/delete.tpl:14 +#: views/html/users/delete.tpl:12 msgid "cancel" msgstr "abbrechen" @@ -538,7 +550,7 @@ msgstr "%s-Gruppe bearbeiten" #: views/html/charactergroups/editgroupsgroup.tpl:50 #: views/html/charactergroupsquests/edit.tpl:94 #: views/html/characters/edit.tpl:108 views/html/questgroups/edit.tpl:64 -#: views/html/questgroupshierarchy/edit.tpl:57 +#: views/html/questgroupshierarchy/edit.tpl:57 views/html/quests/edit.tpl:113 #: views/html/seminaries/edit.tpl:77 msgid "edit" msgstr "bearbeiten" @@ -587,8 +599,9 @@ msgstr "%squests" #: views/html/charactergroupsquests/edit.tpl:78 #: views/html/characters/index.tpl:23 views/html/characters/index.tpl:84 #: views/html/characters/manage.tpl:17 -#: views/html/questgroups/questgroup.tpl:56 views/html/quests/create.tpl:29 -#: views/html/quests/create.tpl:30 +#: 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 msgid "XPs" msgstr "XP" @@ -619,8 +632,8 @@ msgid "Add Characters" msgstr "Füge Charaktere hinzu" #: views/html/charactergroups/managegroup.tpl:59 -#: views/html/questgroups/questgroup.tpl:102 views/html/quests/create.tpl:9 -#: views/html/quests/index.tpl:9 +#: views/html/questgroups/questgroup.tpl:21 +#: views/html/questgroups/questgroup.tpl:108 views/html/quests/index.tpl:9 msgid "Quests" msgstr "Quests" @@ -634,6 +647,7 @@ msgstr "Neue %s-Quest" #: views/html/library/create.tpl:22 views/html/library/edit.tpl:22 #: views/html/library/edit.tpl:62 views/html/library/edit.tpl:100 #: views/html/questgroups/create.tpl:33 views/html/questgroups/edit.tpl:30 +#: views/html/quests/create.tpl:30 views/html/quests/edit.tpl:30 #: views/html/seminaries/create.tpl:30 views/html/seminaries/edit.tpl:32 #, php-format msgid "Title is too short (min. %d chars)" @@ -644,6 +658,7 @@ msgstr "Der Titel ist zu kurz (min. %d Zeichen)" #: views/html/library/create.tpl:24 views/html/library/edit.tpl:24 #: views/html/library/edit.tpl:64 views/html/library/edit.tpl:102 #: views/html/questgroups/create.tpl:35 views/html/questgroups/edit.tpl:32 +#: views/html/quests/create.tpl:32 views/html/quests/edit.tpl:32 #: views/html/seminaries/create.tpl:32 views/html/seminaries/edit.tpl:34 #, php-format msgid "Title is too long (max. %d chars)" @@ -654,6 +669,7 @@ msgstr "Der Titel ist zu lang (max. %d Zeichen)" #: views/html/library/create.tpl:26 views/html/library/edit.tpl:26 #: views/html/library/edit.tpl:66 views/html/library/edit.tpl:104 #: views/html/questgroups/create.tpl:37 views/html/questgroups/edit.tpl:34 +#: views/html/quests/create.tpl:34 views/html/quests/edit.tpl:34 #: views/html/seminaries/create.tpl:34 views/html/seminaries/edit.tpl:36 msgid "Title contains illegal characters" msgstr "Der Titel enthält ungültige Zeichen" @@ -663,6 +679,7 @@ msgstr "Der Titel enthält ungültige Zeichen" #: views/html/library/create.tpl:28 views/html/library/edit.tpl:28 #: views/html/library/edit.tpl:68 views/html/library/edit.tpl:106 #: views/html/questgroups/create.tpl:39 views/html/questgroups/edit.tpl:36 +#: views/html/quests/create.tpl:36 views/html/quests/edit.tpl:36 #: views/html/seminaries/create.tpl:36 views/html/seminaries/edit.tpl:38 msgid "Title already exists" msgstr "Der Titel existiert bereits" @@ -672,23 +689,27 @@ msgstr "Der Titel existiert bereits" #: views/html/library/create.tpl:30 views/html/library/edit.tpl:30 #: views/html/library/edit.tpl:70 views/html/library/edit.tpl:108 #: views/html/questgroups/create.tpl:41 views/html/questgroups/edit.tpl:38 +#: views/html/quests/create.tpl:38 views/html/quests/edit.tpl:38 #: views/html/seminaries/create.tpl:38 views/html/seminaries/edit.tpl:40 msgid "Title invalid" msgstr "Der Titel ist ungültig" #: views/html/charactergroupsquests/create.tpl:47 #: views/html/charactergroupsquests/edit.tpl:47 +#: views/html/quests/create.tpl:43 views/html/quests/edit.tpl:43 #, php-format msgid "XPs not set" 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 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 msgid "XPs invalid" msgstr "Die XP-Angabe ist ungültig" @@ -701,7 +722,9 @@ msgstr "Die XP-Angabe ist ungültig" #: views/html/library/edit.tpl:121 views/html/library/edit.tpl:122 #: views/html/questgroups/create.tpl:73 views/html/questgroups/create.tpl:74 #: views/html/questgroups/edit.tpl:61 views/html/questgroups/edit.tpl:62 -#: views/html/questgroups/questgroup.tpl:82 views/html/quests/index.tpl:47 +#: views/html/questgroups/questgroup.tpl:88 views/html/quests/create.tpl:70 +#: views/html/quests/create.tpl:71 views/html/quests/edit.tpl:73 +#: views/html/quests/edit.tpl:74 views/html/quests/index.tpl:47 #: views/html/quests/index.tpl:48 views/html/seminaries/create.tpl:68 #: views/html/seminaries/create.tpl:69 views/html/seminaries/edit.tpl:70 #: views/html/seminaries/edit.tpl:71 views/html/seminaries/seminary.tpl:69 @@ -710,8 +733,7 @@ msgstr "Titel" #: views/html/charactergroupsquests/create.tpl:78 #: views/html/charactergroupsquests/edit.tpl:79 -#: views/html/questgroups/create.tpl:58 views/html/quests/create.tpl:17 -#: views/html/quests/index.tpl:14 +#: views/html/questgroups/create.tpl:58 views/html/quests/index.tpl:14 msgid "Questgroup" msgstr "Questgruppe" @@ -1148,33 +1170,37 @@ msgstr "Soll das die Questgruppe „%s“ wirklich gelöscht werden?" msgid "Edit Questgroup" msgstr "Questgruppe bearbeiten" -#: views/html/questgroups/questgroup.tpl:34 +#: views/html/questgroups/questgroup.tpl:17 +msgid "Create new Quest" +msgstr "Neue Quest erstellen" + +#: views/html/questgroups/questgroup.tpl:40 #: views/html/questgroupshierarchy/edit.tpl:11 #: views/html/seminaries/seminary.tpl:28 msgid "Edit Questgroupshierarchy" msgstr "Hierarchie bearbeiten" -#: views/html/questgroups/questgroup.tpl:35 +#: views/html/questgroups/questgroup.tpl:41 #: views/html/questgroupshierarchy/delete.tpl:11 #: views/html/seminaries/seminary.tpl:29 msgid "Delete Questgroupshierarchy" msgstr "Hierarchie löschen" -#: views/html/questgroups/questgroup.tpl:60 +#: views/html/questgroups/questgroup.tpl:66 msgid "Found optional Questline" msgstr "Optionale Questline gefunden" -#: views/html/questgroups/questgroup.tpl:83 +#: views/html/questgroups/questgroup.tpl:89 #: views/html/seminaries/seminary.tpl:70 msgid "Add new Questgroup" msgstr "Neue Questgruppe hinzufügen" -#: views/html/questgroups/questgroup.tpl:92 +#: views/html/questgroups/questgroup.tpl:98 #: views/html/seminaries/seminary.tpl:80 msgid "New Questgroupshierarchy" msgstr "Neue Hierarchie" -#: views/html/questgroups/questgroup.tpl:93 +#: views/html/questgroups/questgroup.tpl:99 #: views/html/questgroupshierarchy/create.tpl:52 #: views/html/questgroupshierarchy/create.tpl:53 #: views/html/questgroupshierarchy/edit.tpl:52 @@ -1183,7 +1209,7 @@ msgstr "Neue Hierarchie" msgid "Title (singular)" msgstr "Titel (singular)" -#: views/html/questgroups/questgroup.tpl:94 +#: views/html/questgroups/questgroup.tpl:100 #: views/html/questgroupshierarchy/create.tpl:54 #: views/html/questgroupshierarchy/create.tpl:55 #: views/html/questgroupshierarchy/edit.tpl:54 @@ -1192,7 +1218,7 @@ msgstr "Titel (singular)" msgid "Title (plural)" msgstr "Titel (plural)" -#: views/html/questgroups/questgroup.tpl:96 +#: views/html/questgroups/questgroup.tpl:102 #: views/html/seminaries/seminary.tpl:83 msgid "Add new Questgroupshierarchy" msgstr "Neue Hierarchy hinzufügen" @@ -1250,21 +1276,57 @@ msgstr "Der Titel (plural) ist ungültig" msgid "Should the Questgroupshierarchy “%s” really be deleted?" msgstr "Soll die Hierarchie „%s“ wirklich gelöscht werden?" -#: views/html/quests/create.tpl:11 +#: views/html/quests/create.tpl:8 msgid "Create Quest" msgstr "Quest erstellen" -#: views/html/quests/create.tpl:37 +#: views/html/quests/create.tpl:19 views/html/quests/edit.tpl:19 +#, php-format +msgid "Error during picture upload: %s" +msgstr "Fehler beim Bildupload: %s" + +#: views/html/quests/create.tpl:21 views/html/quests/edit.tpl:21 +#, php-format +msgid "Picture has wrong type “%s”" +msgstr "Der Bildtyp „%s“ ist nicht erlaubt" + +#: views/html/quests/create.tpl:23 views/html/quests/edit.tpl:23 +msgid "Picture exceeds size maximum" +msgstr "Das Bild ist zu groß" + +#: views/html/quests/create.tpl:25 views/html/quests/edit.tpl:25 +msgid "Picture invalid" +msgstr "Das Bild ist ungültig" + +#: views/html/quests/create.tpl:60 views/html/quests/edit.tpl:63 +msgid "Picture" +msgstr "Bild" + +#: views/html/quests/create.tpl:103 views/html/quests/edit.tpl:106 msgid "Entry text" msgstr "Einstiegstext" -#: views/html/quests/create.tpl:39 +#: views/html/quests/create.tpl:105 views/html/quests/edit.tpl:108 +#: views/html/quests/quest.tpl:49 +msgid "Task" +msgstr "Aufgabe" + +#: views/html/quests/create.tpl:108 views/html/quests/edit.tpl:111 msgid "Wrong text" msgstr "Text für falsche Antwort" -#: views/html/quests/create.tpl:40 views/html/quests/quest.tpl:41 -msgid "Task" -msgstr "Aufgabe" +#: views/html/quests/delete.tpl:8 views/html/quests/quest.tpl:13 +msgid "Delete Quest" +msgstr "Quest löschen" + +#: views/html/quests/delete.tpl:9 +#, php-format +msgid "Should the Quest “%s” really be deleted?" +msgstr "Soll die Quest „%s“ wirklich gelöscht werden?" + +#: views/html/quests/edit.tpl:8 views/html/quests/quest.tpl:11 +msgid "Edit Quest" +msgstr "Quest bearbeiten" #: views/html/quests/index.tpl:16 views/html/quests/index.tpl:23 msgid "all" @@ -1278,44 +1340,44 @@ msgstr "Questtyp" msgid "open submissions" msgstr "offene Lösungsvorschläge" -#: views/html/quests/quest.tpl:11 +#: views/html/quests/quest.tpl:19 msgid "Prolog" msgstr "Prolog" -#: views/html/quests/quest.tpl:46 +#: views/html/quests/quest.tpl:54 msgid "Quest completed." msgstr "Quest abgeschlossen." -#: views/html/quests/quest.tpl:46 +#: views/html/quests/quest.tpl:54 #, php-format msgid "You have earned %d XPs." msgstr "Du hast %d XP erhalten." -#: views/html/quests/quest.tpl:62 +#: views/html/quests/quest.tpl:70 msgid "Task already successfully solved" msgstr "Du hast die Aufgabe bereits erfolgreich gelöst" -#: views/html/quests/quest.tpl:64 +#: views/html/quests/quest.tpl:72 msgid "Show answer" msgstr "Lösung anzeigen" -#: views/html/quests/quest.tpl:74 +#: views/html/quests/quest.tpl:82 msgid "Epilog" msgstr "Epilog" -#: views/html/quests/quest.tpl:100 +#: views/html/quests/quest.tpl:108 msgid "Continuation" msgstr "Setze deine Reise fort" -#: views/html/quests/quest.tpl:107 views/html/quests/quest.tpl:123 +#: views/html/quests/quest.tpl:115 views/html/quests/quest.tpl:131 msgid "Quest" msgstr "Quest" -#: views/html/quests/quest.tpl:125 +#: views/html/quests/quest.tpl:133 msgid "Go on" msgstr "Fortfahren" -#: views/html/quests/quest.tpl:134 views/html/seminaries/seminary.tpl:52 +#: views/html/quests/quest.tpl:142 views/html/seminaries/seminary.tpl:52 msgid "Let’s go" msgstr "Auf ins Abenteuer!" diff --git a/models/QuestsModel.inc b/models/QuestsModel.inc index 759be988..bab9c992 100644 --- a/models/QuestsModel.inc +++ b/models/QuestsModel.inc @@ -198,6 +198,26 @@ $questId ); } + + + /** + * Set the previous Quest for a Quest. + * + * @param int $questId ID of Quest to set previous Quest for + * @param int $previousQuestId Id of previous Quest + */ + public function setPreviousQuest($questId, $previousQuestId) + { + $this->db->query( + 'REPLACE INTO quests_previousquests '. + '(quest_id, previous_quest_id) '. + 'VALUES '. + '(?, ?)', + 'ii', + $questId, + $previousQuestId + ); + } /** @@ -528,34 +548,80 @@ } + /** + * Check if a Quest title already exists. + * + * @param string $title Quest title to check + * @param int $seminaryId ID of Seminary + * @param int $questId Do not check this ID (for editing) + * @return boolean Whether Quest title exists or not + */ + public function questTitleExists($title, $seminaryId, $questId=null) + { + $data = $this->db->query( + 'SELECT quests.id '. + 'FROM quests '. + 'INNER JOIN questgroups ON questgroups.id = quests.questgroup_id '. + 'WHERE questgroups.seminary_id = ? AND (quests.title = ? OR quests.url = ?)', + 'iss', + $seminaryId, + $title, + \nre\core\Linker::createLinkParam($title) + ); + + return (!empty($data) && (is_null($questId) || $questId != $data[0]['id'])); + } + + /** * Create a new Quest. * * @param int $userId User-ID that creates the new character - * @param string $name Name for new Quest * @param int $questgroupId ID of Questgroup * @param int $questtypeId ID of Questtype + * @param string $title Title for new Quest * @param int $xps XPs for new Quest + * @param string $task Task for new Quest * @param string $entrytext Entrytext for new Quest * @param string $wrongtext Wrongtext for new Quest - * @param string $task Task for new Quest * @return int ID of new Quest */ - public function createQuest($userId, $name, $questgroupId, $questtypeId, $xps, $entrytext, $wrongtext, $task) + public function createQuest($userId, $questgroupId, $questtypeId, $title, $xps, $task, $entrytext, $wrongtext) { - $this->db->query( - 'INSERT INTO quests '. - '(created_user_id, questgroup_id, questtype_id, title, url, xps, entry_text, wrong_text, task) '. - 'VALUES '. - '(?, ?, ?, ?, ?, ?, ?, ?, ?)', - 'iiississs', - $userId, $questgroupId, $questtypeId, - $name, \nre\core\Linker::createLinkParam($name), - $xps, $entrytext, $wrongtext, $task - ); - - - return $this->db->getInsertId(); + $questId = null; + $this->db->setAutocommit(false); + try { + // Get last Quests of Questgroup + $lastQuests = $this->getLastQuestsOfQuestgroup($questgroupId); + + // Create Quest + $this->db->query( + 'INSERT INTO quests '. + '(created_user_id, questgroup_id, questtype_id, title, url, xps, entry_text, wrong_text, task) '. + 'VALUES '. + '(?, ?, ?, ?, ?, ?, ?, ?, ?)', + 'iiississs', + $userId, $questgroupId, $questtypeId, + $title, \nre\core\Linker::createLinkParam($title), + $xps, $entrytext, $wrongtext, $task + ); + $questId = $this->db->getInsertId(); + + // Set previous Quest + if(count($lastQuests) > 0) { + $this->setPreviousQuest($questId, $lastQuests[0]['id']); + } + + $this->db->commit(); + } + catch(\Exception $e) { + $this->db->rollback(); + $this->db->setAutocommit(true); + throw $e; + } + + $this->db->setAutocommit(true); + return $questId; } @@ -576,6 +642,69 @@ $questId ); } + + + /** + * Edit a new Quest. + * + * @param int $questId ID of Quest to edit + * @param int $questtypeId ID of Questtype + * @param string $title New title for Quest + * @param int $xps XPs for Quest + * @param string $task New task for Quest + * @param string $entrytext New entrytext for Quest + * @param string $wrongtext New wrongtext for Quest + */ + public function editQuest($questId, $questtypeId, $title, $xps, $task, $entrytext, $wrongtext) + { + $this->db->query( + 'UPDATE quests '. + 'SET questtype_id = ?, title = ?, url = ?, xps = ?, entry_text = ?, wrong_text = ?, task = ? '. + 'WHERE id = ?', + 'ississsi', + $questtypeId, + $title, + \nre\core\Linker::createLinkParam($title), + $xps, + $entrytext, + $wrongtext, + $task, + $questId + ); + } + + + /** + * Delete a Quest of a Seminary. + * + * @param int $questId ID of Quest to delete + */ + public function deleteQuest($questId) + { + $this->db->setAutocommit(false); + try { + // Set previous Quests of following Quests + $previousQuests = $this->getPreviousQuests($questId); + $nextQuests = $this->getNextQuests($questId); + foreach($nextQuests as &$nextQuest) { + foreach($previousQuests as &$previousQuest) { + $this->setPreviousQuest($nextQuest['id'], $previousQuest['id']); + } + } + + // Delete Quest + $this->db->query('DELETE FROM quests WHERE id = ?', 'i', $questId); + + $this->db->commit(); + } + catch(\Exception $e) { + $this->db->rollback(); + $this->db->setAutocommit(true); + throw $e; + } + + $this->db->setAutocommit(true); + } } diff --git a/views/html/quests/create.tpl b/views/html/quests/create.tpl index 5bf22ea8..534be3b2 100644 --- a/views/html/quests/create.tpl +++ b/views/html/quests/create.tpl @@ -1,44 +1,111 @@ - +
- +
+ -

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

:

+
    + +
  • 0) : ?>(  MiB)
  • -
    - -
    - -
    -
    +
-
-
+ + />
+ + />
+ + +
+
+
-
-
-
+
+
-
+
+
+
diff --git a/views/html/quests/delete.tpl b/views/html/quests/delete.tpl new file mode 100644 index 00000000..27d25eed --- /dev/null +++ b/views/html/quests/delete.tpl @@ -0,0 +1,13 @@ + +
+ +
+ + + +

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

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

:

+
    + +
  • 0) : ?>(  MiB)
  • + +
+
+
+ + />
+ + />
+ + +
+
+ +
+
+ +
+
+
+
+
+ +
diff --git a/views/html/quests/quest.tpl b/views/html/quests/quest.tpl index e682da5a..6c59203b 100644 --- a/views/html/quests/quest.tpl +++ b/views/html/quests/quest.tpl @@ -6,6 +6,14 @@

+ 0) : ?> + + 0) : ?>