implement CRUD for Quest texts (issue #36)

This commit is contained in:
coderkun 2014-07-04 13:54:57 +02:00
commit 23841c6aff
9 changed files with 440 additions and 65 deletions

View file

@ -68,6 +68,15 @@
} }
/**
* Action: edittexts.
*/
public function edittexts(\nre\core\Request $request, \nre\core\Response $response)
{
$this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4), true);
}
/** /**
* Action: delete. * Action: delete.
*/ */

View file

@ -240,11 +240,11 @@
array('^questgroups/([^/]+)/create/?$', 'questgroups/create/$1', true), array('^questgroups/([^/]+)/create/?$', 'questgroups/create/$1', true),
array('^questgroups/([^/]+)/([^/]+)/(edit|edittexts|delete|moveup|movedown)/?$', 'questgroups/$3/$1/$2', true), array('^questgroups/([^/]+)/([^/]+)/(edit|edittexts|delete|moveup|movedown)/?$', 'questgroups/$3/$1/$2', true),
array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true), array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true),
array('^quests/([^/]+)/?$', 'quests/index/$1', true), array('^quests/([^/]+)/?$', 'quests/index/$1', true),
array('^quests/([^/]+)/all/?$', 'quests/index/$1/all', true), array('^quests/([^/]+)/all/?$', 'quests/index/$1/all', true),
array('^quests/([^/]+)/([^/]+)/(create|createmedia)/?$', 'quests/$3/$1/$2', true), array('^quests/([^/]+)/([^/]+)/(create|createmedia)/?$', 'quests/$3/$1/$2', true),
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions|edit|delete)/?$', 'quests/$4/$1/$2/$3', true), array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions|edit|edittexts|delete)/?$', 'quests/$4/$1/$2/$3', true),
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submission)/([^/]+)/?$', 'quests/$4/$1/$2/$3/$5', true), array('^quests/([^/]+)/([^/]+)/([^/]+)/(submission)/([^/]+)/?$', 'quests/$4/$1/$2/$3/$5', true),
array('^quests/(?!(index|create|createmedia))/?', 'quests/quest/$1', true), array('^quests/(?!(index|create|createmedia))/?', 'quests/quest/$1', true),
array('^characters/([^/]+)/(register|manage)/?$', 'characters/$2/$1', true), array('^characters/([^/]+)/(register|manage)/?$', 'characters/$2/$1', true),
array('^characters/([^/]+)/?$', 'characters/index/$1', true), array('^characters/([^/]+)/?$', 'characters/index/$1', true),
@ -287,11 +287,11 @@
array('^questgroups/create/(.*)$', 'questgroups/$1/create', true), array('^questgroups/create/(.*)$', 'questgroups/$1/create', true),
array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true), array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true),
array('^questgroups/(edit|edittexts|delete|moveup|movedown)/(.*)$', 'questgroups/$2/$1', true), array('^questgroups/(edit|edittexts|delete|moveup|movedown)/(.*)$', 'questgroups/$2/$1', true),
array('^quests/index/(.+)$', 'quests/$1', true), array('^quests/index/(.+)$', 'quests/$1', true),
array('^quests/quest/(.*)$', 'quests/$1', true), array('^quests/quest/(.*)$', 'quests/$1', true),
array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true), array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true),
array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true), array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true),
array('^quests/(submission|edit|delete)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$', 'quests/$2/$3/$4/$1/$5', true), array('^quests/(submission|edit|edittexts|delete)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$', 'quests/$2/$3/$4/$1/$5', true),
array('^characters/(index|character)/(.*)$', 'characters/$2', true), array('^characters/(index|character)/(.*)$', 'characters/$2', true),
array('^characters/(register|manage)/([^/]+)$', 'characters/$2/$1', true), array('^characters/(register|manage)/([^/]+)$', 'characters/$2/$1', true),
array('^characters/(edit|delete)/([^/]+)/([^/]+)$', 'characters/$2/$3/$1', true), array('^characters/(edit|delete)/([^/]+)/([^/]+)$', 'characters/$2/$3/$1', true),

View file

@ -43,6 +43,7 @@
'submission' => array('admin', 'moderator', 'user'), 'submission' => array('admin', 'moderator', 'user'),
'create' => array('admin', 'moderator', 'user'), 'create' => array('admin', 'moderator', 'user'),
'edit' => array('admin', 'moderator', 'user'), 'edit' => array('admin', 'moderator', 'user'),
'edittexts' => array('admin', 'moderator', 'user'),
'delete' => array('admin', 'moderator', 'user') 'delete' => array('admin', 'moderator', 'user')
); );
/** /**
@ -57,6 +58,7 @@
'submission' => array('admin', 'moderator'), 'submission' => array('admin', 'moderator'),
'create' => array('admin', 'moderator'), 'create' => array('admin', 'moderator'),
'edit' => array('admin', 'moderator'), 'edit' => array('admin', 'moderator'),
'edittexts' => array('admin', 'moderator'),
'delete' => array('admin') 'delete' => array('admin')
); );
@ -769,6 +771,227 @@
} }
/**
* Action: edittexts.
*
* Edit the texts of 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 edittexts($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 Questtexts
$questtextTypes = $this->Questtexts->getQuesttexttypes();
foreach($questtextTypes as &$questtextType)
{
$questtextType['texts'] = $this->Questtexts->getQuesttextsOfQuest($quest['id'], $questtextType['url']);
foreach($questtextType['texts'] as &$questtext)
{
if(!is_null($questtext['questsmedia_id'])) {
$questtext['media'] = $this->Media->getSeminaryMediaById($questtext['questsmedia_id']);
}
}
}
// Get allowed mimetypes
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
// Check request method
$validations = array();
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
{
$media = $_FILES['media'];
$texts = $this->request->getPostParam('questtexts');
$deleteTexts = $this->request->getPostParam('deletes');
if(!is_array($deleteTexts)) {
$deleteTexts = array();
}
foreach($questtextTypes as &$type)
{
// Edit or delete texts
if(!array_key_exists($type['url'], $texts)) {
continue;
}
foreach($type['texts'] as &$text)
{
if(array_key_exists($type['url'], $deleteTexts) && array_key_exists($text['id'], $deleteTexts[$type['url']]))
{
// Delete text
$this->Questtexts->deleteQuesttext($text);
//unset($texts[$type['url']][$text['id']]);
}
elseif(array_key_exists($type['url'], $texts) && array_key_exists($text['id'], $texts[$type['url']]))
{
// Edit text
$this->Questtexts->editQuesttext($text['id'], $texts[$type['url']][$text['id']]);
// Validate medium
$medium = null;
$validation = true;
if(!empty($media) && array_key_exists($type['url'], $media['error']) && array_key_exists($text['id'], $media['error'][$type['url']]) && $media['error'][$type['url']][$text['id']] != UPLOAD_ERR_NO_FILE)
{
$medium = array(
'name' => $media['name'][$type['url']][$text['id']],
'tmp_name' => $media['tmp_name'][$type['url']][$text['id']],
'type' => $media['type'][$type['url']][$text['id']],
'size' => $media['size'][$type['url']][$text['id']],
'error' => $media['error'][$type['url']][$text['id']]
);
// Check error
if($medium['error'] !== UPLOAD_ERR_OK) {
$validation = $this->Validation->addValidationResult($validation, 'media', 'error', $medium);
}
// Check mimetype
$mediaMimetype = null;
$medium['mimetype'] = \hhu\z\Utils::getMimetype($medium['tmp_name'], $medium['type']);
foreach($mimetypes as &$mimetype) {
if($mimetype['mimetype'] == $medium['mimetype']) {
$mediaMimetype = $mimetype;
break;
}
}
if(is_null($mediaMimetype)) {
$validation = $this->Validation->addValidationResult($validation, 'media', 'mimetype', $medium['mimetype']);
}
elseif($medium['size'] > $mediaMimetype['size']) {
$validation = $this->Validation->addValidationResult($validation, 'media', 'size', $mediaMimetype['size']);
}
}
$validations[$type['url']][$text['id']] = $validation;
// Upload medium
if(!is_null($medium) && $validation === true)
{
$questsmediaId = $this->Media->createQuestMedia(
$this->Auth->getUserId(),
$seminary['id'],
sprintf('questtext-%d-%d', $quest['id'], $text['id']),
$medium['name'],
$medium['type'],
$medium['tmp_name']
);
if($questsmediaId > 0) {
$this->Questtexts->setQuestmedia($text['id'], $questsmediaId);
}
}
// Remove text from list
//unset($texts[$type['url']][$text['id']]);
}
}
// Add new text
if(array_key_exists($type['url'], $texts) && array_key_exists('new', $texts[$type['url']]))
{
$text = $texts[$type['url']]['new'];
if(!empty($text))
{
// Add text
$questtextId = $this->Questtexts->addQuesttextToQuest(
$this->Auth->getUserId(),
$quest['id'],
$type['url'],
$text
);
// Validate medium
$medium = null;
$validation = true;
if(!empty($media) && array_key_exists($type['url'], $media['error']) && array_key_exists('new', $media['error'][$type['url']]) && $media['error'][$type['url']]['new'] != UPLOAD_ERR_NO_FILE)
{
$medium = array(
'name' => $media['name'][$type['url']]['new'],
'tmp_name' => $media['tmp_name'][$type['url']]['new'],
'type' => $media['type'][$type['url']]['new'],
'size' => $media['size'][$type['url']]['new'],
'error' => $media['error'][$type['url']]['new']
);
// Check error
if($medium['error'] !== UPLOAD_ERR_OK) {
$validation = $this->Validation->addValidationResult($validation, 'media', 'error', $medium);
}
// Check mimetype
$mediaMimetype = null;
$medium['mimetype'] = \hhu\z\Utils::getMimetype($medium['tmp_name'], $medium['type']);
foreach($mimetypes as &$mimetype) {
if($mimetype['mimetype'] == $medium['mimetype']) {
$mediaMimetype = $mimetype;
break;
}
}
if(is_null($mediaMimetype)) {
$validation = $this->Validation->addValidationResult($validation, 'media', 'mimetype', $medium['mimetype']);
}
elseif($medium['size'] > $mediaMimetype['size']) {
$validation = $this->Validation->addValidationResult($validation, 'media', 'size', $mediaMimetype['size']);
}
}
$validations[$type['url']]['new'] = $validation;
// Upload medium
if(!is_null($medium) && $validation === true)
{
$questsmediaId = $this->Media->createQuestMedia(
$this->Auth->getUserId(),
$seminary['id'],
sprintf('questtext-%d-%d', $quest['id'], $questtextId),
$medium['name'],
$medium['type'],
$medium['tmp_name']
);
if($questsmediaId > 0) {
$this->Questtexts->setQuestmedia($questtextId, $questsmediaId);
}
}
}
}
// Reload texts
$type['texts'] = $this->Questtexts->getQuesttextsOfQuest($quest['id'], $type['url']);
foreach($type['texts'] as &$questtext)
{
if(!is_null($questtext['questsmedia_id'])) {
$questtext['media'] = $this->Media->getSeminaryMediaById($questtext['questsmedia_id']);
}
}
}
}
// Set titile
$this->addTitleLocalized('Edit Quest texts');
$this->addTitle($seminary['title']);
// Pass data to view
$this->set('seminary', $seminary);
$this->set('questgroup', $questgroup);
$this->set('quest', $quest);
$this->set('questtexttypes', $questtextTypes);
$this->set('mimetypes', $mimetypes);
$this->set('validations', $validations);
}
/** /**
* Action: delete. * Action: delete.
* *

View file

@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: The Legend of Z\n" "Project-Id-Version: The Legend of Z\n"
"POT-Creation-Date: 2014-07-01 15:40+0100\n" "POT-Creation-Date: 2014-07-01 23:17+0100\n"
"PO-Revision-Date: 2014-07-01 15:41+0100\n" "PO-Revision-Date: 2014-07-01 23:17+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: de_DE\n" "Language: de_DE\n"
@ -63,8 +63,8 @@ msgstr "Neuer Lösungsvorschlag"
msgid "Character submission approved" msgid "Character submission approved"
msgstr "Lösungsvorschlag bewertet" msgstr "Lösungsvorschlag bewertet"
#: controllers/QuestsController.inc:1004 #: controllers/QuestsController.inc:1107
#: questtypes/submit/html/submission.tpl:30 views/html/quests/quest.tpl:53 #: questtypes/submit/html/submission.tpl:30 views/html/quests/quest.tpl:54
#: views/html/quests/submissions.tpl:30 #: views/html/quests/submissions.tpl:30
msgid "solved" msgid "solved"
msgstr "Richtig!" msgstr "Richtig!"
@ -76,7 +76,7 @@ msgstr "Richtig!"
msgid "lost" msgid "lost"
msgstr "verloren" msgstr "verloren"
#: questtypes/bossfight/html/quest.tpl:41 views/html/quests/quest.tpl:128 #: questtypes/bossfight/html/quest.tpl:41 views/html/quests/quest.tpl:129
msgid "Choose" msgid "Choose"
msgstr "Wählen" msgstr "Wählen"
@ -191,7 +191,7 @@ msgstr "Bewertet von %s am %s um %s Uhr"
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: questtypes/submit/html/submission.tpl:31 views/html/quests/quest.tpl:58 #: questtypes/submit/html/submission.tpl:31 views/html/quests/quest.tpl:59
#: views/html/quests/submissions.tpl:20 #: views/html/quests/submissions.tpl:20
msgid "unsolved" msgid "unsolved"
msgstr "Leider falsch!" msgstr "Leider falsch!"
@ -482,7 +482,7 @@ msgstr "Motto"
#: views/html/charactertypes/manage.tpl:91 views/html/library/create.tpl:46 #: 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/library/edit.tpl:124 views/html/questgroups/create.tpl:76
#: views/html/questgroupshierarchy/create.tpl:63 #: views/html/questgroupshierarchy/create.tpl:63
#: views/html/quests/create.tpl:110 views/html/seminaries/create.tpl:75 #: views/html/quests/create.tpl:108 views/html/seminaries/create.tpl:75
#: views/html/users/create.tpl:96 #: views/html/users/create.tpl:96
msgid "create" msgid "create"
msgstr "erstellen" msgstr "erstellen"
@ -513,9 +513,10 @@ msgstr "Soll die %s-Gruppen „%s“ wirklich gelöscht werden?"
#: views/html/characters/delete.tpl:17 views/html/charactertypes/manage.tpl:48 #: views/html/characters/delete.tpl:17 views/html/charactertypes/manage.tpl:48
#: views/html/library/delete.tpl:14 views/html/library/edit.tpl:83 #: views/html/library/delete.tpl:14 views/html/library/edit.tpl:83
#: views/html/questgroups/delete.tpl:17 #: views/html/questgroups/delete.tpl:17
#: views/html/questgroups/edittexts.tpl:16
#: views/html/questgroupshierarchy/delete.tpl:14 #: views/html/questgroupshierarchy/delete.tpl:14
#: views/html/quests/delete.tpl:11 views/html/seminaries/delete.tpl:13 #: views/html/quests/delete.tpl:11 views/html/quests/edittexts.tpl:22
#: views/html/users/delete.tpl:11 #: views/html/seminaries/delete.tpl:13 views/html/users/delete.tpl:11
msgid "delete" msgid "delete"
msgstr "löschen" msgstr "löschen"
@ -550,8 +551,9 @@ msgstr "%s-Gruppe bearbeiten"
#: views/html/charactergroups/editgroupsgroup.tpl:50 #: views/html/charactergroups/editgroupsgroup.tpl:50
#: views/html/charactergroupsquests/edit.tpl:94 #: views/html/charactergroupsquests/edit.tpl:94
#: views/html/characters/edit.tpl:108 views/html/questgroups/edit.tpl:64 #: views/html/characters/edit.tpl:108 views/html/questgroups/edit.tpl:64
#: views/html/questgroupshierarchy/edit.tpl:57 views/html/quests/edit.tpl:113 #: views/html/questgroups/edittexts.tpl:24
#: views/html/seminaries/edit.tpl:77 #: views/html/questgroupshierarchy/edit.tpl:57 views/html/quests/edit.tpl:111
#: views/html/quests/edittexts.tpl:32 views/html/seminaries/edit.tpl:77
msgid "edit" msgid "edit"
msgstr "bearbeiten" msgstr "bearbeiten"
@ -632,7 +634,6 @@ msgid "Add Characters"
msgstr "Füge Charaktere hinzu" msgstr "Füge Charaktere hinzu"
#: views/html/charactergroups/managegroup.tpl:59 #: views/html/charactergroups/managegroup.tpl:59
#: views/html/questgroups/questgroup.tpl:21
#: views/html/questgroups/questgroup.tpl:108 views/html/quests/index.tpl:9 #: views/html/questgroups/questgroup.tpl:108 views/html/quests/index.tpl:9
msgid "Quests" msgid "Quests"
msgstr "Quests" msgstr "Quests"
@ -1157,7 +1158,7 @@ msgid "Moodpic"
msgstr "Stimmungsbild" msgstr "Stimmungsbild"
#: views/html/questgroups/delete.tpl:14 #: views/html/questgroups/delete.tpl:14
#: views/html/questgroups/questgroup.tpl:16 #: views/html/questgroups/questgroup.tpl:18
msgid "Delete Questgroup" msgid "Delete Questgroup"
msgstr "Questgruppe löschen" msgstr "Questgruppe löschen"
@ -1170,7 +1171,16 @@ msgstr "Soll das die Questgruppe „%s“ wirklich gelöscht werden?"
msgid "Edit Questgroup" msgid "Edit Questgroup"
msgstr "Questgruppe bearbeiten" msgstr "Questgruppe bearbeiten"
#: views/html/questgroups/questgroup.tpl:17 #: views/html/questgroups/edittexts.tpl:8
#: views/html/questgroups/questgroup.tpl:16
msgid "Edit Questgroup texts"
msgstr "Questgruppetexte bearbeiten"
#: views/html/questgroups/edittexts.tpl:20 views/html/quests/edittexts.tpl:27
msgid "New Questgroup text"
msgstr "Neuer Questgruppentext"
#: views/html/questgroups/questgroup.tpl:22
msgid "Create new Quest" msgid "Create new Quest"
msgstr "Neue Quest erstellen" msgstr "Neue Quest erstellen"
@ -1302,20 +1312,20 @@ msgstr "Das Bild ist ungültig"
msgid "Picture" msgid "Picture"
msgstr "Bild" msgstr "Bild"
#: views/html/quests/create.tpl:103 views/html/quests/edit.tpl:106 #: views/html/quests/create.tpl:102 views/html/quests/edit.tpl:105
msgid "Entry text" msgid "Entry text"
msgstr "Einstiegstext" msgstr "Einstiegstext"
#: views/html/quests/create.tpl:105 views/html/quests/edit.tpl:108 #: views/html/quests/create.tpl:103 views/html/quests/edit.tpl:106
#: views/html/quests/quest.tpl:49 #: views/html/quests/quest.tpl:50
msgid "Task" msgid "Task"
msgstr "Aufgabe" msgstr "Aufgabe"
#: views/html/quests/create.tpl:108 views/html/quests/edit.tpl:111 #: views/html/quests/create.tpl:106 views/html/quests/edit.tpl:109
msgid "Wrong text" msgid "Wrong text"
msgstr "Text für falsche Antwort" msgstr "Text für falsche Antwort"
#: views/html/quests/delete.tpl:8 views/html/quests/quest.tpl:13 #: views/html/quests/delete.tpl:8 views/html/quests/quest.tpl:14
msgid "Delete Quest" msgid "Delete Quest"
msgstr "Quest löschen" msgstr "Quest löschen"
@ -1328,6 +1338,10 @@ msgstr "Soll die Quest „%s“ wirklich gelöscht werden?"
msgid "Edit Quest" msgid "Edit Quest"
msgstr "Quest bearbeiten" msgstr "Quest bearbeiten"
#: views/html/quests/edittexts.tpl:8 views/html/quests/quest.tpl:12
msgid "Edit Quest texts"
msgstr "Questtexte bearbeiten"
#: views/html/quests/index.tpl:16 views/html/quests/index.tpl:23 #: views/html/quests/index.tpl:16 views/html/quests/index.tpl:23
msgid "all" msgid "all"
msgstr "alle" msgstr "alle"
@ -1340,44 +1354,44 @@ msgstr "Questtyp"
msgid "open submissions" msgid "open submissions"
msgstr "offene Lösungsvorschläge" msgstr "offene Lösungsvorschläge"
#: views/html/quests/quest.tpl:19 #: views/html/quests/quest.tpl:20
msgid "Prolog" msgid "Prolog"
msgstr "Prolog" msgstr "Prolog"
#: views/html/quests/quest.tpl:54 #: views/html/quests/quest.tpl:55
msgid "Quest completed." msgid "Quest completed."
msgstr "Quest abgeschlossen." msgstr "Quest abgeschlossen."
#: views/html/quests/quest.tpl:54 #: views/html/quests/quest.tpl:55
#, php-format #, php-format
msgid "You have earned %d XPs." msgid "You have earned %d XPs."
msgstr "Du hast %d XP erhalten." msgstr "Du hast %d XP erhalten."
#: views/html/quests/quest.tpl:70 #: views/html/quests/quest.tpl:71
msgid "Task already successfully solved" msgid "Task already successfully solved"
msgstr "Du hast die Aufgabe bereits erfolgreich gelöst" msgstr "Du hast die Aufgabe bereits erfolgreich gelöst"
#: views/html/quests/quest.tpl:72 #: views/html/quests/quest.tpl:73
msgid "Show answer" msgid "Show answer"
msgstr "Lösung anzeigen" msgstr "Lösung anzeigen"
#: views/html/quests/quest.tpl:82 #: views/html/quests/quest.tpl:83
msgid "Epilog" msgid "Epilog"
msgstr "Epilog" msgstr "Epilog"
#: views/html/quests/quest.tpl:108 #: views/html/quests/quest.tpl:109
msgid "Continuation" msgid "Continuation"
msgstr "Setze deine Reise fort" msgstr "Setze deine Reise fort"
#: views/html/quests/quest.tpl:115 views/html/quests/quest.tpl:131 #: views/html/quests/quest.tpl:116 views/html/quests/quest.tpl:132
msgid "Quest" msgid "Quest"
msgstr "Quest" msgstr "Quest"
#: views/html/quests/quest.tpl:133 #: views/html/quests/quest.tpl:134
msgid "Go on" msgid "Go on"
msgstr "Fortfahren" msgstr "Fortfahren"
#: views/html/quests/quest.tpl:142 views/html/seminaries/seminary.tpl:52 #: views/html/quests/quest.tpl:143 views/html/seminaries/seminary.tpl:52
msgid "Lets go" msgid "Lets go"
msgstr "Auf ins Abenteuer!" msgstr "Auf ins Abenteuer!"

View file

@ -270,6 +270,9 @@
$this->db->rollback(); $this->db->rollback();
$mediaId = false; $mediaId = false;
} }
else {
$this->db->commit();
}
} }
catch(\nre\exceptions\DatamodelException $e) { catch(\nre\exceptions\DatamodelException $e) {
$this->db->rollback(); $this->db->rollback();

View file

@ -64,7 +64,7 @@
if(is_null($questtexttypeUrl)) if(is_null($questtexttypeUrl))
{ {
return $this->db->query( return $this->db->query(
'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexts.out_text, questtexts.abort_text, questtexts.questsmedia_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. 'SELECT questtexts.id, questtexts.quest_id, questtexts.text, questtexts.pos, questtexts.out_text, questtexts.abort_text, questtexts.questsmedia_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '.
'FROM questtexts '. 'FROM questtexts '.
'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '. 'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '.
'WHERE questtexts.quest_id = ?', 'WHERE questtexts.quest_id = ?',
@ -75,7 +75,7 @@
else else
{ {
return $this->db->query( return $this->db->query(
'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexts.out_text, questtexts.abort_text, questtexts.questsmedia_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. 'SELECT questtexts.id, questtexts.quest_id, questtexts.text, questtexts.pos, questtexts.out_text, questtexts.abort_text, questtexts.questsmedia_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '.
'FROM questtexts '. 'FROM questtexts '.
'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '. 'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '.
'WHERE questtexts.quest_id = ? and questtexttypes.url = ?', 'WHERE questtexts.quest_id = ? and questtexttypes.url = ?',
@ -220,44 +220,105 @@
/** /**
* Add a list of Questtexts to a Quest. * Add a Questtexts to a Quest.
* *
* @param int $userId ID of user * @param int $userId ID of user
* @param int $questId ID of Quest to add texts to * @param int $questId ID of Quest to add texts to
* @param string $questtexttypeUrl URL-type of Questtexttype of texts * @param string $questtexttypeUrl URL-type of Questtexttype of texts
* @param array $texts List of texts to add. * @param string $text Text to add.
*/ */
public function addQuesttextsToQuest($userId, $questId, $questtexttypeUrl, $texts) public function addQuesttextToQuest($userId, $questId, $questtexttypeUrl, $text)
{ {
$questtexttype = $this->getQuesttexttypeByUrl($questtexttypeUrl); $questtexttype = $this->getQuesttexttypeByUrl($questtexttypeUrl);
if(is_null($questtexttype)) { if(is_null($questtexttype)) {
return; return;
} }
foreach($texts as &$text)
{ // Get position
$pos = $this->db->query( $pos = $this->db->query(
'SELECT COALESCE(MAX(pos),0)+1 AS pos '. 'SELECT COALESCE(MAX(pos),0)+1 AS pos '.
'FROM questtexts '. 'FROM questtexts '.
'WHERE quest_id = ?', 'WHERE quest_id = ?',
'i', 'i',
$questId $questId
); );
$pos = $pos[0]['pos']; $pos = $pos[0]['pos'];
$this->db->query( // Add Questtext
'INSERT INTO questtexts '. $this->db->query(
'(created_user_id, quest_id, questtexttype_id, pos, text) '. 'INSERT INTO questtexts '.
'VALUES '. '(created_user_id, quest_id, questtexttype_id, pos, text) '.
'(?, ?, ?, ?, ?)', 'VALUES '.
'iiiis', '(?, ?, ?, ?, ?)',
$userId, $questId, $questtexttype['id'], $pos, 'iiiis',
$text $userId, $questId, $questtexttype['id'], $pos,
); $text
} );
// Return ID
return $this->db->getInsertId();
}
/**
* Set the media for a Quest text.
*
* @param int $questtextId ID of Quest text to set media for
* @param int $questmediaId ID of Questsmedia to set
*/
public function setQuestmedia($questtextId, $questsmediaId)
{
$this->db->query(
'UPDATE questtexts '.
'SET questsmedia_id = ? '.
'WHERE id = ?',
'ii',
$questsmediaId,
$questtextId
);
}
/**
* Edit a Quest text.
*
* @param int $questtextId ID of Quest text to edit
* @param string $text New text
*/
public function editQuesttext($questtextId, $text)
{
$this->db->query(
'UPDATE questtexts '.
'SET text = ? '.
'WHERE id = ?',
'si',
$text,
$questtextId
);
} }
/**
* Delete a Quest text.
*
* @param array $questtext Data of Quest text to delete
*/
public function deleteQuesttext($questtext)
{
// Delete Quest text
$this->db->query('DELETE FROM questtexts WHERE id = ?', 'i', $questtext['id']);
// Adjust positions
$this->db->query(
'UPDATE questtexts '.
'SET pos = pos - 1 '.
'WHERE quest_id = ? AND pos > ?',
'ii',
$questtext['quest_id'],
$questtext['pos']
);
}
} }

