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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 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) : ?>