implement CRUD for Questgroup texts (issue #32)

This commit is contained in:
coderkun 2014-07-01 22:24:28 +02:00
commit 5fa70e65b3
8 changed files with 309 additions and 76 deletions

View file

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

View file

@ -238,7 +238,7 @@
array('^questgroupshierarchy/([^/]+)/create/?$', 'questgroupshierarchy/create/$1', true), array('^questgroupshierarchy/([^/]+)/create/?$', 'questgroupshierarchy/create/$1', true),
array('^questgroupshierarchy/([^/]+)/([^/]+)/(edit|delete|moveup|movedown)/?$', 'questgroupshierarchy/$3/$1/$2', true), array('^questgroupshierarchy/([^/]+)/([^/]+)/(edit|delete|moveup|movedown)/?$', 'questgroupshierarchy/$3/$1/$2', true),
array('^questgroups/([^/]+)/create/?$', 'questgroups/create/$1', true), array('^questgroups/([^/]+)/create/?$', 'questgroups/create/$1', true),
array('^questgroups/([^/]+)/([^/]+)/(edit|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),
@ -286,7 +286,7 @@
array('^questgroupshierarchy/([^/]+)/(.*)$', 'questgroupshierarchy/$2/$1', true), array('^questgroupshierarchy/([^/]+)/(.*)$', 'questgroupshierarchy/$2/$1', true),
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|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),

View file

@ -24,7 +24,7 @@
* *
* @var array * @var array
*/ */
public $models = array('seminaries', 'questgroupshierarchy', 'questgroups', 'quests', 'questtexts', 'media'); public $models = array('seminaries', 'questgroupshierarchy', 'questgroups', 'questgrouptexts', 'quests', 'questtexts', 'media');
/** /**
* Required components * Required components
* *
@ -144,7 +144,7 @@
} }
// Get texts // Get texts
$questgroupTexts = $this->Questgroups->getQuestgroupTexts($questgroup['id']); $questgroupTexts = $this->Questgrouptexts->getQuestgroupTexts($questgroup['id']);
// Media // Media
$picture = null; $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. * Action: moveup.
* *

View file

@ -24,7 +24,7 @@
* *
* @var array * @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 * Required components
* *
@ -137,7 +137,7 @@
} }
// Get first Questgroup text // Get first Questgroup text
$text = $this->Questgroups->getFirstQuestgroupText($questgroup['id']); $text = $this->Questgrouptexts->getFirstQuestgroupText($questgroup['id']);
if(!is_null($text)) if(!is_null($text))
{ {
$questgroup['text'] = \hhu\z\Utils::shortenString($text, 100, 120).' …'; $questgroup['text'] = \hhu\z\Utils::shortenString($text, 100, 120).' …';

View file

@ -31,7 +31,7 @@
* *
* @var array * @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. * Get the next Questgroup.
* *

View file

@ -0,0 +1,181 @@
<?php
/**
* The Legend of Z
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
* @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 <oliver.hanraths@uni-duesseldorf.de>
*/
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']
);
}
}
?>

View file

@ -0,0 +1,25 @@
<?php if(!is_null($picture)) : ?>
<div class="moodpic">
<img src="<?=$linker->link(array('media','seminary',$seminary['url'],$picture['url']))?>" />
</div>
<?php endif ?>
<?=$questgroupshierarchypath?>
<h1><?=_('Edit Questgroup texts')?></h1>
<form method="post">
<fieldset>
<ul class="admnql">
<?php foreach($questgrouptexts as &$text) : ?>
<li class="cf">
<textarea name="questgrouptexts[<?=$text['id']?>]"><?=$text['text']?></textarea><br />
<input id="deletes[<?=$text['id']?>]" type="checkbox" name="deletes[<?=$text['id']?>]" />
<label for="deletes[<?=$text['id']?>]"><?=_('delete')?></label>
</li>
<?php endforeach ?>
<li class="cf">
<textarea name="questgrouptexts[]" placeholder="<?=_('New Questgroup text')?>"></textarea>
</li>
</ul>
</fieldset>
<input type="submit" name="edit" value="<?=_('edit')?>" />
</form>

View file

@ -13,7 +13,12 @@
<?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(array('edit',$seminary['url'],$questgroup['url']),1)?>"><?=_('Edit Questgroup')?></a></li> <li><a href="<?=$linker->link(array('edit',$seminary['url'],$questgroup['url']),1)?>"><?=_('Edit Questgroup')?></a></li>
<li><a href="<?=$linker->link(array('edittexts',$seminary['url'],$questgroup['url']),1)?>"><?=_('Edit Questgroup texts')?></a></li>
<?php if(in_array('admin', \hhu\z\controllers\SeminaryController::$character['characterroles'])) : ?>
<li><a href="<?=$linker->link(array('delete',$seminary['url'],$questgroup['url']),1)?>"><?=_('Delete Questgroup')?></a></li> <li><a href="<?=$linker->link(array('delete',$seminary['url'],$questgroup['url']),1)?>"><?=_('Delete Questgroup')?></a></li>
<?php endif ?>
</nav>
<nav class="admin">
<li><a href="<?=$linker->link(array('quests','create',$seminary['url'],$questgroup['url']))?>"><?=_('Create new Quest')?></a></li> <li><a href="<?=$linker->link(array('quests','create',$seminary['url'],$questgroup['url']))?>"><?=_('Create new Quest')?></a></li>
</nav> </nav>
<?php endif ?> <?php endif ?>