View file

@ -0,0 +1,64 @@
<?php if(!is_null($questgroup['picture'])) : ?>
<div class="moodpic">
<img src="<?=$linker->link(array('media','seminary',$seminary['url'],$questgroup['picture']['url']))?>" />
</div>
<?php endif ?>
<?=$questgroupshierarchypath?>
<h1><?=_('Edit Quest texts')?></h1>
<form method="post" enctype="multipart/form-data">
<?php foreach($questtexttypes as &$type) : ?>
<fieldset>
<legend><?=$type['type']?></legend>
<?php if(array_key_exists($type['url'], $validations)) : ?>
<ul>
<?php foreach($validations[$type['url']] as $textId => &$validation) : ?>
<?php if($validation !== true) : ?>
<?php foreach($validation as $field => &$settings) : ?>
<li>
<ul>
<?php foreach($settings as $setting => $value) : ?>
<li>
<?php switch($field) {
case 'media':
switch($setting) {
case 'error': printf(_('Error during picture upload: %s'), $value);
break;
case 'mimetype': printf(_('Picture has wrong type “%s”'), $value);
break;
case 'size': echo _('Picture exceeds size maximum');
break;
default: echo _('Picture invalid');
}
break;
} ?>
</li>
<?php endforeach ?>
</ul>
</li>
<?php endforeach ?>
<?php endif ?>
<?php endforeach ?>
</ul>
<?php endif ?>
<ul class="admnql">
<?php foreach($type['texts'] as &$text) : ?>
<li class="cf">
<?php if(array_key_exists('media', $text)) : ?>
<a href="<?=$linker->link(array('media','seminary',$seminary['url'],$text['media']['url']))?>"><img src="<?=$linker->link(array('media','seminary',$seminary['url'],$text['media']['url']))?>" /></a><br />
<?php endif ?>
<input type="file" name="media[<?=$type['url']?>][<?=$text['id']?>]" accept="<?=implode(',', array_map(function($m) { return $m['mimetype']; }, $mimetypes))?>" /><br />
<textarea name="questtexts[<?=$type['url']?>][<?=$text['id']?>]"><?=$text['text']?></textarea><br />
<input id="deletes[<?=$type['url']?>][<?=$text['id']?>]" type="checkbox" name="deletes[<?=$type['url']?>][<?=$text['id']?>]" />
<label for="deletes[<?=$type['url']?>][<?=$text['id']?>]"><?=_('delete')?></label>
</li>
<?php endforeach ?>
<li class="cf">
<input type="file" name="media[<?=$type['url']?>][new]" accept="<?=implode(',', array_map(function($m) { return $m['mimetype']; }, $mimetypes))?>" /><br />
<textarea name="questtexts[<?=$type['url']?>][new]" placeholder="<?=_('New Questgroup text')?>"></textarea>
</li>
</ul>
</fieldset>
<?php endforeach ?>
<input type="submit" name="edit" value="<?=_('edit')?>" />
</form>

View file

@ -9,6 +9,7 @@
<?php if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0) : ?> <?php if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0) : ?>
<nav class="admin"> <nav class="admin">
<li><a href="<?=$linker->link('edit', 5)?>"><?=_('Edit Quest')?></a></li> <li><a href="<?=$linker->link('edit', 5)?>"><?=_('Edit Quest')?></a></li>
<li><a href="<?=$linker->link('edittexts', 5)?>"><?=_('Edit Quest texts')?></a></li>
<?php if(in_array('admin', \hhu\z\controllers\SeminaryController::$character['characterroles'])) : ?> <?php if(in_array('admin', \hhu\z\controllers\SeminaryController::$character['characterroles'])) : ?>
<li><a href="<?=$linker->link('delete', 5)?>"><?=_('Delete Quest')?></a></li> <li><a href="<?=$linker->link('delete', 5)?>"><?=_('Delete Quest')?></a></li>
<?php endif ?> <?php endif ?>