implement Questtexts and Sidequests

This commit is contained in:
coderkun 2014-02-12 23:39:15 +01:00
commit 46364ac6f2
10 changed files with 355 additions and 15 deletions

View file

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

View file

@ -76,8 +76,14 @@
// Get Quests
$quests = null;
if(count($childQuestgroupshierarchy) == 0) {
if(count($childQuestgroupshierarchy) == 0)
{
$quests = $this->Quests->getQuestsForQuestgroup($questgroup['id']);
// Attach sidequests
foreach($quests as &$quest) {
$quest['sidequests'] = $this->Quests->getSidequestsForQuest($quest['id']);
}
}

View file

@ -51,9 +51,11 @@
* Show a quest and its task.
*
* @throws IdNotFoundException
* @param string $seminaryUrl URL-Title of a Seminary
* @param string $questgroupUrl URL-Title of a Questgroup
* @param string $questUrl URL-Title of a Quest
* @param string $seminaryUrl URL-Title of a Seminary
* @param string $questgroupUrl URL-Title of a Questgroup
* @param string $questUrl URL-Title of a Quest
* @param string $questtexttypeUrl URL-Title of a Questtexttype
* @param int $questtextPos Position of Questtext
*/
public function quest($seminaryUrl, $questgroupUrl, $questUrl, $questtexttypeUrl=null, $questtextPos=1)
{
@ -73,10 +75,16 @@
if(is_null($questtexttypeUrl)) {
$questtexttypeUrl = 'Prolog';
}
if(in_array($questtexttypeUrl, $questtexttypes))
$questtextCount = $this->Questtexts->getQuesttextsCountForQuest($quest['id'], $questtexttypeUrl);
if($questtextCount > 0)
{
$questtextPos = max(intval($questtextPos), 1);
$questtext = $this->Questtexts->getQuesttextByUrl($quest['id'], $questtexttypeUrl, $questtextPos);
if(in_array($questtexttypeUrl, $questtexttypes))
{
$questtextPos = max(intval($questtextPos), 1);
$questtext = $this->Questtexts->getQuesttextByUrl($quest['id'], $questtexttypeUrl, $questtextPos);
$questtext['count'] = $questtextCount;
$questtext['sidequests'] = $this->Quests->getSidequestsForQuesttext($questtext['id']);
}
}
// Show task only for Prologes
@ -94,6 +102,71 @@
$this->set('showtask', $showTask);
}
/**
* Action: sidequest.
*
* Show a sidequest and its task.
*
* @throws IdNotFoundException
* @param string $seminaryUrl URL-Title of a Seminary
* @param string $questgroupUrl URL-Title of a Questgroup
* @param string $questUrl URL-Title of a Quest
* @param string $sidequestUrl URL-Title of a Sidequest
* @param string $questtexttypeUrl URL-Title of a Questtexttype
* @param int $questtextPos Position of Questtext
*/
public function sidequest($seminaryUrl, $questgroupUrl, $questUrl, $sidequestUrl, $sidequesttexttypeUrl=null, $sidequesttextPos=1)
{
// Get seminary
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
// Get Questgroup
$questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl);
// Get Quest
$quest = $this->Quests->getQuestByUrl($seminary['id'], $questgroup['id'], $questUrl);
// Get Sidequest
$sidequest = $this->Quests->getSidequestByUrl($seminary['id'], $questgroup['id'], $quest['id'], $sidequestUrl);
// Get Questtext
$questtext = $this->Questtexts->getQuesttextForSidequest($sidequest['id']);
// Get Sidequesttext
$sidequesttext = null;
$questtexttypes = $this->Questtexts->getQuesttexttypes();
$questtexttypes = array_map(function($t) { return $t['url']; }, $questtexttypes);
if(is_null($sidequesttexttypeUrl)) {
$sidequesttexttypeUrl = 'Prolog';
}
$sidequesttextCount = $this->Questtexts->getQuesttextsCountForSidequest($sidequest['id'], $sidequesttexttypeUrl);
if($sidequesttextCount > 0)
{
if(in_array($sidequesttexttypeUrl, $questtexttypes))
{
$sidequesttextPos = max(intval($sidequesttextPos), 1);
$sidequesttext = $this->Questtexts->getSidequesttextByUrl($sidequest['id'], $sidequesttexttypeUrl, $sidequesttextPos);
$sidequesttext['count'] = $sidequesttextCount;
}
}
// Show task only for Prologes
$showTask = false;
if($sidequesttext['type'] == 'Prolog') {
$showTask = true;
}
// Pass data to view
$this->set('seminary', $seminary);
$this->set('questgroup', $questgroup);
$this->set('sidequesttext', $sidequesttext);
$this->set('quest', $quest);
$this->set('questtext', $questtext);
$this->set('sidequest', $sidequest);
$this->set('showtask', $showTask);
}
}
?>

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: The Legend of Z\n"
"POT-Creation-Date: 2014-02-09 12:48+0100\n"
"PO-Revision-Date: 2014-02-09 12:48+0100\n"
"POT-Creation-Date: 2014-02-12 23:09+0100\n"
"PO-Revision-Date: 2014-02-12 23:10+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
@ -30,6 +30,7 @@ msgstr "Benutzer"
#: ../../../views/html/seminaries/create.tpl:1
#: ../../../views/html/questgroups/questgroup.tpl:1
#: ../../../views/html/quests/quest.tpl:1
#: ../../../views/html/quests/sidequest.tpl:1
msgid "Seminaries"
msgstr "Kurse"
@ -156,10 +157,27 @@ msgstr "Soll der Kurs „%s“ wirklich gelöscht werden?"
msgid "New seminary"
msgstr "Neuer Kurs"
#: ../../../views/html/questgroups/questgroup.tpl:23
msgid "Quests"
msgstr "Quests"
#: ../../../views/html/questgroups/questgroup.tpl:29
msgid "containing optional Quests"
msgstr "Enthaltene optionale Quests"
#: ../../../views/html/introduction/index.tpl:1
msgid "Introduction"
msgstr "Einführung"
#: ../../../views/html/quests/quest.tpl:33
#: ../../../views/html/quests/sidequest.tpl:20
msgid "Task"
msgstr "Aufgabe"
#: ../../../views/html/quests/sidequest.tpl:8
msgid "This Quest is optional"
msgstr "Diese Quest ist optional"
#~ msgid "created by %s on %s at %s"
#~ msgstr "erstellt von %s am %s um %s Uhr"

