1) update Quest stati
2) add SubmissionNotValidException and -handling for Quests
This commit is contained in:
parent
b8b921ae6f
commit
76875f1c69
11 changed files with 268 additions and 108 deletions
|
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
77
app/exceptions/SubmissionNotValidException.inc
Normal file
77
app/exceptions/SubmissionNotValidException.inc
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
|
|
@ -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']))?>" />
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue