From 3b1bed540f343202fc606961f117fab0d7aafc78 Mon Sep 17 00:00:00 2001 From: coderkun Date: Thu, 31 Jul 2014 11:21:31 +0200 Subject: [PATCH] implement task editing for Questtype ?Textinput? (issue #36) --- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 23342 -> 23897 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 82 +++++++++--- .../TextinputQuesttypeController.inc | 125 ++++++++++++++++++ .../textinput/TextinputQuesttypeModel.inc | 103 +++++++++++++++ questtypes/textinput/html/edittask.tpl | 105 +++++++++++++++ views/html/html.tpl | 1 + www/js/misc.js | 52 ++++++++ 7 files changed, 449 insertions(+), 19 deletions(-) create mode 100644 questtypes/textinput/html/edittask.tpl create mode 100644 www/js/misc.js 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 adab17a1963c85ef226566563ea924161188f91f..5a65b95640830f9c844841e820842001a9371cbb 100644 GIT binary patch delta 8017 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 L5RjkjqCNls=8uIj delta 7566 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 SSuE@T(`KefJLbuyF;4(`ln|5v 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 36ed23e0..c8f9d2b4 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-07-11 11:53+0100\n" -"PO-Revision-Date: 2014-07-11 11:57+0100\n" +"POT-Creation-Date: 2014-07-31 10:52+0100\n" +"PO-Revision-Date: 2014-07-31 11:00+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -63,7 +63,7 @@ msgstr "Neuer Lösungsvorschlag" msgid "Character submission approved" msgstr "Lösungsvorschlag bewertet" -#: controllers/QuestsController.inc:1227 +#: controllers/QuestsController.inc:1284 #: questtypes/submit/html/submission.tpl:30 #: views/html/achievements/conditions.tpl:54 #: views/html/achievements/conditions.tpl:121 views/html/quests/quest.tpl:54 @@ -206,6 +206,54 @@ msgstr "Kommentar" msgid "unsolved" msgstr "Leider falsch!" +#: questtypes/textinput/html/edittask (Kopie).tpl:3 +#: questtypes/textinput/html/edittask.tpl:24 +msgid "Text" +msgstr "Text" + +#: questtypes/textinput/html/edittask (Kopie).tpl:6 +#, php-format +msgid "Use %s for marking field positions" +msgstr "Benutze %s zum Markieren von Feldpositionen" + +#: questtypes/textinput/html/edittask (Kopie).tpl:8 +msgid "edit text" +msgstr "Text bearbeiten" + +#: questtypes/textinput/html/edittask (Kopie).tpl:12 +#: questtypes/textinput/html/edittask.tpl:29 +msgid "Fields" +msgstr "Felder" + +#: questtypes/textinput/html/edittask (Kopie).tpl:37 +msgid "edit fields" +msgstr "Felder bearbeiten" + +#: questtypes/textinput/html/edittask (Kopie).tpl:41 +#: questtypes/textinput/html/edittask.tpl:44 +#: views/html/achievements/conditions.tpl:151 +#: views/html/achievements/create.tpl:109 views/html/achievements/edit.tpl:112 +#: views/html/charactergroupsquests/manage.tpl:66 +#: views/html/charactertypes/edit.tpl:124 views/html/library/edit.tpl:46 +#: views/html/library/edit.tpl:86 views/html/quests/edit.tpl:112 +#: views/html/users/edit.tpl:105 views/html/xplevels/manage.tpl:49 +msgid "save" +msgstr "speichern" + +#: questtypes/textinput/html/edittask.tpl:10 +#: questtypes/textinput/html/edittask.tpl:12 +msgid "Regex invalid" +msgstr "Der reguläre Ausdruck ist ungültig" + +#: questtypes/textinput/html/edittask.tpl:25 +msgid "Add field" +msgstr "Feld hinzufügen" + +#: questtypes/textinput/html/edittask.tpl:43 +#: questtypes/textinput/html/edittask.tpl:46 +msgid "Preview" +msgstr "Vorschau" + #: 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 @@ -374,7 +422,7 @@ msgid "Group by" msgstr "Gruppiert über" #: views/html/achievements/conditions.tpl:69 -#: views/html/achievements/conditions.tpl:136 views/html/html.tpl:79 +#: views/html/achievements/conditions.tpl:136 views/html/html.tpl:80 msgid "Achievement" msgstr "Achievement" @@ -399,15 +447,6 @@ msgstr "löschen" msgid "New condition" msgstr "Neue Bedingung" -#: views/html/achievements/conditions.tpl:151 -#: views/html/achievements/create.tpl:109 views/html/achievements/edit.tpl:112 -#: views/html/charactergroupsquests/manage.tpl:66 -#: views/html/charactertypes/edit.tpl:124 views/html/library/edit.tpl:46 -#: views/html/library/edit.tpl:86 views/html/users/edit.tpl:105 -#: views/html/xplevels/manage.tpl:49 -msgid "save" -msgstr "speichern" - #: views/html/achievements/create.tpl:11 msgid "Create Achievement" msgstr "Achievement erstellen" @@ -694,7 +733,7 @@ msgstr "Spiele weiter, um diesen geheimen Erfolg freizuschalten" #: views/html/charactergroupsquests/edit.tpl:94 #: views/html/characters/edit.tpl:108 views/html/charactertypes/index.tpl:24 #: views/html/questgroups/edit.tpl:64 views/html/questgroups/edittexts.tpl:24 -#: views/html/questgroupshierarchy/edit.tpl:57 views/html/quests/edit.tpl:111 +#: views/html/questgroupshierarchy/edit.tpl:57 #: views/html/quests/edittexts.tpl:63 views/html/seminaries/edit.tpl:77 msgid "edit" msgstr "bearbeiten" @@ -1331,11 +1370,11 @@ msgstr "oder" msgid "register yourself" msgstr "registriere dich" -#: views/html/html.tpl:89 +#: views/html/html.tpl:90 msgid "Level-up" msgstr "Levelaufstieg" -#: views/html/html.tpl:91 views/html/html.tpl:93 +#: views/html/html.tpl:92 views/html/html.tpl:94 #, php-format msgid "You have reached level %d" msgstr "Du hast Level %d erreicht" @@ -1634,6 +1673,14 @@ msgstr "Soll die Quest „%s“ wirklich gelöscht werden?" msgid "Edit Quest" msgstr "Quest bearbeiten" +#: views/html/quests/edit.tpl:111 +msgid "edit task" +msgstr "Aufgabe bearbeiten" + +#: views/html/quests/edittask.tpl:8 +msgid "Edit Quest task" +msgstr "Questaufgabe bearbeiten" + #: views/html/quests/edittexts.tpl:8 views/html/quests/quest.tpl:12 msgid "Edit Quest texts" msgstr "Questtexte bearbeiten" @@ -2015,9 +2062,6 @@ msgstr "Hallo %s" #~ msgid "Character Groups Quests" #~ msgstr "Gruppenquests" -#~ msgid "Skip task" -#~ msgstr "Aufgabe überspringen" - #~ msgid "continue" #~ msgstr "fortfahren" diff --git a/questtypes/textinput/TextinputQuesttypeController.inc b/questtypes/textinput/TextinputQuesttypeController.inc index d073b162..aa139b46 100644 --- a/questtypes/textinput/TextinputQuesttypeController.inc +++ b/questtypes/textinput/TextinputQuesttypeController.inc @@ -19,6 +19,12 @@ */ class TextinputQuesttypeController extends \hhu\z\controllers\QuesttypeController { + /** + * Required components + * + * @var array + */ + public $components = array('validation'); @@ -163,6 +169,125 @@ $this->set('task', $task); $this->set('fields', $fields); } + + + /** + * Action: edittask. + * + * Edit the task of a Quest. + * + * @param array $seminary Current Seminary data + * @param array $questgroup Current Questgroup data + * @param array $quest Current Quest data + */ + public function edittask($seminary, $questgroup, $quest) + { + // Get Task + $task = $this->Textinput->getTextinputQuest($quest['id']); + $text = $task['text']; + + // Get fields + $fields = $this->Textinput->getTextinputFields($quest['id']); + + // Get field sizes + $fieldSizes = $this->Textinput->getFieldSizes(); + + // Values + $validations = array(); + + // Save data + if($this->request->getRequestMethod() == 'POST') + { + if(!is_null($this->request->getPostParam('preview')) || !is_null($this->request->getPostParam('save'))) + { + // Get params and validate them + if(is_null($this->request->getPostParam('text'))) { + throw new \nre\exceptions\ParamsNotValidException('text'); + } + $text = $this->request->getPostParam('text'); + if(is_null($this->request->getPostParam('fields'))) { + throw new \nre\exceptions\ParamsNotValidException('fields'); + } + $fields = $this->request->getPostParam('fields'); + $fields = array_values($fields); + $fieldIndex = 0; + foreach($fields as &$field) + { + // Validate regex + $regex = $field['regex']; + //$fieldValidation = $this->Validation->validate($regex, \nre\configs\AppConfig::$validation['regex']); + $fieldValidation = @preg_match($regex, '') !== false; + if($fieldValidation !== true) + { + if(!array_key_exists($fieldIndex, $validations) || !is_array($validations[$fieldIndex])) { + $validations[$fieldIndex] = array(); + } + $validations[$fieldIndex] = $this->Validation->addValidationResults($validations[$fieldIndex], 'regex', $fieldValidation); + } + + // Validate size + foreach($fieldSizes as $sizeIndex => &$size) + { + if($size['size'] == $field['size']) + { + $field['sizeIndex'] = $sizeIndex; + break; + } + } + if(!array_key_exists('sizeIndex', $field)) { + throw new \nre\exceptions\ParamsNotValidException($fieldIndex); + } + + $fieldIndex++; + } + + // Save and redirect + if(!is_null($this->request->getPostParam('save')) && empty($validations)) + { + // Save text + $this->Textinput->setTextForQuest( + $this->Auth->getUserId(), + $quest['id'], + $text + ); + + // Save field + foreach($fields as $index => &$field) + { + // Add regex modifiers + $modifiers = substr($field['regex'], strrpos($field['regex'], $field['regex'][0]) + 1); + if(strpos($modifiers, 'u') === false) { + $field['regex'] .= 'u'; + } + + // Save field + $this->Textinput->setFieldForText( + $quest['id'], + $index + 1, + $fieldSizes[$field['sizeIndex']]['id'], + $field['regex'] + ); + } + + // Redirect + $this->redirect($this->linker->link(array('quest', $seminary['url'], $questgroup['url'], $quest['url']), 1)); + } + } + } + + // Set colors for fields + foreach($fields as &$field) { + $field['color'] = str_pad(sprintf('%x%x%x', rand(0,255), rand(0,255), rand(0,255)), 6, 9); + } + + + // Pass data to view + $this->set('task', $task); + $this->set('text', $text); + $this->set('fields', $fields); + $this->set('fieldSizes', $fieldSizes); + $this->set('validations', $validations); + } diff --git a/questtypes/textinput/TextinputQuesttypeModel.inc b/questtypes/textinput/TextinputQuesttypeModel.inc index 0960fb3f..daf0edde 100644 --- a/questtypes/textinput/TextinputQuesttypeModel.inc +++ b/questtypes/textinput/TextinputQuesttypeModel.inc @@ -112,6 +112,109 @@ return ''; } + + + /** + * Set the text for a Quest and correct fields count. + * + * @param int $userId ID of user setting text + * @param int $questId ID of Quest to set text for + * @param string $text Text for Quset + */ + public function setTextForQuest($userId, $questId, $text) + { + $this->db->setAutocommit(false); + try { + // Set text + $this->db->query( + 'INSERT INTO questtypes_textinput '. + '(quest_id, created_user_id, text) '. + 'VALUES '. + '(?, ?, ?) '. + 'ON DUPLICATE KEY UPDATE '. + 'text = ?', + 'iiss', + $questId, + $userId, + $text, + $text + ); + + // Count fields + $fieldCount = substr_count($text, '[textinput]'); + + // Remove fields + $this->db->query( + 'DELETE FROM questtypes_textinput_fields '. + 'WHERE questtypes_textinput_quest_id = ? AND number > ?', + 'ii', + $questId, + $fieldCount + ); + + // Add fields + for($i=1; $i<=$fieldCount; $i++) + { + $this->db->query( + 'INSERT IGNORE INTO questtypes_textinput_fields '. + '(questtypes_textinput_quest_id, number, regex) '. + 'VALUES '. + '(?, ?, ?) ', + 'iis', + $questId, + $i, + '' + ); + } + + $this->db->commit(); + } + catch(\Exception $e) { + $this->db->rollback(); + $this->db->setAutocommit(true); + throw $e; + } + + $this->db->setAutocommit(true); + } + + + /** + * Set values for a field of a text. + * + * @param int $questId ID of Quest to set field for + * @param int $number Field number + * @param int $sizeId ID of field size + * @param string $regex RegEx for field + */ + public function setFieldForText($questId, $number, $sizeId, $regex) + { + $this->db->query( + 'UPDATE questtypes_textinput_fields '. + 'SET questtypes_textinput_fieldsize_id = ?, regex = ? '. + 'WHERE questtypes_textinput_quest_id = ? AND number = ?', + 'isii', + $sizeId, + $regex, + $questId, + $number + ); + } + + + /** + * Get all registered field sizes. + * + * @return List of field sizes + */ + public function getFieldSizes() + { + return $this->db->query( + 'SELECT id, size '. + 'FROM questtypes_textinput_fieldsizes '. + 'ORDER BY size' + ); + } } diff --git a/questtypes/textinput/html/edittask.tpl b/questtypes/textinput/html/edittask.tpl new file mode 100644 index 00000000..e8413333 --- /dev/null +++ b/questtypes/textinput/html/edittask.tpl @@ -0,0 +1,105 @@ + +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ +
+
+ +
+ +
+
+ +
    + &$field) : ?> +
  • + + class="invalid" /> +
  • + +
