implement managing of Queststopics

This commit is contained in:
coderkun 2014-05-16 00:22:24 +02:00
commit f41f48b928
7 changed files with 169 additions and 8 deletions

View file

@ -235,6 +235,7 @@
array('^achievements/([^/]+)/?$', 'achievements/index/$1', true),
array('^library/([^/]+)/?$', 'library/index/$1', true),
array('^library/([^/]+)/([^/]+)/?$', 'library/topic/$1/$2', true),
array('^library/([^/]+)/([^/]+)/manage/?$', 'library/managetopic/$1/$2', true),
array('^media/(.*)$', 'media/$1?layout=binary', false),
array('^uploads/(.*)$', 'uploads/$1?layout=binary', false)
);
@ -271,7 +272,8 @@
array('^charactergroupsquests/quest/(.*)$', 'charactergroupsquests/$1', true),
array('^charactergroupsquests/(edit|delete|manage)/([^/]+)/([^/]+)/([^/]+)$', 'charactergroupsquests/$2/$3/$4/$1', true),
array('^achievements/index/(.*)$', 'achievements/$1', true),
array('^library/(index|topic)/(.*)$', 'library/$2', true)
array('^library/(index|topic)/(.*)$', 'library/$2', true),
array('^library/managetopic/(.*)$', 'library/$1/manage', true)
);

View file

@ -31,7 +31,9 @@
* @var array
*/
public $permissions = array(
'index' => array('admin', 'moderator', 'user')
'index' => array('admin', 'moderator', 'user'),
'topic' => array('admin', 'moderator', 'user'),
'managetopic' => array('admin', 'moderator', 'user')
);
/**
* User seminary permissions
@ -39,7 +41,9 @@
* @var array
*/
public $seminaryPermissions = array(
'index' => array('admin', 'moderator', 'user')
'index' => array('admin', 'moderator', 'user', 'guest'),
'topic' => array('admin', 'moderator', 'user', 'guest'),
'managetopic' => array('admin', 'moderator')
);
@ -139,6 +143,64 @@
$this->set('quests', $quests);
}
/**
* Action: managetopic.
*
* Manage a Questtopic and its Quests with Questsubtopics.
*
* @throws IdNotFoundException
* @param string $eminaryUrl URL-Title of Seminary
* @param string $questtopicUrl URL-Title of Questtopic
*/
public function managetopic($seminaryUrl, $questtopicUrl)
{
// Get Seminary
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
// Get Questtopic
$questtopic = $this->Questtopics->getQuesttopicByUrl($seminary['id'], $questtopicUrl);
// Get Questsubtopics
$questsubtopics = $this->Questtopics->getSubtopicsForQuesttopic($questtopic['id']);
// Set Questsubtopics for Quests
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('questsubtopics')))
{
$quests = $this->Quests->getQuestsForQuesttopic($questtopic['id']);
$selectedSubtopics = $this->request->getPostParam('questsubtopics');
foreach($quests as &$quest)
{
$subtopics = (array_key_exists($quest['id'], $selectedSubtopics)) ? $selectedSubtopics[$quest['id']] : array();
$this->Questtopics->setQuestsubtopicsForQuest($quest['id'], array_keys($subtopics));
}
}
// Get Quests
$quests = $this->Quests->getQuestsForQuesttopic($questtopic['id']);
foreach($quests as &$quest)
{
// Get Questgroup
$quest['questgroup'] = $this->Questgroups->getQuestgroupById($quest['questgroup_id']);
// Get Subtopics
$quest['subtopics'] = $this->Questtopics->getQuestsubtopicsForQuest($quest['id']);
$quest['subtopics'] = array_map(function($t) { return $t['id']; }, $quest['subtopics']);
}
// Set title
$this->addTitle($questtopic['title']);
$this->addTitleLocalized('Library');
$this->addTitle($seminary['title']);
// Pass data to view
$this->set('seminary', $seminary);
$this->set('questtopic', $questtopic);
$this->set('questsubtopics', $questsubtopics);
$this->set('quests', $quests);
}
}
?>

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: The Legend of Z\n"
"POT-Creation-Date: 2014-05-15 23:32+0100\n"
"PO-Revision-Date: 2014-05-15 23:33+0100\n"
"POT-Creation-Date: 2014-05-16 00:20+0100\n"
"PO-Revision-Date: 2014-05-16 00:21+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
@ -732,7 +732,8 @@ msgstr "Das Kursfeld „%s“ ist ungültig"
msgid "Seminary fields"
msgstr "Kursfelder"
#: views/html/characters/index.tpl:13 views/html/users/index.tpl:7
#: views/html/characters/index.tpl:13 views/html/library/managetopic.tpl:26
#: views/html/users/index.tpl:7
msgid "Manage"
msgstr "Verwalten"
@ -842,8 +843,8 @@ msgstr "Du hast Level %d erreicht"
msgid "Introduction"
msgstr "Einführung"
#: views/html/library/index.tpl:9 views/html/library/topic.tpl:8
#: views/html/seminarymenu/index.tpl:7
#: views/html/library/index.tpl:9 views/html/library/managetopic.tpl:8
#: views/html/library/topic.tpl:8 views/html/seminarymenu/index.tpl:7
msgid "Library"
msgstr "Bibliothek"
@ -861,6 +862,10 @@ msgstr ""
msgid "Total progress: %d%%"
msgstr "Gesamtfortschritt: %d%%"
#: views/html/library/topic.tpl:13
msgid "Manage topic"
msgstr "Thema verwalten"
#: views/html/menu/index.tpl:2 views/html/users/create.tpl:5
#: views/html/users/delete.tpl:5 views/html/users/edit.tpl:6
#: views/html/users/edit.tpl:8 views/html/users/index.tpl:4