View file

@ -80,6 +80,79 @@
return $data[0];
}
/**
* Get a Sidequest and its data by its URL.
*
* @throws IdNotFoundException
* @param int $seminaryId ID of the corresponding Seminary
* @param int $questgroupId ID of the corresponding Questgroup
* @param int $questId ID of the Quest
* @param string $sidequestUrl URL-title of a Sidequest
* @return array Sidequest data
*/
public function getSidequestByUrl($seminaryId, $questgroupId, $questId, $sidequestUrl)
{
$data = $this->db->query(
'SELECT sidequests.id, sidequests.questtype_id, sidequests.title, sidequests.url, sidequests.xps, sidequests.task '.
'FROM sidequests '.
'LEFT JOIN questtexts ON questtexts.id = sidequests.questtext_id '.
'LEFT JOIN quests ON quests.id = questtexts.quest_id '.
'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '.
'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '.
'LEFT JOIN seminaries ON seminaries.id = questgroupshierarchy.seminary_id '.
'WHERE sidequests.url = ? AND quests.id = ? AND questgroups.id = ? AND seminaries.id = ?',
'siii',
$sidequestUrl,
$questId,
$questgroupId,
$seminaryId
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException();
}
return $data[0];
}
/**
* Get all sidequests for a Quest.
*
* @param int $questId ID of the quest
* @return array Sidequests for the quest
*/
public function getSidequestsForQuest($questId)
{
return $this->db->query(
'SELECT sidequests.id, sidequests.questtext_id, sidequests.title, sidequests.url, sidequests.entry_text '.
'FROM sidequests '.
'LEFT JOIN questtexts ON questtexts.id = sidequests.questtext_id '.
'WHERE questtexts.quest_id = ?',
'i',
$questId
);
}
/**
* Get all sidequests for a Questtext.
*
* @param int $questtextId ID of the questtext
* @return array Sidequests for the questtext
*/
public function getSidequestsForQuesttext($questtextId)
{
return $this->db->query(
'SELECT id, questtext_id, title, url, entry_text '.
'FROM sidequests '.
'WHERE questtext_id = ?',
'i',
$questtextId
);
}
}
?>

