From 5fa70e65b3d7350febcc7338dfb4c0c83cbf5154 Mon Sep 17 00:00:00 2001 From: coderkun Date: Tue, 1 Jul 2014 22:24:28 +0200 Subject: [PATCH] implement CRUD for Questgroup texts (issue #32) --- agents/intermediate/QuestgroupsAgent.inc | 9 ++ configs/AppConfig.inc | 12 +- controllers/QuestgroupsController.inc | 82 +++++++++- controllers/SeminariesController.inc | 4 +- models/QuestgroupsModel.inc | 67 +-------- models/QuestgrouptextsModel.inc | 181 +++++++++++++++++++++++ views/html/questgroups/edittexts.tpl | 25 ++++ views/html/questgroups/questgroup.tpl | 5 + 8 files changed, 309 insertions(+), 76 deletions(-) create mode 100644 models/QuestgrouptextsModel.inc create mode 100644 views/html/questgroups/edittexts.tpl diff --git a/agents/intermediate/QuestgroupsAgent.inc b/agents/intermediate/QuestgroupsAgent.inc index df9457ce..b7bd3a54 100644 --- a/agents/intermediate/QuestgroupsAgent.inc +++ b/agents/intermediate/QuestgroupsAgent.inc @@ -39,6 +39,15 @@ { $this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4)); } + + + /** + * Action: edittexts. + */ + public function edittexts(\nre\core\Request $request, \nre\core\Response $response) + { + $this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4)); + } /** diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 70510962..6d4e7aa6 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -237,9 +237,9 @@ array('^seminaries/(?!(index|create|edit|delete|calculatexps))/?', 'seminaries/seminary/$1', true), array('^questgroupshierarchy/([^/]+)/create/?$', 'questgroupshierarchy/create/$1', true), array('^questgroupshierarchy/([^/]+)/([^/]+)/(edit|delete|moveup|movedown)/?$', 'questgroupshierarchy/$3/$1/$2', true), - array('^questgroups/([^/]+)/create/?$', 'questgroups/create/$1', true), - array('^questgroups/([^/]+)/([^/]+)/(edit|delete|moveup|movedown)/?$', 'questgroups/$3/$1/$2', true), - array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true), + 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), @@ -284,9 +284,9 @@ array('^seminaries/seminary/(.*)$', 'seminaries/$1', false), array('^questgroupshierarchy/create/(.*)$', 'questgroupshierarchy/$1/create', true), array('^questgroupshierarchy/([^/]+)/(.*)$', 'questgroupshierarchy/$2/$1', true), - array('^questgroups/create/(.*)$', 'questgroups/$1/create', true), - array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true), - array('^questgroups/(edit|delete|moveup|movedown)/(.*)$', 'questgroups/$2/$1', true), + 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), diff --git a/controllers/QuestgroupsController.inc b/controllers/QuestgroupsController.inc index 2dcd3d84..b5c81206 100644 --- a/controllers/QuestgroupsController.inc +++ b/controllers/QuestgroupsController.inc @@ -24,7 +24,7 @@ * * @var array */ - public $models = array('seminaries', 'questgroupshierarchy', 'questgroups', 'quests', 'questtexts', 'media'); + public $models = array('seminaries', 'questgroupshierarchy', 'questgroups', 'questgrouptexts', 'quests', 'questtexts', 'media'); /** * Required components * @@ -144,7 +144,7 @@ } // Get texts - $questgroupTexts = $this->Questgroups->getQuestgroupTexts($questgroup['id']); + $questgroupTexts = $this->Questgrouptexts->getQuestgroupTexts($questgroup['id']); // Media $picture = null; @@ -482,6 +482,84 @@ } + /** + * Action: edittexts. + * + * Edit a Questgroup. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-title of a Seminary + * @param string $questgroupUrl URL-title of Questgroup to edit + */ + public function edittexts($seminaryUrl, $questgroupUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Questgroup + $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); + + // Get Questgroup texts + $questgroupTexts = $this->Questgrouptexts->getQuestgroupTexts($questgroup['id']); + + // Get allowed mimetypes + $mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics']; + + // Check request method + if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit'))) + { + $texts = $this->request->getPostParam('questgrouptexts'); + $deleteTexts = $this->request->getPostParam('deletes'); + if(!is_array($deleteTexts)) { + $deleteTexts = array(); + } + + // Edit or delete texts + foreach($questgroupTexts as $text) + { + if(array_key_exists($text['id'], $deleteTexts)) + { + $this->Questgrouptexts->deleteQuestgrouptext($text); + unset($texts[$text['id']]); + } + elseif(array_key_exists($text['id'], $texts)) + { + $this->Questgrouptexts->editQuestgrouptext($text['id'], $texts[$text['id']]); + unset($texts[$text['id']]); + } + } + + // Add new texts + foreach($texts as $text) { + if(!empty($text)) { + $this->Questgrouptexts->addQuestgrouptextToQuestgroup($this->Auth->getUserId(), $questgroup['id'], $text); + } + } + + // Redirect to Questgroup + $this->redirect($this->linker->link(array('questgroup', $seminary['url'], $questgroup['url']), 1)); + } + + // Media + $picture = null; + if(!is_null($questgroup['questgroupspicture_id'])) { + $picture = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']); + } + + + // Set titile + $this->addTitleLocalized('Edit Questgroup texts'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('questgroup', $questgroup); + $this->set('questgrouptexts', $questgroupTexts); + $this->set('picture', $picture); + $this->set('mimetypes', $mimetypes); + } + + /** * Action: moveup. * diff --git a/controllers/SeminariesController.inc b/controllers/SeminariesController.inc index 90887ab9..2d1b73b3 100644 --- a/controllers/SeminariesController.inc +++ b/controllers/SeminariesController.inc @@ -24,7 +24,7 @@ * * @var array */ - public $models = array('seminaries', 'users', 'characterroles', 'charactertypes', 'questgroupshierarchy', 'questgroups', 'media'); + public $models = array('seminaries', 'users', 'characterroles', 'charactertypes', 'questgroupshierarchy', 'questgroups', 'questgrouptexts', 'media'); /** * Required components * @@ -137,7 +137,7 @@ } // Get first Questgroup text - $text = $this->Questgroups->getFirstQuestgroupText($questgroup['id']); + $text = $this->Questgrouptexts->getFirstQuestgroupText($questgroup['id']); if(!is_null($text)) { $questgroup['text'] = \hhu\z\Utils::shortenString($text, 100, 120).' …'; diff --git a/models/QuestgroupsModel.inc b/models/QuestgroupsModel.inc index 9525126e..01037715 100644 --- a/models/QuestgroupsModel.inc +++ b/models/QuestgroupsModel.inc @@ -31,7 +31,7 @@ * * @var array */ - public $models = array('questgroupshierarchy', 'quests', 'questtexts'); + public $models = array('questgroupshierarchy', 'quests'); @@ -159,71 +159,6 @@ } - /** - * Get texts of a Questgroup. - * - * @param int $questgroupId ID of a Questgroup - * @return array Texts of this Questgroup - */ - public function getQuestgroupTexts($questgroupId) - { - return $this->db->query( - 'SELECT id, pos, text '. - 'FROM questgrouptexts '. - 'WHERE questgroup_id = ? '. - 'ORDER BY pos ASC', - 'i', - $questgroupId - ); - } - - - /** - * Get the first text of a Questgroup. - * - * @param int $questgroupId ID of a Questgroup - * @return string First text of this Questgroup or NULL - */ - public function getFirstQuestgroupText($questgroupId) - { - // Text of Questgroup itself - $questgroupTexts = $this->getQuestgroupTexts($questgroupId); - if(!empty($questgroupTexts)) { - return $questgroupTexts[0]['text']; - } - - // Text of first Quest - $quest = $this->Quests->getFirstQuestOfQuestgroup($questgroupId); - if(!is_null($quest)) - { - $questText = $this->Questtexts->getFirstQuestText($quest['id']); - if(!is_null($questText)) { - return $questText; - } - } - - // Text of ChildQuestgroups - $questgroupHierarchy = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroupId); - $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroupHierarchy['id']); - foreach($childQuestgroupshierarchy as &$hierarchy) - { - // Get Questgroups - $questgroups = $this->getQuestgroupsForHierarchy($hierarchy['id'], $questgroupId); - foreach($questgroups as &$group) - { - $childQuestgroupText = $this->getFirstQuestgroupText($group['id']); - if(!is_null($childQuestgroupText)) { - return $childQuestgroupText; - } - } - } - - - // No text found - return null; - } - - /** * Get the next Questgroup. * diff --git a/models/QuestgrouptextsModel.inc b/models/QuestgrouptextsModel.inc new file mode 100644 index 00000000..8abe42f6 --- /dev/null +++ b/models/QuestgrouptextsModel.inc @@ -0,0 +1,181 @@ + + * @copyright 2014 Heinrich-Heine-Universität Düsseldorf + * @license http://www.gnu.org/licenses/gpl.html + * @link https://bitbucket.org/coderkun/the-legend-of-z + */ + + namespace hhu\z\models; + + + /** + * Model to interact with Questgrouptexts-table. + * + * @author Oliver Hanraths + */ + class QuestgrouptextsModel extends \hhu\z\Model + { + /** + * Required models + * + * @var array + */ + public $models = array('questgroupshierarchy', 'questgroups', 'quests', 'questtexts'); + + + + + /** + * Construct a new QuestgrouptextsModel. + */ + public function __construct() + { + parent::__construct(); + } + + + + + /** + * Get texts of a Questgroup. + * + * @param int $questgroupId ID of a Questgroup + * @return array Texts of this Questgroup + */ + public function getQuestgroupTexts($questgroupId) + { + return $this->db->query( + 'SELECT id, pos, text, questgroup_id '. + 'FROM questgrouptexts '. + 'WHERE questgroup_id = ? '. + 'ORDER BY pos ASC', + 'i', + $questgroupId + ); + } + + + /** + * Get the first text of a Questgroup. + * + * @param int $questgroupId ID of a Questgroup + * @return string First text of this Questgroup or NULL + */ + public function getFirstQuestgroupText($questgroupId) + { + // Text of Questgroup itself + $questgroupTexts = $this->getQuestgroupTexts($questgroupId); + if(!empty($questgroupTexts)) { + return $questgroupTexts[0]['text']; + } + + // Text of first Quest + $quest = $this->Quests->getFirstQuestOfQuestgroup($questgroupId); + if(!is_null($quest)) + { + $questText = $this->Questtexts->getFirstQuestText($quest['id']); + if(!is_null($questText)) { + return $questText; + } + } + + // Text of ChildQuestgroups + $questgroupHierarchy = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroupId); + $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroupHierarchy['id']); + foreach($childQuestgroupshierarchy as &$hierarchy) + { + // Get Questgroups + $questgroups = $this->Questgroups->getQuestgroupsForHierarchy($hierarchy['id'], $questgroupId); + foreach($questgroups as &$group) + { + $childQuestgroupText = $this->getFirstQuestgroupText($group['id']); + if(!is_null($childQuestgroupText)) { + return $childQuestgroupText; + } + } + } + + + // No text found + return null; + } + + + /** + * Add a Questgroup text to a Questgroup. + * + * @param int $userId ID of user + * @param int $questgroupId ID of Questgroup to add text to + * @param string $text Text to add + */ + public function addQuestgrouptextToQuestgroup($userId, $questgroupId, $text) + { + // Get position + $pos = $this->db->query( + 'SELECT COALESCE(MAX(pos),0)+1 AS pos '. + 'FROM questgrouptexts '. + 'WHERE questgroup_id = ?', + 'i', + $questgroupId + ); + $pos = $pos[0]['pos']; + + // Add Questgroup text + $this->db->query( + 'INSERT INTO questgrouptexts '. + '(created_user_id, questgroup_id, pos, text) '. + 'VALUES '. + '(?, ?, ?, ?)', + 'iiis', + $userId, $questgroupId, $pos, $text + ); + } + + + /** + * Edit a Questgroup text. + * + * @param int $questgrouptextId ID of Questgroup text to edit + * @param string $text New text + */ + public function editQuestgrouptext($questgrouptextId, $text) + { + $this->db->query( + 'UPDATE questgrouptexts '. + 'SET text = ? '. + 'WHERE id = ?', + 'si', + $text, + $questgrouptextId + ); + } + + + /** + * Delete a Questgroup text. + * + * @param array $questgrouptext Data of Questgroup text to delete + */ + public function deleteQuestgrouptext($questgrouptext) + { + // Delete Questgroup text + $this->db->query('DELETE FROM questgrouptexts WHERE id = ?', 'i', $questgrouptext['id']); + + // Adjust positions + $this->db->query( + 'UPDATE questgrouptexts '. + 'SET pos = pos - 1 '. + 'WHERE questgroup_id = ? AND pos > ?', + 'ii', + $questgrouptext['questgroup_id'], + $questgrouptext['pos'] + ); + } + + } + +?> diff --git a/views/html/questgroups/edittexts.tpl b/views/html/questgroups/edittexts.tpl new file mode 100644 index 00000000..5667e1e5 --- /dev/null +++ b/views/html/questgroups/edittexts.tpl @@ -0,0 +1,25 @@ + +
+ +
+ + + +

+
+
+
    + +
  • +
    + + +
  • + +
  • + +
  • +
+
+ +
diff --git a/views/html/questgroups/questgroup.tpl b/views/html/questgroups/questgroup.tpl index 0491e69b..f345ddeb 100644 --- a/views/html/questgroups/questgroup.tpl +++ b/views/html/questgroups/questgroup.tpl @@ -13,7 +13,12 @@ 0) : ?> +