View file

@ -131,6 +131,25 @@
}
/**
* Get alle Questsubtopics for a Questtopic.
*
* @param int $questtopicId ID of Questtopic
* @return array List of Questsubtopics for this Questtopic
*/
public function getSubtopicsForQuesttopic($questtopicId)
{
return $this->db->query(
'SELECT id, questtopic_id, title, url '.
'FROM questsubtopics '.
'WHERE questsubtopics.questtopic_id = ? '.
'ORDER BY title ASC',
'i',
$questtopicId
);
}
/**
* Get all Questsubtopics for a Quest.
*
@ -149,6 +168,47 @@
);
}
/**
* Set Questsubtopics for a Quest.
*
* @param int $questId ID of Quest to set subtopics for
* @param array $questsubtopicIds List of IDs of subtopics to set
*/
public function setQuestsubtopicsForQuest($questId, $questsubtopicIds)
{
$this->db->setAutocommit(false);
try {
// Remove Questsubtopics
$this->db->query(
'DELETE FROM quests_questsubtopics '.
'WHERE quest_id = ?',
'i',
$questId
);
// Add Questsubtopics
foreach($questsubtopicIds as &$questsubtopicId)
{
$this->db->query(
'INSERT INTO quests_questsubtopics '.
'(quest_id, questsubtopic_id) '.
'VALUES '.
'(?, ?)',
'ii',
$questId, $questsubtopicId
);
}
}
catch(\nre\exceptions\DatamodelException $e) {
$this->db->rollback();
$this->db->setAutocommit(true);
throw $e;
}
$this->db->setAutocommit(true);
}
}
?>

View file

@ -0,0 +1,27 @@
<?php if(!is_null($seminary['library_seminarymedia_id'])) : ?>
<div class="moodpic">
<img src="<?=$linker->link(array('media','seminarymoodpic',$seminary['url'], 'library'))?>">
</div>
<?php endif ?>
<ul class="breadcrumbs">
<li><a href="<?=$linker->link(array('seminaries',$seminary['url']))?>"><?=$seminary['title']?></a></li>
<li><i class="fa fa-chevron-right fa-fw"></i><a href="<?=$linker->link(array('index',$seminary['url']),1)?>"><?=_('Library')?></a></li>
<li><i class="fa fa-chevron-right fa-fw"></i><a href="<?=$linker->link(array('topic',$seminary['url'],$questtopic['url']),1)?>"><?=$questtopic['title']?></a></li>
</ul>
<h1><i class="fa fa-book fa-fw"></i><?=$questtopic['title']?></h1>
<h2>Quests zu diesem Thema:</h2>
<form method="post">
<ul class="libtop">
<?php foreach($quests as &$quest) : ?>
<li>
<p><a href="<?=$linker->link(array('quests','quest',$seminary['url'],$quest['questgroup']['url'],$quest['url']))?>"><?=$quest['title']?></a></p>
<?php foreach($questsubtopics as &$subtopic) : ?>
<input id="subtopic-<?=$quest['id']?>-<?=$subtopic['id']?>" type="checkbox" name="questsubtopics[<?=$quest['id']?>][<?=$subtopic['id']?>]" <?php if(in_array($subtopic['id'], $quest['subtopics'])) : ?>checked="checked"<?php endif ?> />
<label for="subtopic-<?=$quest['id']?>-<?=$subtopic['id']?>"><?=$subtopic['title']?></label><br />
<?php endforeach ?>
</li>
<?php endforeach ?>
</ul>
<input type="submit" value="<?=_('Manage')?>" />
</form>

View file

@ -8,6 +8,11 @@
<li><i class="fa fa-chevron-right fa-fw"></i><a href="<?=$linker->link(array('index',$seminary['url']),1)?>"><?=_('Library')?></a></li>
</ul>
<h1><i class="fa fa-book fa-fw"></i><?=$questtopic['title']?></h1>
<?php if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0) : ?>
<nav class="admin">
<li><a href="<?=$linker->link(array('managetopic',$seminary['url'],$questtopic['url']),1)?>"><?=_('Manage topic')?></a></li>
</nav>
<?php endif ?>
<div class="libindxpr cf">
<p><small>Themenfortschritt: <?=$questtopic['characterQuestcount']?> / <?=$questtopic['questcount']?></small></p>
<div class="xpbar">