+
+ + +
+

+

+ + + + t(mb_substr($text, $posStart, $posEnd-$posStart, 'UTF-8'))?> + class="" /> + + + t(mb_substr($text, $posStart, mb_strlen($text, 'UTF-8')-$posStart, 'UTF-8'))?> +

+ + diff --git a/views/html/html.tpl b/views/html/html.tpl index 085111ea..40b021db 100644 --- a/views/html/html.tpl +++ b/views/html/html.tpl @@ -34,6 +34,7 @@ + diff --git a/www/js/misc.js b/www/js/misc.js new file mode 100644 index 00000000..8bc8a0dd --- /dev/null +++ b/www/js/misc.js @@ -0,0 +1,52 @@ +/** + * http://stackoverflow.com/questions/1064089/inserting-a-text-where-cursor-is-using-javascript-jquery/1064139#1064139 + */ +function getCaret(textareaId) +{ + var textarea = document.getElementById(textareaId); + var strPos = 0; + if(textarea.selectionStart || textarea.selectionStart == '0') { + strPos = textarea.selectionStart + } + else if(document.selection) + { + textarea.focus(); + var range = document.selection.createRange(); + range.moveStart('character', -textarea.value.length); + strPos = range.text.length; + } + else { + strPos = -1; + } + + return strPos; +} + + +function insertAtCaret(textareaId, caret, text) +{ + var textarea = document.getElementById(textareaId); + var scrollPos = textarea.scrollTop; + + var front = (textarea.value).substring(0, caret); + var back = (textarea.value).substring(caret, textarea.value.length); + textarea.value = front + text + back; + caret = caret + text.length; + + if(textarea.selectionStart || textarea.selectionStart == '0') + { + textarea.selectionStart = caret; + textarea.selectionEnd = caret; + textarea.focus(); + } + else if(document.selection) + { + textarea.focus(); + var range = document.selection.createRange(); + range.moveStart('character', -textarea.value.length); + range.moveStart('character', caret); + range.moveEnd('character', 0); + range.select(); + } + textarea.scrollTop = scrollPos; +}