1) update Quest stati

2) add SubmissionNotValidException and -handling for Quests
This commit is contained in:
coderkun 2014-04-04 13:26:49 +02:00
commit 76875f1c69
11 changed files with 268 additions and 108 deletions

View file

@ -59,12 +59,13 @@
*
* Show the task of a Quest.
*
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param Exception $exception Character submission exception
*/
public abstract function quest($seminary, $questgroup, $quest, $character);
public abstract function quest($seminary, $questgroup, $quest, $character, $exception);

View file

@ -0,0 +1,77 @@
<?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\exceptions;
/**
* Exception: Character submission not valid.
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
*/
class SubmissionNotValidException extends \nre\core\Exception
{
/**
* Error code
*
* @var int
*/
const CODE = 200;
/**
* Error message
*
* @var string
*/
const MESSAGE = 'Character submission not valid';
/**
* Nested exception
*
* @var Exception
*/
private $nestedException;
/**
* Construct a new exception.
*
* @param string $nestedException Nested exception
*/
function __construct($nestedException, $message=self::MESSAGE, $code=self::CODE)
{
parent::__construct(
$message,
$code,
$nestedException
);
// Store value
$this->nestedException = $nestedException;
}
/**
* Get Nested exception.
*
* @return string Nested exception
*/
public function getNestedException()
{
return $this->nestedException;
}
}
?>

View file