View file

@ -46,10 +46,10 @@
public function getQuesttextByUrl($questId, $questtexttypeUrl, $pos)
{
$data = $this->db->query(
'SELECT questtexts.id, questtexts.text, questtexts.out_text, questtexttypes.type '.
'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexts.out_text, 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 = ? AND questtexts.pos = ?',
'WHERE questtexts.quest_id = ? AND questtexttypes.url = ? AND questtexts.pos = ?',
'isi',
$questId, $questtexttypeUrl, $pos
);
@ -62,6 +62,115 @@
}
/**
* Get a Questtext for a Sidequest by its URL.
*
* @throws IdNotFoundException
* @param int $sidequestId ID of the Sidequest to get text for
* @param string $questtexttypeUrl URL of the Questtexttype
* @param int $pos Position of Questtexttype
* @return array Questtexttype data
*/
public function getSidequesttextByUrl($sidequestId, $questtexttypeUrl, $pos)
{
$data = $this->db->query(
'SELECT sidequesttexts.id, sidequesttexts.text, sidequesttexts.pos, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '.
'FROM sidequesttexts '.
'LEFT JOIN questtexttypes ON questtexttypes.id = sidequesttexts.questtexttype_id '.
'WHERE sidequesttexts.sidequest_id = ? AND questtexttypes.url = ? AND sidequesttexts.pos = ?',
'isi',
$sidequestId, $questtexttypeUrl, $pos
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($questtexttypeUrl);
}
return $data = $data[0];
}
/**
* Get count of Questtexts for a Quest.
*
* @param int $questId ID of the Quest
* @param string $questtexttypeUrl URL of the Questtexttype
* @return int Conut of Questtexts for Quest
*/
public function getQuesttextsCountForQuest($questId, $questtexttypUrl)
{
$count = 0;
$data = $this->db->query(
'SELECT COUNT(questtexts.id) AS c '.
'FROM questtexts '.
'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '.
'WHERE questtexts.quest_id = ? AND questtexttypes.url = ?',
'is',
$questId, $questtexttypUrl
);
if(!empty($data)) {
$count = $data[0]['c'];
}
return $count;
}
/**
* Get count of Questtexts for a Sidequest.
*
* @param int $sidequestId ID of the Sidequest
* @param string $questtexttypeUrl URL of the Questtexttype
* @return int Conut of Questtexts for Sideuest
*/
public function getQuesttextsCountForSidequest($questId, $questtexttypUrl)
{
$count = 0;
$data = $this->db->query(
'SELECT COUNT(sidequesttexts.id) AS c '.
'FROM sidequesttexts '.
'LEFT JOIN questtexttypes ON questtexttypes.id = sidequesttexts.questtexttype_id '.
'WHERE sidequesttexts.sidequest_id = ? AND questtexttypes.url = ?',
'is',
$questId, $questtexttypUrl
);
if(!empty($data)) {
$count = $data[0]['c'];
}
return $count;
}
/**
* Get corresponding Questtext for a Sidequest.
*
* @throws IdNotFoundException
* @param int $sidequestId ID of the Sidequest to get the Questtext for
* @param array Questtext data
*/
public function getQuesttextForSidequest($sidequestId)
{
$data = $this->db->query(
'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '.
'FROM sidequests '.
'LEFT JOIN questtexts ON questtexts.id = sidequests.questtext_id '.
'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '.
'WHERE sidequests.id = ?',
'i',
$sidequestId
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException();
}
return $data[0];
}
/**
* Get all registered Questtexttypes.
*

View file

@ -20,10 +20,21 @@
<?php endforeach ?>
<?php if(isset($quests) && !is_null($quests)) : ?>
<h3>Quests</h3>
<h3><?=_('Quests')?></h3>
<ul>
<?php foreach($quests as &$quest) : ?>
<li><a href="<?=$linker->link(array('quests','quest',$seminary['url'],$questgroup['url'],$quest['url']))?>"><?=$quest['title']?></a></li>
<li>
<a href="<?=$linker->link(array('quests','quest',$seminary['url'],$questgroup['url'],$quest['url']))?>"><?=$quest['title']?></a>
<br />
<?=_('containing optional Quests')?>:
<?php if(count($quest['sidequests']) > 0) : ?>
<ul>
<?php foreach($quest['sidequests'] as &$sidequest) : ?>
<li><?=$sidequest['title']?></li>
<?php endforeach ?>
</ul>
<?php endif ?>
</li>
<?php endforeach ?>
</ul>
<?php endif ?>

View file

@ -5,14 +5,32 @@
<h3><?=$quest['title']?></h3>
<section>
<h1><?=$questtext['type']?></h1>
<p><?=$questtext['text']?></p>
<?php if(!empty($questtext['out_text'])) : ?>
<a href=""><?=$questtext['out_text']?></a>
<?php if(!empty($questtext['sidequests'])) : ?>
<ul>
<?php foreach($questtext['sidequests'] as &$sidequest) : ?>
<li><a href="<?=$linker->link(array('sidequest',$seminary['url'],$questgroup['url'],$quest['url'],$sidequest['url']),1)?>"><?=$sidequest['entry_text']?></a></li>
<?php endforeach ?>
<?php if(!empty($questtext['out_text'])) : ?>
<li><a href="<?=$linker->link($questtext['pos']+1, 6)?>"><?=$questtext['out_text']?></a>
<?php endif ?>
</ul>
<?php endif ?>
<?php if(!empty($questtext['out_text']) && empty($questtext['sidequests'])) : ?>
<a href="<?=$linker->link($questtext['pos']+1, 6)?>"><?=$questtext['out_text']?></a>
<?php endif ?>
<?php if($questtext['pos'] > 1) : ?><a href="<?=$linker->link(array($questtext['type_url'],$questtext['pos']-1),5)?>">&lt;</a><?php endif ?>
<?=$questtext['pos']?>/<?=$questtext['count']?>
<?php if($questtext['pos'] < $questtext['count'] && empty($questtext['out_text'])) : ?><a href="<?=$linker->link(array($questtext['type_url'],$questtext['pos']+1),5)?>">&gt;</a><?php endif ?>
</section>
<?php if($showtask) : ?>
<section>
<h1><?=_('Task')?></h1>
<p><?=$quest['task']?></p>
</section>
<?php endif ?>

View file

@ -0,0 +1,23 @@
<h1><?=_('Seminaries')?></h1>
<h2><?=$seminary['title']?></h2>
<?=$questgroupshierarchypath?>
<h3><a href="<?=$linker->link(array('quest',$seminary['url'],$questgroup['url'],$quest['url'],$questtext['type_url'],$questtext['pos']),1)?>"><?=$quest['title']?></a></h3>
<h4><?=$sidequest['title']?></h4>
<p><?=_('This Quest is optional')?>.</p>
<section>
<h1><?=$sidequesttext['type']?></h1>
<p><?=$sidequesttext['text']?></p>
<?php if($sidequesttext['pos'] > 1) : ?><a href="<?=$linker->link(array($sidequesttext['type_url'],$sidequesttext['pos']-1),6)?>">&lt;</a><?php endif ?>
<?=$sidequesttext['pos']?>/<?=$sidequesttext['count']?>
<?php if($sidequesttext['pos'] < $sidequesttext['count'] && empty($sidequesttext['out_text'])) : ?><a href="<?=$linker->link(array($sidequesttext['type_url'],$sidequesttext['pos']+1),6)?>">&gt;</a><?php endif ?>
</section>
<?php if($showtask) : ?>
<section>
<h1><?=_('Task')?></h1>
<p><?=$sidequest['task']?></p>
</section>
<?php endif ?>