From 23841c6aff0e1599f50f4e5c08387bfbbec31d2b Mon Sep 17 00:00:00 2001 From: coderkun Date: Fri, 4 Jul 2014 13:54:57 +0200 Subject: [PATCH] implement CRUD for Quest texts (issue #36) --- agents/intermediate/QuestsAgent.inc | 9 + configs/AppConfig.inc | 20 +- controllers/QuestsController.inc | 223 ++++++++++++++++++++ locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 19958 -> 20170 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 72 ++++--- models/MediaModel.inc | 3 + models/QuesttextsModel.inc | 115 +++++++--- views/html/quests/edittexts.tpl | 64 ++++++ views/html/quests/quest.tpl | 1 + 9 files changed, 441 insertions(+), 66 deletions(-) create mode 100644 views/html/quests/edittexts.tpl diff --git a/agents/intermediate/QuestsAgent.inc b/agents/intermediate/QuestsAgent.inc index 4afacc3c..4279181b 100644 --- a/agents/intermediate/QuestsAgent.inc +++ b/agents/intermediate/QuestsAgent.inc @@ -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. */ diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 6d4e7aa6..056860be 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -240,11 +240,11 @@ array('^questgroups/([^/]+)/create/?$', 'questgroups/create/$1', true), array('^questgroups/([^/]+)/([^/]+)/(edit|edittexts|delete|moveup|movedown)/?$', 'questgroups/$3/$1/$2', true), 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/$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/([^/]+)/?$', 'quests/index/$1', true), + array('^quests/([^/]+)/all/?$', 'quests/index/$1/all', true), + array('^quests/([^/]+)/([^/]+)/(create|createmedia)/?$', 'quests/$3/$1/$2', 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/(?!(index|create|createmedia))/?', 'quests/quest/$1', true), array('^characters/([^/]+)/(register|manage)/?$', 'characters/$2/$1', true), array('^characters/([^/]+)/?$', 'characters/index/$1', true), @@ -287,11 +287,11 @@ array('^questgroups/create/(.*)$', 'questgroups/$1/create', true), array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true), array('^questgroups/(edit|edittexts|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|edit|delete)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$', '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|edittexts|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 3c3f05c9..fc1ad610 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -43,6 +43,7 @@ 'submission' => array('admin', 'moderator', 'user'), 'create' => array('admin', 'moderator', 'user'), 'edit' => array('admin', 'moderator', 'user'), + 'edittexts' => array('admin', 'moderator', 'user'), 'delete' => array('admin', 'moderator', 'user') ); /** @@ -57,6 +58,7 @@ 'submission' => array('admin', 'moderator'), 'create' => array('admin', 'moderator'), 'edit' => array('admin', 'moderator'), + 'edittexts' => array('admin', 'moderator'), '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. * 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 93d0ec1a91d1313f675a3c6b6dee49a25e10e046..0cb7d3bdf9799bebcbad59989e9ca246fac12652 100644 GIT binary patch delta 6538 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 delta 6367 zcmYk=3w+P@9>?+TW>?!>W;ez*Gn?>Ai!!b@e0<%@W$Tr z389+H z_n`*(CdSae+e1PRoWhY9p6Fa%oPZ(t5QgF$a{+2*C3piaN7efpHGo~1ibqic4Plz9 zACC<&4Y}oVF`E9}U=kX@Xl#U!V{=@Jte)F|YG{Y$k76wOE2#R>JX{~sQ7e>-EQaf6 z<)cy0&p`gUB7SHjt2(~y6zmpKwO!^bTD z3~J>nP#teW7R%M3W*(U0O|*WB&)eJP6zG9WREPPfL)iy|a1g4YA*hBXqyG$;%TWV( z4K;xe&1zJ8-=Nytg*rFtLK`bI?O{}7&idb zU?FNNA3z>)kD^xYCDfTH#}r(T8pu8`?{hUI^gu`p?>%jWs?Y<~L4R{BYK!KXD^Q1T zEvkMsYKga_R$#xCpSAoIyC0qAZB-(s>HTj*q9qRuLOnPWwIU^`nLme`c?D|bJ5X=I z5mdcPNZT%uMszV?+(O4^g7=y?cqXzyo`qbbu5?Z=9P)k{X8o(yhz`jL2 zco2i}h`PmpwzQ|l+E=R4%tElJJWwQREB&sOTo^3&m{IunN zN9|$rEN=x0Fok?SWYTUTGIm#rTA7bfhq4O!c)IPVUp{A$e=fMS_sb_6HINZL5;|Oy zPxz!`7G3js2i%@-BvywqsSMbz5~xQJ3T z)eoR`y><;T2HT=m>_${O_geW3R6C11vi|C@oPuavk6QArmj51g|17G*I-R_RqfzA< zsPe9;mF$ap{w~y3jz)y)MQSd>ylJ3#z~KsP=sIyLcav6tg#~!!f8Y+Z>F?Rj3vE1l7@Y z)FIl7+WYgU(|#4Tw_$w0HNz<6T)P&ic88!&|0HArJ~xYmDwd!+C`Y|MAE0LTF{*>D z7{=?h+wLFg<{i>wr~w7>8$~M!ZGe&5*IVZm73u7AE2{)CAXIJm=4SL_$lw z6SZ`gQ6qOfybneqYG6Gv9fz88QHO68YNghq2EG~9(GJwsow4$ep5D^Op(c=uJ~eP1 z33b>FHRGX}jN?%=UW~e5idp!MxgS+OsFyeJc+^%lMGf=@)WGk?W;hx3eRvWz;pcm? z|62M_DagcqW?;UzP4Xj&@cc+)0@2VJFp%3 zh1dl*ptkBfYNDY9-oSnFB(xMQ&0JK4n^6NAiki_V)G42W8sHHx6BvfBFaK!{;i$bHf$DG^w!vad!VP#m z?lVK#A3dLoTFD-$=Wj(F_7NC}52614bhAik#O0_x+Jtt`If&2)!-=9S(%9X zEjP!?pTZFG%PXWf}2rWeaP;g9>DqsP|%jpmEhqx?Cv|_E#jX<4RM^f zpEyV8(u^DO@H~Ic`?2Plw32TSf4in^g{5P8uDL(W`p1yzV>h11=ZJO05@HoGlvqv# zQ11iOA(}+!|CrTY`o;7o%QPXaubr+r#Jj|U#BkylqV~Fug#W+)W|836y$k2T&yd&R z|JPVceSwkOABHVZ%in?6MI;kfh-t*nL>2KYkwU#qIFtC2sJ#x=CeU{~KOVJ$|KdN0 zVq!b-IiYJWQB9-}I*{XuPY7L)5IX(3W_Y+y&GY!0r7z=2VuH&55ocC z2VxXadtD&0lz5d`OmKkx2MYXOw;uT^C zQJ;3zm#({sf&LU_`$@DR9WrHJ7;LPjMb-_&=n-w|ryrFIu{_ zIRHp6XFj&FuP}l9 zY0E#2?^}93Zn5;%+BHd~ps^K-kMx5EZiO^rEs;q)MocE2Anqf25~GQ~6VDJEhh-DRYM@n86ol?Re< zPx@`k?=ycj6U}h*6#CBaqXF?S(UGV}bSCB#x(bLeVl#0EkxS^>NW4z;Q0AH|gh4bS z?xJjwl{X+ih4fV779!TlCup91$-H0%|1+P$BSf#tPZH8YO3x?7RwgG01ee~D9#PpN pZBArxyPPf^vP-M7TliD$Dodb->rollback(); $mediaId = false; } + else { + $this->db->commit(); + } } catch(\nre\exceptions\DatamodelException $e) { $this->db->rollback(); diff --git a/models/QuesttextsModel.inc b/models/QuesttextsModel.inc index a1a144a0..b66eb284 100644 --- a/models/QuesttextsModel.inc +++ b/models/QuesttextsModel.inc @@ -64,7 +64,7 @@ if(is_null($questtexttypeUrl)) { 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 '. 'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '. 'WHERE questtexts.quest_id = ?', @@ -75,7 +75,7 @@ else { 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 '. 'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '. '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 $questId ID of Quest to add texts to * @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); if(is_null($questtexttype)) { return; } - foreach($texts as &$text) - { - $pos = $this->db->query( - 'SELECT COALESCE(MAX(pos),0)+1 AS pos '. - 'FROM questtexts '. - 'WHERE quest_id = ?', - 'i', - $questId - ); - $pos = $pos[0]['pos']; - - $this->db->query( - 'INSERT INTO questtexts '. - '(created_user_id, quest_id, questtexttype_id, pos, text) '. - 'VALUES '. - '(?, ?, ?, ?, ?)', - 'iiiis', - $userId, $questId, $questtexttype['id'], $pos, - $text - ); - } + + // Get position + $pos = $this->db->query( + 'SELECT COALESCE(MAX(pos),0)+1 AS pos '. + 'FROM questtexts '. + 'WHERE quest_id = ?', + 'i', + $questId + ); + $pos = $pos[0]['pos']; + + // Add Questtext + $this->db->query( + 'INSERT INTO questtexts '. + '(created_user_id, quest_id, questtexttype_id, pos, text) '. + 'VALUES '. + '(?, ?, ?, ?, ?)', + 'iiiis', + $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'] + ); + } } diff --git a/views/html/quests/edittexts.tpl b/views/html/quests/edittexts.tpl new file mode 100644 index 00000000..e5ec350e --- /dev/null +++ b/views/html/quests/edittexts.tpl @@ -0,0 +1,64 @@ + +
+ +
+ + + +

+
+ +
+ + +
    + &$validation) : ?> + + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + + + +
+ +
    + +
  • + +
    + +
    +
    + + +
  • + +
  • +
    + +
  • +
+
+ + +
diff --git a/views/html/quests/quest.tpl b/views/html/quests/quest.tpl index 6c59203b..87695b38 100644 --- a/views/html/quests/quest.tpl +++ b/views/html/quests/quest.tpl @@ -9,6 +9,7 @@ 0) : ?>