@ -277,17 +277,14 @@
$questmedia = $this->Media->getMediaById($quest['questsmedia_id']);
}
// Get submitted Character submissions
$submittedSubmissionCharacters = $this->Characters->getCharactersSubmittedQuest($quest['id']);
// Get unsolved Character submissions
$unsolvedSubmissions = $this->Quests->getCharactersUnsolvedQuest($quest['id']);
foreach($unsolvedSubmissions as &$submission) {
$submission['character'] = $this->Characters->getCharacterById($submission['character_id']);
}
$unsolvedSubmissionCharacters = $this->Characters->getCharactersUnsolvedQuest($quest['id']);
// Get solved Character submissions
$solvedSubmissions = $this->Quests->getCharactersSolvedQuest($quest['id']);
foreach($solvedSubmissions as &$submission) {
$submission['character'] = $this->Characters->getCharacterById($submission['character_id']);
}
$solvedSubmissionCharacters = $this->Characters->getCharactersSolvedQuest($quest['id']);
// Pass data to view
@ -295,8 +292,9 @@
$this->set('questgroup', $questgroup);
$this->set('quest', $quest);
$this->set('media', $questmedia);
$this->set('unsolvedsubmissions', $unsolvedSubmissions);
$this->set('solvedsubmissions', $solvedSubmissions);
$this->set('submittedSubmissionCharacters', $submittedSubmissionCharacters);
$this->set('unsolvedSubmissionCharacters', $unsolvedSubmissionCharacters);
$this->set('solvedSubmissionCharacters', $solvedSubmissionCharacters);
}
@ -380,27 +378,39 @@
$answers = $this->request->getPostParam('answers');
// Save answers in database
if(!$this->Quests->hasCharacterSolvedQuest($quest['id'], $character['id'])) {
$questtypeAgent->saveAnswersOfCharacter($seminary, $questgroup, $quest, $character, $answers);
}
try {
if(!$this->Quests->hasCharacterSolvedQuest($quest['id'], $character['id'])) {
$questtypeAgent->saveAnswersOfCharacter($seminary, $questgroup, $quest, $character, $answers);
}
// Match answers with correct ones
$status = $questtypeAgent->matchAnswersofCharacter($seminary, $questgroup, $quest, $character, $answers);
if($status === true)
{
// Mark Quest as solved
$this->Quests->setQuestSolved($quest['id'], $character['id']);
// Match answers with correct ones
$status = $questtypeAgent->matchAnswersofCharacter($seminary, $questgroup, $quest, $character, $answers);
if($status === true)
{
// Mark Quest as solved
$this->Quests->setQuestSolved($quest['id'], $character['id']);
// Redirect
$this->redirect($this->linker->link('Epilog', 5, true, array('status'=>'solved')));
// Redirect
$this->redirect($this->linker->link('Epilog', 5, true, array('status'=>'solved')));
}
elseif($status === false)
{
// Mark Quest as unsolved
$this->Quests->setQuestUnsolved($quest['id'], $character['id']);
// Redirect
$this->redirect($this->linker->link('Prolog', 5, true, array('status'=>'unsolved')));
}
else {
// Mark Quest as submitted
$this->Quests->setQuestSubmitted($quest['id'], $character['id']);
// Redirect
$this->redirect($this->linker->link('Prolog', 5, true));
}
}
elseif($status === false)
{
// Mark Quest as unsolved
$this->Quests->setQuestUnsolved($quest['id'], $character['id']);
// Redirect
$this->redirect($this->linker->link('Prolog', 5, true, array('status'=>'unsolved')));
catch(\hhu\z\exceptions\SubmissionNotValidException $e) {
$response->addParam($e);
}
}

View file

@ -254,6 +254,88 @@
return 1;
}
/**
* Get Characters that solved a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersSolvedQuest($questId)
{
return $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.description AS avatar_description '.
'FROM v_characters AS characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN avatars ON avatars.id = characters.avatar_id '.
'LEFT JOIN avatarpictures ON avatarpictures.media_id = avatars.avatarpicture_id '.
'LEFT JOIN media ON media.id = avatarpictures.media_id '.
'WHERE EXISTS ('.
'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'.
')',
'ii',
$questId,
QuestsModel::QUEST_STATUS_SOLVED
);
}
/**
* Get Characters that did not solv a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersUnsolvedQuest($questId)
{
return $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.description AS avatar_description '.
'FROM v_characters AS characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN avatars ON avatars.id = characters.avatar_id '.
'LEFT JOIN avatarpictures ON avatarpictures.media_id = avatars.avatarpicture_id '.
'LEFT JOIN media ON media.id = avatarpictures.media_id '.
'WHERE EXISTS ('.
'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'.
') AND NOT EXISTS ('.
'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'.
')',
'iiii',
$questId, QuestsModel::QUEST_STATUS_UNSOLVED,
$questId, QuestsModel::QUEST_STATUS_SOLVED
);
}
/**
* Get Characters that sent a submission for a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersSubmittedQuest($questId)
{
return $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.description AS avatar_description '.
'FROM v_characters AS characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN avatars ON avatars.id = characters.avatar_id '.
'LEFT JOIN avatarpictures ON avatarpictures.media_id = avatars.avatarpicture_id '.
'LEFT JOIN media ON media.id = avatarpictures.media_id '.
'WHERE EXISTS ('.
'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'.
') AND NOT EXISTS ('.
'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'.
') AND NOT EXISTS ('.
'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'.
')',
'iiiiii',
$questId, QuestsModel::QUEST_STATUS_SUBMITTED,
$questId, QuestsModel::QUEST_STATUS_UNSOLVED,
$questId, QuestsModel::QUEST_STATUS_SOLVED
);
}
}
?>

View file

@ -24,19 +24,25 @@
*
* @var int;
*/
const QUEST_STATUS_ENTERED = 1;
const QUEST_STATUS_ENTERED = 0;
/**
* Quest-status: Solved
* Quest-status: submitted
*
* @var int;
*/
const QUEST_STATUS_SOLVED = 0;
const QUEST_STATUS_SUBMITTED = 1;
/**
* Quest-status: Unsolved
*
* @var int;
*/
const QUEST_STATUS_UNSOLVED = -1;
const QUEST_STATUS_UNSOLVED = 2;
/**
* Quest-status: Solved
*
* @var int;
*/
const QUEST_STATUS_SOLVED = 3;
@ -184,14 +190,14 @@
/**
* Mark a Quest as solved for a Character.
* Mark a Quest as submitted for a Character.
*
* @param int $questId ID of Quest to mark as solved
* @param int $characterId ID of Character that solved the Quest
* @param int $questId ID of Quest to mark as unsolved
* @param int $characterId ID of Character that unsolved the Quest
*/
public function setQuestSolved($questId, $characterId)
public function setQuestSubmitted($questId, $characterId)
{
$this->setQuestStatus($questId, $characterId, static::QUEST_STATUS_SOLVED);
$this->setQuestStatus($questId, $characterId, static::QUEST_STATUS_SUBMITTED);
}
@ -207,6 +213,18 @@
}
/**
* Mark a Quest as solved for a Character.
*
* @param int $questId ID of Quest to mark as solved
* @param int $characterId ID of Character that solved the Quest
*/
public function setQuestSolved($questId, $characterId)
{
$this->setQuestStatus($questId, $characterId, static::QUEST_STATUS_SOLVED, false);
}
/**
* Determine if the given Character has entered a Quest.
*
@ -279,48 +297,6 @@
}
/**
* Get Characters that solved a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersSolvedQuest($questId)
{
return $data = $this->db->query(
'SELECT character_id, created, text '.
'FROM questtypes_submit_characters '.
'WHERE quest_id = ? AND EXISTS ('.
'SELECT character_id FROM quests_characters WHERE quest_id = questtypes_submit_characters.quest_id AND status = ?'.
')',
'ii',
$questId,
static::QUEST_STATUS_SOLVED
);
}
/**
* Get Characters that did not solved a Quest.
*
* @param int $questId ID of Quest to get Characters for
* @return array Characters data
*/
public function getCharactersUnsolvedQuest($questId)
{
return $data = $this->db->query(
'SELECT character_id, created, text '.
'FROM questtypes_submit_characters '.
'WHERE quest_id = ? AND NOT EXISTS ('.
'SELECT character_id FROM quests_characters WHERE quest_id = questtypes_submit_characters.quest_id AND status = ?'.
')',
'ii',
$questId,
static::QUEST_STATUS_SOLVED
);
}
/**

View file

@ -102,12 +102,13 @@
* Display a text with input fields and evaluate if user input
* matches with stored regular expressions.
*
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param Exception $exception Character submission exception
*/
public function quest($seminary, $questgroup, $quest, $character)
public function quest($seminary, $questgroup, $quest, $character, $exception)
{
// Get Drag&Drop field
$dndField = $this->Dragndrop->getDragndrop($quest['id']);

View file

@ -61,12 +61,13 @@
*
* Show the task of a Quest.
*
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param Exception $exception Character submission exception
*/
public function quest($seminary, $questgroup, $quest, $character)
public function quest($seminary, $questgroup, $quest, $character, $exception)
{
// Nothing to do
}

View file

@ -112,12 +112,13 @@
* Display questions with a checkbox to let the user choose the
* right ones.
*
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param Exception $exception Character submission exception
*/
public function quest($seminary, $questgroup, $quest, $character)
public function quest($seminary, $questgroup, $quest, $character, $exception)
{
// Get count of questions
$count = $this->Multiplechoice->getQuestionsCountOfQuest($quest['id']);

View file

@ -90,12 +90,13 @@
* Display a text with input fields and evaluate if user input
* matches with stored regular expressions.
*
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param array $seminary Current Seminary data
* @param array $questgroup Current Questgroup data
* @param array $quest Current Quest data
* @param array $character Current Character data
* @param Exception $exception Character submission exception
*/
public function quest($seminary, $questgroup, $quest, $character)
public function quest($seminary, $questgroup, $quest, $character, $exception)
{
// Get Task
$task = $this->Textinput->getTextinputQuest($quest['id']);

View file

@ -5,6 +5,7 @@
<?php endif ?>
<h1><a href="<?=$linker->link(array('seminaries',$seminary['url']))?>"><?=$seminary['title']?></a></h1>
<?=$questgroupshierarchypath?>
<h2><?=$quest['title']?></h2>
<?php if(!is_null($media)) : ?>
<img src="<?=$linker->link(array('media','index',$seminary['url'],$media['url']))?>" />

View file

@ -12,20 +12,29 @@
<?php endif ?>
<section>
<h1><?=_('submitted')?></h1>
<ul>
<?php foreach($submittedSubmissionCharacters as &$character) : ?>
<li>
<a href="<?=$linker->link(array('submission',$seminary['url'],$questgroup['url'],$quest['url'],$character['url']),1)?>"><?=$character['name']?></a>
</li>
<?php endforeach?>
</ul>
<h1><?=_('unsolved')?></h1>
<ul>
<?php foreach($unsolvedsubmissions as &$submission) : ?>
<?php foreach($unsolvedSubmissionCharacters as &$character) : ?>
<li>
<a href="<?=$linker->link(array('submission',$seminary['url'],$questgroup['url'],$quest['url'],$submission['character']['url']),1)?>"><?=$submission['character']['name']?></a>
<a href="<?=$linker->link(array('submission',$seminary['url'],$questgroup['url'],$quest['url'],$character['url']),1)?>"><?=$character['name']?></a>
</li>
<?php endforeach?>
</ul>
<h1><?=_('solved')?></h1>
<ul>
<?php foreach($solvedsubmissions as &$submission) : ?>
<?php foreach($solvedSubmissionCharacters as &$character) : ?>
<li>
<a href="<?=$linker->link(array('submission',$seminary['url'],$questgroup['url'],$quest['url'],$submission['character']['url']),1)?>"><?=$submission['character']['name']?></a>
<a href="<?=$linker->link(array('submission',$seminary['url'],$questgroup['url'],$quest['url'],$character['url']),1)?>"><?=$character['name']?></a>
</li>
<?php endforeach?>
</ul>