merge
This commit is contained in:
commit
046a724272
4209 changed files with 1186656 additions and 0 deletions
960
controllers/AchievementsController.inc
Normal file
960
controllers/AchievementsController.inc
Normal file
|
|
@ -0,0 +1,960 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to list Achievements.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class AchievementsController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('achievements', 'seminaries', 'media', 'characters', 'quests');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin', 'moderator', 'user'),
|
||||
'moveup' => array('admin', 'moderator', 'user'),
|
||||
'movedown' => array('admin', 'moderator', 'user'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'conditions' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin'),
|
||||
'moveup' => array('admin', 'moderator'),
|
||||
'movedown' => array('admin', 'moderator'),
|
||||
'edit' => array('admin', 'moderator'),
|
||||
'conditions' => array('admin', 'moderator'),
|
||||
'delete' => array('admin')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* List Achievements of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of Seminary
|
||||
*/
|
||||
public function index($seminaryUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character
|
||||
$character = SeminaryController::$character;
|
||||
|
||||
// Get seldom Achievements
|
||||
$seldomAchievements = $this->Achievements->getSeldomAchievements($seminary['id'], \nre\configs\AppConfig::$misc['achievements_range'], false);
|
||||
foreach($seldomAchievements as &$achievement) {
|
||||
$achievement['achieved'] = $this->Achievements->hasCharacterAchievedAchievement($achievement['id'], $character['id']);
|
||||
}
|
||||
|
||||
// Get Characters with the most Achievements
|
||||
$successfulCharacters = $this->Characters->getCharactersWithMostAchievements($seminary['id'], \nre\configs\AppConfig::$misc['achievements_range'], false);
|
||||
|
||||
// Get total count of Achievements for Seminary
|
||||
$achievementsCount = $this->Achievements->getAchievementsCountForSeminary($seminary['id'], false);
|
||||
|
||||
// Get achieved Achievements
|
||||
$achievedAchievements = $this->Achievements->getAchievedAchievementsForCharacter($character['id']);
|
||||
|
||||
// Get unachieved Achievements
|
||||
$unachievedAchievements = array_merge(
|
||||
$this->Achievements->getUnachhievedAchievementsForCharacter($seminary['id'], $character['id'], false, false),
|
||||
$this->Achievements->getUnachievedOnlyOnceAchievementsForSeminary($seminary['id'])
|
||||
);
|
||||
usort($unachievedAchievements, function($a, $b) {
|
||||
if($a['pos'] == $b['pos']) {
|
||||
return 0;
|
||||
}
|
||||
return ($a['pos'] > $b['pos']) ? 1 : -1;
|
||||
});
|
||||
foreach($unachievedAchievements as &$achievement)
|
||||
{
|
||||
// Get Character progress
|
||||
if($achievement['progress'])
|
||||
{
|
||||
$conditions = array();
|
||||
switch($achievement['condition'])
|
||||
{
|
||||
// Character conditions
|
||||
case 'character':
|
||||
$conditionsCharacter = $this->Achievements->getAchievementConditionsCharacter($achievement['id']);
|
||||
foreach($conditionsCharacter as &$condition)
|
||||
{
|
||||
$conditions[] = array(
|
||||
'func' => 'getAchievementConditionCharacterProgress',
|
||||
'params' => array(
|
||||
$condition['field'],
|
||||
$condition['value'],
|
||||
$character['id']
|
||||
)
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Quest conditions
|
||||
case 'quest':
|
||||
$conditionsQuest = $this->Achievements->getAchievementConditionsQuest($achievement['id']);
|
||||
foreach($conditionsQuest as &$condition)
|
||||
{
|
||||
$conditions[] = array(
|
||||
'func' => 'getAchievementConditionQuestProgress',
|
||||
'params' => array(
|
||||
$condition['field'],
|
||||
$condition['count'],
|
||||
$condition['value'],
|
||||
$condition['status'],
|
||||
$condition['groupby'],
|
||||
$condition['quest_id'],
|
||||
$character['id']
|
||||
)
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Achievement conditions
|
||||
case 'achievement':
|
||||
$conditionsAchievement = $this->Achievements->getAchievementConditionsAchievement($achievement['id']);
|
||||
foreach($conditionsAchievement as &$condition)
|
||||
{
|
||||
$conditions[] = array(
|
||||
'func' => 'getAchievementConditionAchievementProgress',
|
||||
'params' => array(
|
||||
$condition['field'],
|
||||
$condition['count'],
|
||||
$condition['value'],
|
||||
$condition['groupby'],
|
||||
$condition['meta_achievement_id'],
|
||||
$character['id']
|
||||
)
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$characterProgresses = array();
|
||||
foreach($conditions as &$condition)
|
||||
{
|
||||
// Calculate progress of condition
|
||||
$characterProgresses[] = call_user_func_array(
|
||||
array(
|
||||
$this->Achievements,
|
||||
$condition['func']
|
||||
),
|
||||
$condition['params']
|
||||
);
|
||||
}
|
||||
|
||||
$achievement['characterProgress'] = array_sum($characterProgresses) / count($characterProgresses);
|
||||
}
|
||||
}
|
||||
|
||||
// Get ranking
|
||||
$character['rank'] = $this->Achievements->getCountRank($seminary['id'], count($achievedAchievements));
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Achievements');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('character', $character);
|
||||
$this->set('seldomAchievements', $seldomAchievements);
|
||||
$this->set('successfulCharacters', $successfulCharacters);
|
||||
$this->set('achievementsCount', $achievementsCount);
|
||||
$this->set('achievedAchievements', $achievedAchievements);
|
||||
$this->set('unachievedAchievements', $unachievedAchievements);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: manage.
|
||||
*
|
||||
* Manage Achievements of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of Seminary
|
||||
*/
|
||||
public function manage($seminaryUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Achievements
|
||||
$achievements = $this->Achievements->getAchievementsForSeminary($seminary['id']);
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Manage Achievements');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('achievements', $achievements);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create a new Achievement.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
*/
|
||||
public function create($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Achievements conditions
|
||||
$conditions = $this->Achievements->getAchievementsConditions();
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
|
||||
|
||||
// Values
|
||||
$title = '';
|
||||
$description = '';
|
||||
$progress = 0;
|
||||
$hidden = 0;
|
||||
$onlyOnce = 0;
|
||||
$allConditions = 1;
|
||||
$deadline = '';
|
||||
$condition = $conditions[0]['condition'];
|
||||
$fields = array('title', 'deadline');
|
||||
$validation = array();
|
||||
|
||||
// Create Achievement
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Achievements->achievementTitleExists($seminary['id'], $title)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
$description = $this->request->getPostParam('description');
|
||||
$progress = !is_null($this->request->getPostParam('progress'));
|
||||
$hidden = !is_null($this->request->getPostParam('hidden'));
|
||||
$onlyOnce = !is_null($this->request->getPostParam('only_once'));
|
||||
$allConditions = !is_null($this->request->getPostParam('all_conditions'));
|
||||
$deadline = $this->request->getPostParam('deadline');
|
||||
$condition = $this->request->getPostParam('condition');
|
||||
|
||||
// Validate condition
|
||||
$conditionIndex = null;
|
||||
foreach($conditions as $index => &$c) {
|
||||
if($condition == $c['condition']) {
|
||||
$conditionIndex = $index;
|
||||
}
|
||||
}
|
||||
if(is_null($conditionIndex)) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($condition);
|
||||
}
|
||||
|
||||
// Validate images
|
||||
$images = array(
|
||||
'unachieved_image' => null,
|
||||
'achieved_image' => null
|
||||
);
|
||||
foreach($images as $key => $image)
|
||||
{
|
||||
if(!empty($_FILES) && array_key_exists($key, $_FILES) && $_FILES[$key]['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$images[$key] = $_FILES[$key];
|
||||
|
||||
// Check error
|
||||
if($images[$key]['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'image', 'error', $image[$key]['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$images[$key]['mimetype'] = \hhu\z\Utils::getMimetype($images[$key]['tmp_name'], $images[$key]['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $images[$key]['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'image', 'mimetype', $images[$key]['mimetype']);
|
||||
}
|
||||
elseif($images[$key]['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'image', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create Achievement
|
||||
if($validation === true)
|
||||
{
|
||||
$achievementId = $this->Achievements->createAchievement(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$conditions[$conditionIndex]['id'],
|
||||
$title,
|
||||
$description,
|
||||
$progress,
|
||||
$hidden,
|
||||
$onlyOnce,
|
||||
$allConditions,
|
||||
(!empty($deadline)) ? $deadline : NULL
|
||||
);
|
||||
$achievement = $this->Achievements->getAchievementById($achievementId);
|
||||
|
||||
// Upload images
|
||||
foreach($images as $key => &$image)
|
||||
{
|
||||
if(!is_null($image))
|
||||
{
|
||||
$image['media_id'] = $this->Media->createAchievementMedia(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('achievement-%d', $achievement['id']).(substr($key, 0, 2) == 'un' ? '-locked' : NULL),
|
||||
'',
|
||||
$image['mimetype'],
|
||||
$image['tmp_name']
|
||||
);
|
||||
}
|
||||
}
|
||||
if(!is_null($images['unachieved_image']) && $images['unachieved_image']['media_id'] !== false) {
|
||||
$this->Achievements->setUnachievedMediaForAchievement($achievement['id'], $images['unachieved_image']['media_id']);
|
||||
}
|
||||
if(!is_null($images['achieved_image']) && $images['achieved_image']['media_id'] !== false) {
|
||||
$this->Achievements->setAchievedMediaForAchievement($achievement['id'], $images['achieved_image']['media_id']);
|
||||
}
|
||||
|
||||
// Redirect to condition editing
|
||||
$this->redirect($this->linker->link(array('conditions', $seminary['url'], $achievement['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Create Achievement');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('title', $title);
|
||||
$this->set('description', $description);
|
||||
$this->set('progress', $progress);
|
||||
$this->set('hidden', $hidden);
|
||||
$this->set('onlyOnce', $onlyOnce);
|
||||
$this->set('allConditions', $allConditions);
|
||||
$this->set('deadline', $deadline);
|
||||
$this->set('condition', $condition);
|
||||
$this->set('conditions', $conditions);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: moveup.
|
||||
*
|
||||
* Move an Achievement up (decrement position).
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $achievementUrl URL-title of Achievement
|
||||
*/
|
||||
public function moveup($seminaryUrl, $achievementUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Achievement
|
||||
$achievement = $this->Achievements->getAchievementByUrl($seminary['id'], $achievementUrl);
|
||||
|
||||
// Set position
|
||||
$this->Achievements->moveAchievement($achievement, true);
|
||||
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array('manage', $seminary['url']), 1, true, null, false, $achievement['url']));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: movedown.
|
||||
*
|
||||
* Move an Achievement down (increment position).
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $achievementUrl URL-title of Achievement
|
||||
*/
|
||||
public function movedown($seminaryUrl, $achievementUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Achievement
|
||||
$achievement = $this->Achievements->getAchievementByUrl($seminary['id'], $achievementUrl);
|
||||
|
||||
// Set position
|
||||
$this->Achievements->moveAchievement($achievement, false);
|
||||
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array('manage', $seminary['url']), 1, true, null, false, $achievement['url']));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit an Achievement.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $achievementUrl URL-title of Achievement to edit
|
||||
*/
|
||||
public function edit($seminaryUrl, $achievementUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Achievement
|
||||
$achievement = $this->Achievements->getAchievementByUrl($seminary['id'], $achievementUrl);
|
||||
|
||||
// Get Achievements conditions
|
||||
$conditions = $this->Achievements->getAchievementsConditions();
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
|
||||
|
||||
// Values
|
||||
$title = $achievement['title'];
|
||||
$description = $achievement['description'];
|
||||
$progress = $achievement['progress'];
|
||||
$hidden = $achievement['hidden'];
|
||||
$onlyOnce = $achievement['only_once'];
|
||||
$allConditions = $achievement['all_conditions'];
|
||||
$deadline = $achievement['deadline'];
|
||||
$condition = $achievement['condition'];
|
||||
$fields = array('title', 'deadline');
|
||||
$validation = array();
|
||||
|
||||
// Edit Achievement
|
||||
if($this->request->getRequestMethod() == 'POST' && (!is_null($this->request->getPostParam('edit')) || !is_null($this->request->getPostParam('edit-conditions'))))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Achievements->achievementTitleExists($seminary['id'], $title, $achievement['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
$description = $this->request->getPostParam('description');
|
||||
$progress = !is_null($this->request->getPostParam('progress'));
|
||||
$hidden = !is_null($this->request->getPostParam('hidden'));
|
||||
$onlyOnce = !is_null($this->request->getPostParam('only_once'));
|
||||
$allConditions = !is_null($this->request->getPostParam('all_conditions'));
|
||||
$deadline = $this->request->getPostParam('deadline');
|
||||
$condition = $this->request->getPostParam('condition');
|
||||
|
||||
// Validate condition
|
||||
$conditionIndex = null;
|
||||
foreach($conditions as $index => &$c) {
|
||||
if($condition == $c['condition']) {
|
||||
$conditionIndex = $index;
|
||||
}
|
||||
}
|
||||
if(is_null($conditionIndex)) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($condition);
|
||||
}
|
||||
|
||||
// Validate images
|
||||
$images = array(
|
||||
'unachieved_image' => null,
|
||||
'achieved_image' => null
|
||||
);
|
||||
foreach($images as $key => $image)
|
||||
{
|
||||
if(!empty($_FILES) && array_key_exists($key, $_FILES) && $_FILES[$key]['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$images[$key] = $_FILES[$key];
|
||||
|
||||
// Check error
|
||||
if($images[$key]['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'image', 'error', $image[$key]['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$images[$key]['mimetype'] = \hhu\z\Utils::getMimetype($images[$key]['tmp_name'], $images[$key]['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $images[$key]['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'image', 'mimetype', $images[$key]['mimetype']);
|
||||
}
|
||||
elseif($images[$key]['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'image', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Edit Achievement
|
||||
if($validation === true)
|
||||
{
|
||||
$this->Achievements->editAchievement(
|
||||
$achievement['id'],
|
||||
$conditions[$conditionIndex]['id'],
|
||||
$title,
|
||||
$description,
|
||||
$progress,
|
||||
$hidden,
|
||||
$onlyOnce,
|
||||
$allConditions,
|
||||
(!empty($deadline)) ? $deadline : NULL
|
||||
);
|
||||
|
||||
// Remove old conditions
|
||||
if($conditions[$conditionIndex]['condition'] != $achievement['condition'])
|
||||
{
|
||||
var_dump("remove");
|
||||
switch($achievement['condition'])
|
||||
{
|
||||
// Date conditions
|
||||
case 'date':
|
||||
foreach($this->Achievements->getAchievementConditionsDate($achievement['id']) as $c) {
|
||||
$this->Achievements->deleteAchievementConditionDate($c['id']);
|
||||
}
|
||||
break;
|
||||
// Character conditions
|
||||
case 'character':
|
||||
foreach($this->Achievements->getAchievementConditionsCharacter($achievement['id']) as $c) {
|
||||
$this->Achievements->deleteAchievementConditionCharacter($c['id']);
|
||||
}
|
||||
break;
|
||||
// Quest conditions
|
||||
case 'quest':
|
||||
foreach($this->Achievements->getAchievementConditionsQuest($achievement['id']) as $c) {
|
||||
$this->Achievements->deleteAchievementConditionQuest($c['id']);
|
||||
}
|
||||
break;
|
||||
// Achievement conditions
|
||||
case 'achievement':
|
||||
foreach($this->Achievements->getAchievementConditionsAchievement($achievement['id']) as $c) {
|
||||
$this->Achievements->deleteAchievementConditionAchievement($c['id']);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Upload images
|
||||
foreach($images as $key => &$image)
|
||||
{
|
||||
if(!is_null($image))
|
||||
{
|
||||
$image['media_id'] = $this->Media->createAchievementMedia(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('achievement-%d', $achievement['id']).(substr($key, 0, 2) == 'un' ? '-locked' : NULL),
|
||||
'',
|
||||
$image['mimetype'],
|
||||
$image['tmp_name']
|
||||
);
|
||||
}
|
||||
}
|
||||
if(!is_null($images['unachieved_image']) && $images['unachieved_image']['media_id'] !== false) {
|
||||
$this->Achievements->setUnachievedMediaForAchievement($achievement['id'], $images['unachieved_image']['media_id']);
|
||||
}
|
||||
if(!is_null($images['achieved_image']) && $images['achieved_image']['media_id'] !== false) {
|
||||
$this->Achievements->setAchievedMediaForAchievement($achievement['id'], $images['achieved_image']['media_id']);
|
||||
}
|
||||
|
||||
// Redirect
|
||||
if(!is_null($this->request->getPostParam('edit-conditions'))) {
|
||||
// To condition editing
|
||||
$this->redirect($this->linker->link(array('conditions', $seminary['url'], $achievement['url']), 1));
|
||||
}
|
||||
else {
|
||||
// To overview
|
||||
$this->redirect($this->linker->link(array('manage', $seminary['url']), 1, true, null, false, $achievement['url']));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Edit Achievement');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('achievement', $achievement);
|
||||
$this->set('title', $title);
|
||||
$this->set('description', $description);
|
||||
$this->set('progress', $progress);
|
||||
$this->set('hidden', $hidden);
|
||||
$this->set('onlyOnce', $onlyOnce);
|
||||
$this->set('allConditions', $allConditions);
|
||||
$this->set('deadline', $deadline);
|
||||
$this->set('condition', $condition);
|
||||
$this->set('conditions', $conditions);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: conditions.
|
||||
*
|
||||
* Edit conditions of an Achievement.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $achievementUrl URL-title of Achievement to edit
|
||||
*/
|
||||
public function conditions($seminaryUrl, $achievementUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Achievement
|
||||
$achievement = $this->Achievements->getAchievementByUrl($seminary['id'], $achievementUrl);
|
||||
|
||||
// Get conditions
|
||||
$conditions = array();
|
||||
switch($achievement['condition'])
|
||||
{
|
||||
// Date conditions
|
||||
case 'date':
|
||||
$conditions = $this->Achievements->getAchievementConditionsDate($achievement['id']);
|
||||
break;
|
||||
// Character conditions
|
||||
case 'character':
|
||||
$conditions = $this->Achievements->getAchievementConditionsCharacter($achievement['id']);
|
||||
break;
|
||||
// Quest conditions
|
||||
case 'quest':
|
||||
$conditions = $this->Achievements->getAchievementConditionsQuest($achievement['id']);
|
||||
break;
|
||||
// Achievement conditions
|
||||
case 'achievement':
|
||||
$conditions = $this->Achievements->getAchievementConditionsAchievement($achievement['id']);
|
||||
break;
|
||||
}
|
||||
|
||||
// Values
|
||||
$characterFields = array(
|
||||
'id', 'created', 'user_id', 'name', 'url', 'xps', 'quest_xps', 'avatar_id',
|
||||
'charactertype_id', 'charactertype_name', 'charactertype_url',
|
||||
'xplevel_id', 'xplevel'
|
||||
);
|
||||
$questFields = array(
|
||||
'id', 'quest_id', 'character_id', 'created', 'status'
|
||||
);
|
||||
$achievementFields = array(
|
||||
'achievement_id', 'character_id', 'created'
|
||||
);
|
||||
$quests = $this->Quests->getQuestsForSeminary($seminary['id']);
|
||||
$achievements = $this->Achievements->getAchievementsForSeminary($seminary['id']);
|
||||
$deletes = array();
|
||||
|
||||
// Save conditions
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get entered conditions
|
||||
$selectedConditions = $this->request->getPostParam('conditions');
|
||||
$deletes = $this->request->getPostParam('deletes');
|
||||
if(!is_array($deletes)) {
|
||||
$deletes = array();
|
||||
}
|
||||
|
||||
// Edit or delete conditions
|
||||
foreach($conditions as &$condition)
|
||||
{
|
||||
$selectedCondition = $selectedConditions[$condition['id']];
|
||||
switch($achievement['condition'])
|
||||
{
|
||||
// Date conditions
|
||||
case 'date':
|
||||
if(array_key_exists($condition['id'], $deletes)) {
|
||||
$this->Achievements->deleteAchievementConditionDate($condition['id']);
|
||||
}
|
||||
else {
|
||||
$this->Achievements->editAchievementConditionDate(
|
||||
$condition['id'],
|
||||
$selectedCondition['select']
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Character conditions
|
||||
case 'character':
|
||||
if(array_key_exists($condition['id'], $deletes)) {
|
||||
$this->Achievements->deleteAchievementConditionCharacter($condition['id']);
|
||||
}
|
||||
else {
|
||||
$this->Achievements->editAchievementConditionCharacter(
|
||||
$condition['id'],
|
||||
$selectedCondition['field'],
|
||||
$selectedCondition['value']
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Quest conditions
|
||||
case 'quest':
|
||||
if(array_key_exists($condition['id'], $deletes)) {
|
||||
$this->Achievements->deleteAchievementConditionQuest($condition['id']);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get selected Quest
|
||||
$questIndex = null;
|
||||
if(!empty($selectedCondition['quest'])) {
|
||||
foreach($quests as $index => &$quest) {
|
||||
if($quest['url'] == $selectedCondition['quest']) {
|
||||
$questIndex = $index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Edit condition
|
||||
$this->Achievements->editAchievementConditionQuest(
|
||||
$condition['id'],
|
||||
$selectedCondition['field'],
|
||||
array_key_exists('count', $selectedCondition),
|
||||
$selectedCondition['value'],
|
||||
(!is_null($questIndex)) ? $quests[$questIndex]['id'] : null,
|
||||
($selectedCondition['status'] != '') ? $selectedCondition['status'] : null,
|
||||
(!empty($selectedCondition['groupby'])) ? $selectedCondition['groupby'] : null
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Achievement conditions
|
||||
case 'achievement':
|
||||
if(array_key_exists($condition['id'], $deletes)) {
|
||||
$this->Achievements->deleteAchievementConditionAchievement($condition['id']);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get selected Achievement
|
||||
$achievmentIndex = null;
|
||||
if(!empty($selectedCondition['achievement'])) {
|
||||
foreach($achievements as $index => &$a) {
|
||||
if($a['url'] == $selectedCondition['achievement']) {
|
||||
$achievementIndex = $index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Edit condition
|
||||
$this->Achievements->editAchievementConditionAchievement(
|
||||
$condition['id'],
|
||||
$selectedCondition['field'],
|
||||
array_key_exists('count', $selectedCondition),
|
||||
$selectedCondition['value'],
|
||||
(!is_null($achievementIndex)) ? $achievements[$achievementIndex]['id'] : null,
|
||||
(!empty($selectedCondition['groupby'])) ? $selectedCondition['groupby'] : null
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add new condition
|
||||
if(array_key_exists('new', $selectedConditions))
|
||||
{
|
||||
$condition = $selectedConditions['new'];
|
||||
switch($achievement['condition'])
|
||||
{
|
||||
// Date conditions
|
||||
case 'date':
|
||||
if(!empty($condition['select'])) {
|
||||
$this->Achievements->addAchievementConditionDate(
|
||||
$this->Auth->getUserId(),
|
||||
$achievement['id'],
|
||||
$condition['select']
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Character conditions
|
||||
case 'character':
|
||||
if(!empty($condition['value'])) {
|
||||
$this->Achievements->addAchievementConditionCharacter(
|
||||
$this->Auth->getUserId(),
|
||||
$achievement['id'],
|
||||
$condition['field'],
|
||||
$condition['value']
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Quest conditions
|
||||
case 'quest':
|
||||
if(!empty($condition['value']))
|
||||
{
|
||||
// Get selected Quest
|
||||
$questIndex = null;
|
||||
if(!empty($condition['quest'])) {
|
||||
foreach($quests as $index => &$quest) {
|
||||
if($quest['url'] == $condition['quest']) {
|
||||
$questIndex = $index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Edit condition
|
||||
$this->Achievements->addAchievementConditionQuest(
|
||||
$this->Auth->getUserId(),
|
||||
$achievement['id'],
|
||||
$condition['field'],
|
||||
array_key_exists('count', $condition),
|
||||
$condition['value'],
|
||||
(!is_null($questIndex)) ? $quests[$questIndex]['id'] : null,
|
||||
($condition['status'] != '') ? $condition['status'] : null,
|
||||
(!empty($condition['groupby'])) ? $condition['groupby'] : null
|
||||
);
|
||||
}
|
||||
break;
|
||||
// Achievement conditions
|
||||
case 'achievement':
|
||||
if(!empty($condition['value']))
|
||||
{
|
||||
// Get selected Achievement
|
||||
$achievmentIndex = null;
|
||||
if(!empty($selectedCondition['achievement'])) {
|
||||
foreach($achievements as $index => &$a) {
|
||||
if($a['url'] == $selectedCondition['achievement']) {
|
||||
$achievementIndex = $index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Edit condition
|
||||
$this->Achievements->addAchievementConditionAchievement(
|
||||
$this->Auth->getUserId(),
|
||||
$achievement['id'],
|
||||
$condition['field'],
|
||||
array_key_exists('count', $condition),
|
||||
$condition['value'],
|
||||
(!is_null($achievementIndex)) ? $achievements[$achievementIndex]['id'] : null,
|
||||
(!empty($condition['groupby'])) ? $condition['groupby'] : null
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('manage', $seminary['url']), 1, true, null, false, $achievement['url']));
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Edit Achievement conditions');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('achievement', $achievement);
|
||||
$this->set('conditions', $conditions);
|
||||
$this->set('characterFields', $characterFields);
|
||||
$this->set('questFields', $questFields);
|
||||
$this->set('quests', $quests);
|
||||
$this->set('achievementFields', $achievementFields);
|
||||
$this->set('achievements', $achievements);
|
||||
$this->set('deletes', $deletes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete an Achievement.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $achievementUrl URL-title of Achievement
|
||||
*/
|
||||
public function delete($seminaryUrl, $achievementUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Achievement
|
||||
$achievement = $this->Achievements->getAchievementByUrl($seminary['id'], $achievementUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete seminary
|
||||
$this->Achievements->deleteAchievement($achievement);
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('manage', $seminary['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Delete seminary');
|
||||
|
||||
// Show confirmation
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('achievement', $achievement);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
52
controllers/AjaxController.inc
Normal file
52
controllers/AjaxController.inc
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the AjaxAgent to return a JSON-string used by AJAX.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class AjaxController extends \hhu\z\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
// Set content-type
|
||||
$this->response->addHeader("Content-type: application/json; charset=utf-8");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Create the JSON-string.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
37
controllers/BinaryController.inc
Normal file
37
controllers/BinaryController.inc
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the BinaryAgent to show binary data.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class BinaryController extends \hhu\z\controllers\IntermediateController
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Create binary data.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
759
controllers/CharactergroupsController.inc
Normal file
759
controllers/CharactergroupsController.inc
Normal file
|
|
@ -0,0 +1,759 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the CharactergroupsAgent to display Character groups.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class CharactergroupsController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'charactergroups', 'charactergroupsquests', 'characters', 'avatars', 'media');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'groupsgroup' => array('admin', 'moderator', 'user'),
|
||||
'creategroupsgroup' => array('admin', 'moderator', 'user'),
|
||||
'editgroupsgroup' => array('admin', 'moderator', 'user'),
|
||||
'deletegroupsgroup' => array('admin', 'moderator', 'user'),
|
||||
'group' => array('admin', 'moderator', 'user'),
|
||||
'managegroup' => array('admin', 'moderator', 'user'),
|
||||
'creategroup' => array('admin', 'moderator', 'user'),
|
||||
'editgroup' => array('admin', 'moderator', 'user'),
|
||||
'deletegroup' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'groupsgroup' => array('admin', 'moderator', 'user'),
|
||||
'creategroupsgroup' => array('admin', 'moderator'),
|
||||
'editgroupsgroup' => array('admin', 'moderator'),
|
||||
'deletegroupsgroup' => array('admin', 'moderator'),
|
||||
'group' => array('admin', 'moderator', 'user'),
|
||||
'managegroup' => array('admin', 'moderator'),
|
||||
'creategroup' => array('admin', 'moderator'),
|
||||
'editgroup' => array('admin', 'moderator', 'user'),
|
||||
'deletegroup' => array('admin', 'moderator')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Show Character groups-groups for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function index($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-groups
|
||||
$groupsgroups = $this->Charactergroups->getGroupsroupsForSeminary($seminary['id']);
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Character Groups');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroups', $groupsgroups);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: groupsgroups.
|
||||
*
|
||||
* Show Character groups for a Character groups-group of a
|
||||
* Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
*/
|
||||
public function groupsgroup($seminaryUrl, $groupsgroupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character groups
|
||||
$groups = $this->Charactergroups->getGroupsForGroupsgroup($groupsgroup['id'], 'xps');
|
||||
|
||||
// Get Character groups-group Quests
|
||||
$quests = $this->Charactergroupsquests->getQuestsForCharactergroupsgroup($groupsgroup['id']);
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitleLocalized('Character Groups');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('groups', $groups);
|
||||
$this->set('quests', $quests);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: creategroupsgroups.
|
||||
*
|
||||
* Create a new Character groups-group for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function creategroupsgroup($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Values
|
||||
$charactergroupsgroupname = '';
|
||||
$preferred = false;
|
||||
$fields = array('charactergroupsgroupname');
|
||||
$validation = array();
|
||||
|
||||
// Create a new Character groups-group
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$charactergroupsgroupname = $this->request->getPostParam('charactergroupsgroupname');
|
||||
if($this->Charactergroups->characterGroupsgroupNameExists($charactergroupsgroupname)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactergroupsgroupname', 'exist', true);
|
||||
}
|
||||
$preferred = !is_null($this->request->getPostParam('preferred'));
|
||||
|
||||
// Create groups-group
|
||||
if($validation === true)
|
||||
{
|
||||
$groupsgroupId = $this->Charactergroups->createGroupsgroup(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$charactergroupsgroupname,
|
||||
$preferred
|
||||
);
|
||||
|
||||
// Redirect to groups-group page
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupById($groupsgroupId);
|
||||
$this->redirect($this->linker->link(array('groupsgroup', $seminary['url'], $groupsgroup['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('New Character groups-group');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('charactergroupsgroupname', $charactergroupsgroupname);
|
||||
$this->set('preferred', $preferred);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: editgroupsgroups.
|
||||
*
|
||||
* Edit a Character groups-group of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
*/
|
||||
public function editgroupsgroup($seminaryUrl, $groupsgroupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Values
|
||||
$charactergroupsgroupname = $groupsgroup['name'];
|
||||
$preferred = $groupsgroup['preferred'];
|
||||
$fields = array('charactergroupsgroupname');
|
||||
$validation = array();
|
||||
|
||||
// Edit Character groups-group
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$charactergroupsgroupname = $this->request->getPostParam('charactergroupsgroupname');
|
||||
if($this->Charactergroups->characterGroupsgroupNameExists($charactergroupsgroupname, $groupsgroup['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactergroupsgroupname', 'exist', true);
|
||||
}
|
||||
$preferred = !is_null($this->request->getPostParam('preferred'));
|
||||
|
||||
// Edit groups-group
|
||||
if($validation === true)
|
||||
{
|
||||
$this->Charactergroups->editGroupsgroup(
|
||||
$groupsgroup['id'],
|
||||
$charactergroupsgroupname,
|
||||
$preferred
|
||||
);
|
||||
|
||||
// Redirect to user page
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupById($groupsgroup['id']);
|
||||
$this->redirect($this->linker->link(array('groupsgroup', $seminary['url'], $groupsgroup['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Edit Character groups-group');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('charactergroupsgroupname', $charactergroupsgroupname);
|
||||
$this->set('preferred', $preferred);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: deletegroupsgroups.
|
||||
*
|
||||
* Delete a Character groups-group of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
*/
|
||||
public function deletegroupsgroup($seminaryUrl, $groupsgroupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete seminary
|
||||
$this->Charactergroups->deleteGroupsgroup($groupsgroup['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('index', $seminary['url']), 1));
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('groupsgroup', $seminary['url'], $groupsgroup['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Delete Character groups-group');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: group.
|
||||
*
|
||||
* Show a Character group for a Character groups-group of a
|
||||
* Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $groupUrl URL-Title of a Character group
|
||||
*/
|
||||
public function group($seminaryUrl, $groupsgroupUrl, $groupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character group
|
||||
$group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl);
|
||||
$group['characters'] = $this->Characters->getCharactersForGroup($group['id']);
|
||||
$group['rank'] = $this->Charactergroups->getXPRank($groupsgroup['id'], $group['xps']);
|
||||
|
||||
// Get Character avatars
|
||||
foreach($group['characters'] as &$character)
|
||||
{
|
||||
$avatar = $this->Avatars->getAvatarById($character['avatar_id']);
|
||||
if(!is_null($avatar['small_avatarpicture_id'])) {
|
||||
$character['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']);
|
||||
}
|
||||
}
|
||||
|
||||
// Get Character groups Quests
|
||||
$quests = $this->Charactergroupsquests->getQuestsForGroup($group['id']);
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitle($group['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('group', $group);
|
||||
$this->set('quests', $quests);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: managegroup.
|
||||
*
|
||||
* Manage a Character group for a Character groups-group of a
|
||||
* Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $groupUrl URL-Title of a Character group
|
||||
*/
|
||||
public function managegroup($seminaryUrl, $groupsgroupUrl, $groupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character group
|
||||
$group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl);
|
||||
|
||||
// Manage
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('actions')) && count($this->request->getPostParam('actions')) > 0) // && !is_null($this->request->getPostParam('characters')) && count($this->request->getPostParam('characters')) > 0)
|
||||
{
|
||||
$actions = $this->request->getPostParam('actions');
|
||||
$action = array_keys($actions)[0];
|
||||
$selectedCharacters = $this->request->getPostParam('characters');
|
||||
|
||||
switch($action)
|
||||
{
|
||||
// Add Characters to group
|
||||
case 'addcharacters':
|
||||
foreach($selectedCharacters as &$characterId) {
|
||||
$this->Charactergroups->addCharacterToCharactergroup($group['id'], $characterId);
|
||||
}
|
||||
break;
|
||||
// Remove Characters from group
|
||||
case 'removecharacters':
|
||||
foreach($selectedCharacters as &$characterId) {
|
||||
$this->Charactergroups->removeCharacterFromCharactergroup($group['id'], $characterId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Get additional data for group
|
||||
$group['characters'] = $this->Characters->getCharactersForGroup($group['id']);
|
||||
$group['rank'] = $this->Charactergroups->getXPRank($groupsgroup['id'], $group['xps']);
|
||||
|
||||
// Get Character avatars
|
||||
foreach($group['characters'] as &$character)
|
||||
{
|
||||
$avatar = $this->Avatars->getAvatarById($character['avatar_id']);
|
||||
if(!is_null($avatar['small_avatarpicture_id'])) {
|
||||
$character['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']);
|
||||
}
|
||||
}
|
||||
|
||||
// Get Character groups Quests
|
||||
$quests = $this->Charactergroupsquests->getQuestsForGroup($group['id']);
|
||||
|
||||
// Get all Characters of Seminary
|
||||
$groupCharacterIds = array_map(function($c) { return $c['id']; }, $group['characters']);
|
||||
$seminaryCharacters = $this->Characters->getCharactersForSeminary($seminary['id'], true);
|
||||
$characters = array();
|
||||
foreach($seminaryCharacters as &$character) {
|
||||
if(!in_array($character['id'], $groupCharacterIds)) {
|
||||
$characters[] = $character;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitle($group['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('group', $group);
|
||||
$this->set('quests', $quests);
|
||||
$this->set('characters', $characters);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: creategroup.
|
||||
*
|
||||
* Create a Character group for a Character groups-group of a
|
||||
* Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
*/
|
||||
public function creategroup($seminaryUrl, $groupsgroupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['icons'];
|
||||
|
||||
// Values
|
||||
$charactergroupname = '';
|
||||
$motto = '';
|
||||
$fields = array('charactergroupname', 'motto');
|
||||
$validation = array();
|
||||
|
||||
// Create a new Character groups-group
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$charactergroupname = $this->request->getPostParam('charactergroupname');
|
||||
if($this->Charactergroups->characterGroupNameExists($charactergroupname)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactergroupname', 'exist', true);
|
||||
}
|
||||
$motto = $this->request->getPostParam('motto');
|
||||
|
||||
// Validate icon
|
||||
$icon = null;
|
||||
if(!empty($_FILES) && array_key_exists('icon', $_FILES) && $_FILES['icon']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$icon = $_FILES['icon'];
|
||||
|
||||
// Check error
|
||||
if($icon['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'error', $icon['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$icon['mimetype'] = \hhu\z\Utils::getMimetype($icon['tmp_name'], $icon['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $icon['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'mimetype', $icon['mimetype']);
|
||||
}
|
||||
elseif($icon['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Create group
|
||||
if($validation === true)
|
||||
{
|
||||
$groupId = $this->Charactergroups->createGroup(
|
||||
$this->Auth->getUserId(),
|
||||
$groupsgroup['id'],
|
||||
$charactergroupname,
|
||||
$motto
|
||||
);
|
||||
$group = $this->Charactergroups->getGroupById($groupId);
|
||||
|
||||
// Upload icon
|
||||
if(!is_null($icon))
|
||||
{
|
||||
$mediaId = $this->Media->createCharactergroupMedia(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('charactergroup-%s', $group['url']),
|
||||
'',
|
||||
$icon['mimetype'],
|
||||
$icon['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Charactergroups->setMediaForGroup($group['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to group page
|
||||
$this->redirect($this->linker->link(array('group', $seminary['url'], $groupsgroup['url'], $group['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('New %s Character group', $groupsgroup['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('charactergroupname', $charactergroupname);
|
||||
$this->set('motto', $motto);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: editgroup.
|
||||
*
|
||||
* Edit a Character group for a Character groups-group of a
|
||||
* Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $groupUrl URL-Title of a Character group
|
||||
*/
|
||||
public function editgroup($seminaryUrl, $groupsgroupUrl, $groupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character group
|
||||
$group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl);
|
||||
$group['characters'] = $this->Characters->getCharactersForGroup($group['id']);
|
||||
|
||||
// Check permission
|
||||
if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) == 0 && !in_array(\hhu\z\controllers\SeminaryController::$character['id'], array_map(function($c) { return $c['id']; }, $group['characters']))) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['icons'];
|
||||
|
||||
// Values
|
||||
$charactergroupname = $group['name'];
|
||||
$motto = $group['motto'];
|
||||
$fields = array('charactergroupname', 'motto');
|
||||
$validation = array();
|
||||
|
||||
// Edit Character group
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$charactergroupname = (count(array_intersect(array('admin','moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0) ? $this->request->getPostParam('charactergroupname') : $group['name'];
|
||||
if($this->Charactergroups->characterGroupNameExists($charactergroupname, $group['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactergroupname', 'exist', true);
|
||||
}
|
||||
$motto = $this->request->getPostParam('motto');
|
||||
|
||||
// Validate icon
|
||||
$icon = null;
|
||||
if(!empty($_FILES) && array_key_exists('icon', $_FILES) && $_FILES['icon']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$icon = $_FILES['icon'];
|
||||
|
||||
// Check error
|
||||
if($icon['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'error', $icon['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$icon['mimetype'] = \hhu\z\Utils::getMimetype($icon['tmp_name'], $icon['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $icon['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'mimetype', $icon['mimetype']);
|
||||
}
|
||||
elseif($icon['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Edit group
|
||||
if($validation === true)
|
||||
{
|
||||
$this->Charactergroups->editGroup(
|
||||
$group['id'],
|
||||
$charactergroupname,
|
||||
$motto
|
||||
);
|
||||
$group = $this->Charactergroups->getGroupById($group['id']);
|
||||
|
||||
// Upload icon
|
||||
if(!is_null($icon))
|
||||
{
|
||||
$mediaId = $this->Media->createCharactergroupMedia(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('charactergroup-%s', $group['url']),
|
||||
'',
|
||||
$icon['mimetype'],
|
||||
$icon['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Charactergroups->setMediaForGroup($group['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to user page
|
||||
$this->redirect($this->linker->link(array('group', $seminary['url'], $groupsgroup['url'], $group['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Edit %s Character group', $groupsgroup['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('group', $group);
|
||||
$this->set('charactergroupname', $charactergroupname);
|
||||
$this->set('motto', $motto);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: deletegroup.
|
||||
*
|
||||
* Delete a Character group for a Character groups-group of a
|
||||
* Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $groupUrl URL-Title of a Character group
|
||||
*/
|
||||
public function deletegroup($seminaryUrl, $groupsgroupUrl, $groupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character group
|
||||
$group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete seminary
|
||||
$this->Charactergroups->deleteGroup($group['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('groupsgroup', $seminary['url'], $groupsgroup['url']), 1));
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('group', $seminary['url'], $groupsgroup['url'], $group['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Delete %s Character group', $groupsgroup['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('group', $group);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
625
controllers/CharactergroupsquestsController.inc
Normal file
625
controllers/CharactergroupsquestsController.inc
Normal file
|
|
@ -0,0 +1,625 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the CharactergroupsquestsAgent to display Character
|
||||
* groups Quests.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class CharactergroupsquestsController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'charactergroups', 'charactergroupsquests', 'media', 'questgroups', 'uploads');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'quest' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'quest' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: quest.
|
||||
*
|
||||
* Show a Character groups Quest for a Character groups-group
|
||||
* of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $questUrl URL-Title of a Character groups Quest
|
||||
*/
|
||||
public function quest($seminaryUrl, $groupsgroupUrl, $questUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character groups-group Quests
|
||||
$quest = $this->Charactergroupsquests->getQuestByUrl($groupsgroup['id'], $questUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($quest['questgroups_id']);
|
||||
$questgroup['entered'] = $this->Questgroups->hasCharacterEnteredQuestgroup($questgroup['id'], self::$character['id']);
|
||||
|
||||
// Get Character groups-groups
|
||||
$groups = $this->Charactergroups->getGroupsForQuest($quest['id']);
|
||||
|
||||
// Get uploads
|
||||
$uploads = $this->Charactergroupsquests->getMediaForQuest($quest['id']);
|
||||
foreach($uploads as &$upload) {
|
||||
$upload['upload'] = $this->Uploads->getSeminaryuploadById($upload['seminaryupload_id']);
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitle($quest['title']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('quest', $quest);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('groups', $groups);
|
||||
$this->set('uploads', $uploads);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: manage.
|
||||
*
|
||||
* Manage a Character groups Quest for a Character groups-group
|
||||
* of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $questUrl URL-Title of a Character groups Quest
|
||||
*/
|
||||
public function manage($seminaryUrl, $groupsgroupUrl, $questUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character groups-group Quests
|
||||
$quest = $this->Charactergroupsquests->getQuestByUrl($groupsgroup['id'], $questUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($quest['questgroups_id']);
|
||||
$questgroup['entered'] = $this->Questgroups->hasCharacterEnteredQuestgroup($questgroup['id'], self::$character['id']);
|
||||
|
||||
// Get Character groups
|
||||
$groups = $this->Charactergroups->getGroupsForGroupsgroup($groupsgroup['id']);
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['charactergroupsquests'];
|
||||
|
||||
// Manage
|
||||
$validation = array();
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Upload media
|
||||
if(!is_null($this->request->getPostParam('setmedia')))
|
||||
{
|
||||
$file = $_FILES['media'];
|
||||
|
||||
// Check error
|
||||
if($file['error'] !== 0 || empty($file['tmp_name'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'media', 'error', $file['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$file['mimetype'] = \hhu\z\Utils::getMimetype($file['tmp_name'], $file['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $file['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'media', 'mimetype', $file['mimetype']);
|
||||
}
|
||||
elseif($file['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'media', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
|
||||
// Upload media
|
||||
if($validation === true || empty($valiadion))
|
||||
{
|
||||
// Create filename
|
||||
$filename = sprintf(
|
||||
'%s-%d-%s.%s',
|
||||
'charactergroupsquest',
|
||||
$quest['id'],
|
||||
date('Ymd-His'),
|
||||
mb_substr($file['name'], strrpos($file['name'], '.')+1)
|
||||
);
|
||||
|
||||
// Upload file
|
||||
$this->Charactergroupsquests->uploadMediaForQuest($this->Auth->getUserId(), $seminary['id'], $quest['id'], $file, $filename);
|
||||
}
|
||||
}
|
||||
|
||||
// Delete media
|
||||
if(!is_null($this->request->getPostParam('deletemedia')))
|
||||
{
|
||||
$uploadIds = $this->request->getPostParam('uploads');
|
||||
var_dump($uploadIds);
|
||||
foreach($uploadIds as $uploadId) {
|
||||
$this->Uploads->deleteSeminaryupload($uploadId);
|
||||
}
|
||||
}
|
||||
|
||||
// Set XPs of Character groups for this Character groups Quest
|
||||
if(!is_null($this->request->getPostParam('setxps')))
|
||||
{
|
||||
$xps = $this->request->getPostParam('xps');
|
||||
foreach($groups as &$group)
|
||||
{
|
||||
if(array_key_exists($group['url'], $xps) && $xps[$group['url']] != 'null')
|
||||
{
|
||||
$xpsFactor = intval($xps[$group['url']]) / $quest['xps'];
|
||||
$this->Charactergroupsquests->setXPsOfGroupForQuest($quest['id'], $group['id'], $xpsFactor);
|
||||
}
|
||||
else {
|
||||
$this->Charactergroupsquests->deleteGroupForQuest($quest['id'], $group['id']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to Quest page
|
||||
if($validation === true || empty($validation)) {
|
||||
$this->redirect($this->linker->link(array('quest', $seminary['url'], $groupsgroup['url'], $quest['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get icon
|
||||
$questmedia = null;
|
||||
if(!is_null($quest['questsmedia_id'])) {
|
||||
$questmedia = $this->Media->getSeminaryMediaById($quest['questsmedia_id']);
|
||||
}
|
||||
|
||||
// Get uploads
|
||||
$uploads = $this->Charactergroupsquests->getMediaForQuest($quest['id']);
|
||||
foreach($uploads as &$upload) {
|
||||
$upload['upload'] = $this->Uploads->getSeminaryuploadById($upload['seminaryupload_id']);
|
||||
}
|
||||
|
||||
|
||||
// Set XPs for Groups
|
||||
foreach($groups as &$group) {
|
||||
$group['quest_group'] = $this->Charactergroupsquests->getXPsOfGroupForQuest($quest['id'], $group['id']);
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitle($quest['title']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('quest', $quest);
|
||||
$this->set('uploads', $uploads);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('groups', $groups);
|
||||
$this->set('media', $questmedia);
|
||||
$this->set('validation', $validation);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create a new Character groups Quest for a Character
|
||||
* groups-group of a Seminary.
|
||||
*
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
*/
|
||||
public function create($seminaryUrl, $groupsgroupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Questgroups
|
||||
$questgroups = $this->Questgroups->getQuestgroupsForSeminary($seminary['id']);
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['icons'];
|
||||
|
||||
// Values
|
||||
$title = '';
|
||||
$xps = 0;
|
||||
$description = '';
|
||||
$rules = '';
|
||||
$wonText = '';
|
||||
$lostText = '';
|
||||
$fields = array('title', 'xps');
|
||||
$validation = array();
|
||||
|
||||
// Create a new Character groups Quest
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Charactergroupsquests->characterGroupsQuestTitleExists($title)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
$xps = $this->request->getPostParam('xps');
|
||||
$description = $this->request->getPostParam('description');
|
||||
$rules = $this->request->getPostParam('rules');
|
||||
$wonText = $this->request->getPostParam('wonText');
|
||||
$lostText = $this->request->getPostParam('lostText');
|
||||
|
||||
// Validate icon
|
||||
$icon = null;
|
||||
if(!empty($_FILES) && array_key_exists('icon', $_FILES) && $_FILES['icon']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$icon = $_FILES['icon'];
|
||||
|
||||
// Check error
|
||||
if($icon['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'error', $icon['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$icon['mimetype'] = \hhu\z\Utils::getMimetype($icon['tmp_name'], $icon['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $icon['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'mimetype', $icon['mimetype']);
|
||||
}
|
||||
elseif($icon['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Validate Questgroup
|
||||
$questgroupIndex = null;
|
||||
foreach($questgroups as $index => &$questgroup)
|
||||
{
|
||||
$questgroup['selected'] = ($questgroup['url'] == $this->request->getPostParam('questgroup'));
|
||||
if($questgroup['selected']) {
|
||||
$questgroupIndex = $index;
|
||||
}
|
||||
}
|
||||
if(is_null($questgroupIndex)) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($questgroup);
|
||||
}
|
||||
|
||||
// Create groups Quest
|
||||
if($validation === true)
|
||||
{
|
||||
$questId = $this->Charactergroupsquests->createQuest(
|
||||
$this->Auth->getUserId(),
|
||||
$groupsgroup['id'],
|
||||
$questgroups[$questgroupIndex]['id'],
|
||||
$title,
|
||||
$description,
|
||||
$xps,
|
||||
$rules,
|
||||
$wonText,
|
||||
$lostText
|
||||
);
|
||||
$quest = $this->Charactergroupsquests->getQuestById($questId);
|
||||
|
||||
// Upload icon
|
||||
if(!is_null($icon))
|
||||
{
|
||||
$mediaId = $this->Media->createQuestMedia(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('charactergroupsquest-%s', $quest['url']),
|
||||
'',
|
||||
$icon['mimetype'],
|
||||
$icon['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Charactergroupsquests->setMediaForQuest($quest['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to Quest page
|
||||
$this->redirect($this->linker->link(array('quest', $seminary['url'], $groupsgroup['url'], $quest['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('New %s-Quest', $groupsgroup['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('questgroups', $questgroups);
|
||||
$this->set('title', $title);
|
||||
$this->set('xps', $xps);
|
||||
$this->set('description', $description);
|
||||
$this->set('rules', $rules);
|
||||
$this->set('wonText', $wonText);
|
||||
$this->set('lostText', $lostText);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit a Character groups Quest of a Character groups-group
|
||||
* of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $questUrl URL-Title of a Character groups Quest
|
||||
*/
|
||||
public function edit($seminaryUrl, $groupsgroupUrl, $questUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character groups-group Quests
|
||||
$quest = $this->Charactergroupsquests->getQuestByUrl($groupsgroup['id'], $questUrl);
|
||||
|
||||
// Get Questgroups
|
||||
$questgroups = $this->Questgroups->getQuestgroupsForSeminary($seminary['id']);
|
||||
foreach($questgroups as $index => &$questgroup) {
|
||||
$questgroup['selected'] = ($questgroup['id'] == $quest['questgroups_id']);
|
||||
}
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['icons'];
|
||||
|
||||
// Values
|
||||
$title = $quest['title'];
|
||||
$xps = $quest['xps'];
|
||||
$description = $quest['description'];
|
||||
$rules = $quest['rules'];
|
||||
$wonText = $quest['won_text'];
|
||||
$lostText = $quest['lost_text'];
|
||||
$fields = array('title', 'xps');
|
||||
$validation = array();
|
||||
|
||||
// Edit Character group
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Charactergroupsquests->characterGroupsQuestTitleExists($title, $quest['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
$xps = $this->request->getPostParam('xps');
|
||||
$description = $this->request->getPostParam('description');
|
||||
$rules = $this->request->getPostParam('rules');
|
||||
$wonText = $this->request->getPostParam('wonText');
|
||||
$lostText = $this->request->getPostParam('lostText');
|
||||
|
||||
// Validate icon
|
||||
$icon = null;
|
||||
if(!empty($_FILES) && array_key_exists('icon', $_FILES) && $_FILES['icon']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$icon = $_FILES['icon'];
|
||||
|
||||
// Check error
|
||||
if($icon['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'error', $icon['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$icon['mimetype'] = \hhu\z\Utils::getMimetype($icon['tmp_name'], $icon['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $icon['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'mimetype', $icon['mimetype']);
|
||||
}
|
||||
elseif($icon['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'icon', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Validate Questgroup
|
||||
$questgroupIndex = null;
|
||||
foreach($questgroups as $index => &$questgroup)
|
||||
{
|
||||
$questgroup['selected'] = ($questgroup['url'] == $this->request->getPostParam('questgroup'));
|
||||
if($questgroup['selected']) {
|
||||
$questgroupIndex = $index;
|
||||
}
|
||||
}
|
||||
if(is_null($questgroupIndex)) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($questgroup);
|
||||
}
|
||||
|
||||
// Edit groups Quest
|
||||
if($validation === true)
|
||||
{
|
||||
$this->Charactergroupsquests->editQuest(
|
||||
$quest['id'],
|
||||
$groupsgroup['id'],
|
||||
$questgroups[$questgroupIndex]['id'],
|
||||
$title,
|
||||
$description,
|
||||
$xps,
|
||||
$rules,
|
||||
$wonText,
|
||||
$lostText
|
||||
);
|
||||
$quest = $this->Charactergroupsquests->getQuestById($quest['id']);
|
||||
|
||||
// Upload icon
|
||||
if(!is_null($icon))
|
||||
{
|
||||
$mediaId = $this->Media->createQuestMedia(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('charactergroupsquest-%s', $quest['url']),
|
||||
'',
|
||||
$icon['mimetype'],
|
||||
$icon['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Charactergroupsquests->setMediaForQuest($quest['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to Quest page
|
||||
$this->redirect($this->linker->link(array('quest', $seminary['url'], $groupsgroup['url'], $quest['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Edit %s-Quest', $groupsgroup['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('quest', $quest);
|
||||
$this->set('questgroups', $questgroups);
|
||||
$this->set('title', $title);
|
||||
$this->set('xps', $xps);
|
||||
$this->set('description', $description);
|
||||
$this->set('rules', $rules);
|
||||
$this->set('wonText', $wonText);
|
||||
$this->set('lostText', $lostText);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete a Character groups Quest of a Character groups-group
|
||||
* of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $questUrl URL-Title of a Character groups Quest
|
||||
*/
|
||||
public function delete($seminaryUrl, $groupsgroupUrl, $questUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character groups-group Quests
|
||||
$quest = $this->Charactergroupsquests->getQuestByUrl($groupsgroup['id'], $questUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete seminary
|
||||
$this->Charactergroupsquests->deleteQuest($quest['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('charactergroups', 'groupsgroup', $seminary['url'], $groupsgroup['url'])));
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('quest', $seminary['url'], $groupsgroup['url'], $quest['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Delete %s-Quest', $groupsgroup['name']);
|
||||
$this->addTitle($groupsgroup['name']);
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('groupsgroup', $groupsgroup);
|
||||
$this->set('quest', $quest);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
695
controllers/CharactersController.inc
Normal file
695
controllers/CharactersController.inc
Normal file
|
|
@ -0,0 +1,695 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to list registered users and their data.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class CharactersController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'characters', 'users', 'charactergroups', 'charactertypes', 'seminarycharacterfields', 'avatars', 'media', 'quests', 'questgroups', 'questtopics', 'xplevels');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'character' => array('admin', 'moderator', 'user'),
|
||||
'register' => array('admin', 'moderator', 'user'),
|
||||
'manage' => array('admin', 'moderator', 'user'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'index' => array('admin', 'moderator'),
|
||||
'character' => array('admin', 'moderator', 'user'),
|
||||
'manage' => array('admin', 'moderator'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* List registered Characters for a Seminary
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $all Whether to list all Characters at once or not (optional)
|
||||
*/
|
||||
public function index($seminaryUrl, $all=null)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Seminarycharacterfields
|
||||
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
|
||||
|
||||
// Set sort order and page
|
||||
$sortorder = 'name';
|
||||
$charactername = null;
|
||||
$page = 1;
|
||||
if($this->request->getRequestMethod() == 'GET')
|
||||
{
|
||||
$sortorder = $this->request->getGetParam('sortorder');
|
||||
$sortorder = !empty($sortorder) ? $sortorder : 'name';
|
||||
$charactername = (!is_null($this->request->getGetParam('charactername'))) ? $this->request->getGetParam('charactername') : $charactername;
|
||||
$page = $this->request->getGetParam('page');
|
||||
$page = !empty($page) ? intval($page) : 1;
|
||||
}
|
||||
|
||||
// Get registered Characters
|
||||
$limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['lists_limit'] : null;
|
||||
$offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0;
|
||||
$charactersCount = $this->Characters->getCharactersForSeminaryCount($seminary['id'], $charactername);
|
||||
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $charactername, $limit, $offset);
|
||||
foreach($characters as &$character)
|
||||
{
|
||||
$character['user'] = $this->Users->getUserById($character['user_id']);
|
||||
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
|
||||
$character['characterfields'] = array();
|
||||
foreach($this->Seminarycharacterfields->getFieldsForCharacter($character['id']) as $value) {
|
||||
$character['characterfields'][$value['url']] = $value;
|
||||
}
|
||||
try {
|
||||
$character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
// No XP-level
|
||||
}
|
||||
try {
|
||||
$character['avatar'] = $this->Avatars->getAvatarByTypeAndLevel($seminary['id'], $character['charactertype_url'], $character['xplevel']['level']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
// No Avatar available
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Characters');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('characters', $characters);
|
||||
$this->set('charactersCount', $charactersCount);
|
||||
$this->set('characterfields', $characterfields);
|
||||
$this->set('sortorder', $sortorder);
|
||||
$this->set('charactername', $charactername);
|
||||
$this->set('all', $all);
|
||||
$this->set('page', $page);
|
||||
$this->set('limit', $limit);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: character.
|
||||
*
|
||||
* Show a Charater and its details.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $characterUrl URL-name of a Charater
|
||||
*/
|
||||
public function character($seminaryUrl, $characterUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
$seminary['achievable_xps'] = $this->Seminaries->getTotalXPs($seminary['id']);
|
||||
|
||||
// Get Character
|
||||
$character = $this->Characters->getCharacterByUrl($seminary['id'], $characterUrl);
|
||||
try {
|
||||
$character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
// No XP-level
|
||||
}
|
||||
$character['rank'] = $this->Characters->getXPRank($seminary['id'], $character['xps']);
|
||||
|
||||
// Get User
|
||||
$user = $this->Users->getUserById($character['user_id']);
|
||||
|
||||
// Get Character groups
|
||||
$groups = $this->Charactergroups->getGroupsForCharacter($character['id']);
|
||||
foreach($groups as &$group) {
|
||||
$group['groupsgroup'] = $this->Charactergroups->getGroupsgroupById($group['charactergroupsgroup_id']);
|
||||
}
|
||||
|
||||
// Get Achievements
|
||||
$achievements = $this->Achievements->getAchievedAchievementsForCharacter($character['id']);
|
||||
|
||||
// Get Achievements with deadline (milestones)
|
||||
$milestones = $this->Achievements->getDeadlineAchievements($seminary['id']);
|
||||
foreach($milestones as &$milestone) {
|
||||
$milestone['achieved'] = $this->Achievements->hasCharacterAchievedAchievement($milestone['id'], $character['id']);
|
||||
}
|
||||
|
||||
// Get ranking
|
||||
$ranking = array(
|
||||
'superior' => $this->Characters->getSuperiorCharacters($seminary['id'], $character['xps'], \nre\configs\AppConfig::$misc['ranking_range']),
|
||||
'inferior' => $this->Characters->getInferiorCharacters($seminary['id'], $character['id'], $character['xps'], \nre\configs\AppConfig::$misc['ranking_range'])
|
||||
);
|
||||
|
||||
// Get Quest topics
|
||||
$questtopics = $this->Questtopics->getQuesttopicsForSeminary($seminary['id']);
|
||||
foreach($questtopics as &$questtopic)
|
||||
{
|
||||
$questtopic['questcount'] = $this->Questtopics->getQuestCountForQuesttopic($questtopic['id']);
|
||||
$questtopic['characterQuestcount'] = $this->Questtopics->getCharacterQuestCountForQuesttopic($questtopic['id'], $character['id']);
|
||||
}
|
||||
|
||||
// Get “last” Quest
|
||||
$lastQuest = null;
|
||||
if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0)
|
||||
{
|
||||
$lastQuest = $this->Quests->getLastQuestForCharacter($character['id']);
|
||||
if(!is_null($lastQuest)) {
|
||||
$lastQuest['questgroup'] = $this->Questgroups->getQuestgroupById($lastQuest['questgroup_id']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitle($character['name']);
|
||||
$this->addTitleLocalized('Characters');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('character', $character);
|
||||
$this->set('user', $user);
|
||||
$this->set('groups', $groups);
|
||||
$this->set('achievements', $achievements);
|
||||
$this->set('milestones', $milestones);
|
||||
$this->set('ranking', $ranking);
|
||||
$this->set('questtopics', $questtopics);
|
||||
$this->set('lastQuest', $lastQuest);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Acton: register.
|
||||
*
|
||||
* Register a new character for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @throws \nre\exceptions\ParamsNotValidException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function register($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Check for already existing Character
|
||||
try {
|
||||
$this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']);
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
// This should be the case
|
||||
}
|
||||
|
||||
|
||||
// Character types
|
||||
$types = $this->Charactertypes->getCharacterTypesForSeminary($seminary['id']);
|
||||
|
||||
// Character fields
|
||||
$fields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
|
||||
|
||||
// Register Character
|
||||
$charactername = '';
|
||||
$validation = true;
|
||||
$fieldsValidation = true;
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Validate Character properties
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), array('charactername'));
|
||||
$charactername = $this->request->getPostParam('charactername');
|
||||
if($this->Characters->characterNameExists($charactername)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactername', 'exist', true);
|
||||
}
|
||||
|
||||
// Validate type
|
||||
$typeIndex = null;
|
||||
foreach($types as $index => &$type)
|
||||
{
|
||||
$type['selected'] = ($type['url'] == $this->request->getPostParam('type'));
|
||||
if($type['selected']) {
|
||||
$typeIndex = $index;
|
||||
}
|
||||
}
|
||||
if(is_null($typeIndex)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'type', 'exist', false);
|
||||
}
|
||||
|
||||
// Validate fields
|
||||
$fieldsValues = $this->request->getPostParam('fields');
|
||||
foreach($fields as &$field)
|
||||
{
|
||||
if(!array_key_exists($field['url'], $fieldsValues)) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($index);
|
||||
}
|
||||
$field['uservalue'] = $fieldsValues[$field['url']];
|
||||
if($field['required'])
|
||||
{
|
||||
$fieldValidation = $this->Validation->validate($fieldsValues[$field['url']], array('regex'=>$field['regex']));
|
||||
if($fieldValidation !== true)
|
||||
{
|
||||
if(!is_array($fieldsValidation)) {
|
||||
$fieldsValidation = array();
|
||||
}
|
||||
$fieldsValidation[$field['url']] = $fieldValidation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Register
|
||||
if($validation === true && $fieldsValidation === true)
|
||||
{
|
||||
$characterId = $this->Characters->createCharacter($this->Auth->getUserId(), $types[$typeIndex]['id'], $charactername);
|
||||
$character = $this->Characters->getCharacterById($characterId);
|
||||
|
||||
// Add Seminary fields
|
||||
foreach($fields as &$field) {
|
||||
if(!empty($fieldsValues[$field['url']])) {
|
||||
$this->Seminarycharacterfields->setSeminaryFieldOfCharacter($field['id'], $characterId, $fieldsValues[$field['url']]);
|
||||
}
|
||||
}
|
||||
|
||||
// Set roles for owners and admins
|
||||
if(in_array('admin', \hhu\z\controllers\IntermediateController::$user['roles']) || $seminary['created_user_id'] == \hhu\z\controllers\IntermediateController::$user['id']) {
|
||||
$this->Characterroles->addCharacterroleToCharacter($characterId, 'admin');
|
||||
}
|
||||
|
||||
// Send mail
|
||||
$this->sendRegistrationMail($character);
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array('seminaries')));
|
||||
}
|
||||
}
|
||||
|
||||
// Get XP-levels
|
||||
$xplevels = $this->Xplevels->getXPLevelsForSeminary($seminary['id']);
|
||||
|
||||
// Get Avatars
|
||||
if(count($xplevels) > 0)
|
||||
{
|
||||
foreach($types as &$type)
|
||||
{
|
||||
try {
|
||||
$type['avatar'] = $this->Avatars->getAvatarByTypeAndLevel($seminary['id'], $type['url'], $xplevels[0]['level']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
// No Avatar available
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Create Character');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('types', $types);
|
||||
$this->set('fields', $fields);
|
||||
$this->set('charactername', $charactername);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('fieldsValidation', $fieldsValidation);
|
||||
$this->set('xplevels', $xplevels);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: manage.
|
||||
*
|
||||
* Manage Characters.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function manage($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Set sort order and page
|
||||
|
||||
$selectedCharacters = array();
|
||||
$sortorder = 'name';
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Set sortorder
|
||||
$sortorder = $this->request->getPostParam('sortorder');
|
||||
$sortorder = !empty($sortorder) ? $sortorder : 'name';
|
||||
|
||||
// Do action
|
||||
$selectedCharacters = $this->request->getPostParam('characters');
|
||||
if(!is_array($selectedCharacters)) {
|
||||
$selectedCharacters = array();
|
||||
}
|
||||
if(!is_null($this->request->getPostParam('actions')) && count($this->request->getPostParam('actions')) > 0 && !is_null($this->request->getPostParam('characters')) && count($this->request->getPostParam('characters')) > 0)
|
||||
{
|
||||
$actions = $this->request->getPostParam('actions');
|
||||
$action = array_keys($actions)[0];
|
||||
|
||||
switch($action)
|
||||
{
|
||||
// Add/remove role to/from Characters
|
||||
case 'addrole':
|
||||
case 'removerole':
|
||||
// Determine role and check permissions
|
||||
$role = null;
|
||||
switch($actions[$action])
|
||||
{
|
||||
case _('Admin'):
|
||||
if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) <= 0 && !in_array('admin', \hhu\z\controllers\SeminaryController::$character['characterroles'])) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
$role = 'admin';
|
||||
break;
|
||||
case _('Moderator'):
|
||||
if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) <= 0 && !in_array('admin', \hhu\z\controllers\SeminaryController::$character['characterroles'])) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
$role = 'moderator';
|
||||
break;
|
||||
case _('User'):
|
||||
if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) <= 0 && count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) <= 0) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
$role = 'user';
|
||||
break;
|
||||
}
|
||||
|
||||
// Add role
|
||||
if($action == 'addrole') {
|
||||
foreach($selectedCharacters as &$characterId) {
|
||||
$this->Characterroles->addCharacterroleToCharacter($characterId, $role);
|
||||
}
|
||||
}
|
||||
// Remove role
|
||||
else {
|
||||
foreach($selectedCharacters as &$characterId) {
|
||||
$this->Characterroles->removeCharacterroleFromCharacter($characterId, $role);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get Seminarycharacterfields
|
||||
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
|
||||
|
||||
// Get registered Characters
|
||||
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder);
|
||||
foreach($characters as &$character)
|
||||
{
|
||||
$character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
|
||||
$character['user'] = $this->Users->getUserById($character['user_id']);
|
||||
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
|
||||
$character['characterfields'] = array();
|
||||
foreach($this->Seminarycharacterfields->getFieldsForCharacter($character['id']) as $value) {
|
||||
$character['characterfields'][$value['url']] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Manage Characters');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('characters', $characters);
|
||||
$this->set('characterfields', $characterfields);
|
||||
$this->set('selectedCharacters', $selectedCharacters);
|
||||
$this->set('sortorder', $sortorder);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Acton: edit.
|
||||
*
|
||||
* Edit a new character for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @throws \nre\exceptions\ParamsNotValidException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $characterUrl URL-name of a Charater
|
||||
*/
|
||||
public function edit($seminaryUrl, $characterUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character
|
||||
$character = $this->Characters->getCharacterByUrl($seminary['id'], $characterUrl);
|
||||
|
||||
// Check permissions
|
||||
if(count(array_intersect(array('admin','moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) == 0 && $character['id'] != \hhu\z\controllers\SeminaryController::$character['id']) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Get User
|
||||
$user = $this->Users->getUserById($character['user_id']);
|
||||
|
||||
// Character types
|
||||
$types = $this->Charactertypes->getCharacterTypesForSeminary($seminary['id']);
|
||||
foreach($types as &$type) {
|
||||
$type['selected'] = ($type['url'] == $character['charactertype_url']);
|
||||
}
|
||||
|
||||
// Character fields
|
||||
$fields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
|
||||
foreach($fields as &$field)
|
||||
{
|
||||
$userValue = $this->Seminarycharacterfields->getSeminaryFieldOfCharacter($field['id'], $character['id']);
|
||||
if(!empty($userValue)) {
|
||||
$field['uservalue'] = $userValue['value'];
|
||||
}
|
||||
}
|
||||
|
||||
// Values
|
||||
$charactername = $character['name'];
|
||||
$validation = array();
|
||||
$fieldsValidation = true;
|
||||
|
||||
// Edit Character
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Validate Character properties
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), array('charactername'));
|
||||
$charactername = (count(array_intersect(array('admin','moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0) ? $this->request->getPostParam('charactername') : $character['name'];
|
||||
if($this->Characters->characterNameExists($charactername, $character['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactername', 'exist', true);
|
||||
}
|
||||
|
||||
// Validate type
|
||||
$typeIndex = null;
|
||||
foreach($types as $index => &$type)
|
||||
{
|
||||
$type['selected'] = (count(array_intersect(array('admin','moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) > 0) ? ($type['url'] == $this->request->getPostParam('type')) : ($type['url'] == $character['charactertype_url']);
|
||||
if($type['selected']) {
|
||||
$typeIndex = $index;
|
||||
}
|
||||
}
|
||||
if(is_null($typeIndex)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'type', 'exist', false);
|
||||
}
|
||||
|
||||
// Validate fields
|
||||
$fieldsValues = $this->request->getPostParam('fields');
|
||||
foreach($fields as &$field)
|
||||
{
|
||||
if(!array_key_exists($field['url'], $fieldsValues)) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($index);
|
||||
}
|
||||
$field['uservalue'] = $fieldsValues[$field['url']];
|
||||
if($field['required'])
|
||||
{
|
||||
$fieldValidation = $this->Validation->validate($fieldsValues[$field['url']], array('regex'=>$field['regex']));
|
||||
if($fieldValidation !== true)
|
||||
{
|
||||
if(!is_array($fieldsValidation)) {
|
||||
$fieldsValidation = array();
|
||||
}
|
||||
$fieldsValidation[$field['url']] = $fieldValidation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Edit
|
||||
if($validation === true && $fieldsValidation === true)
|
||||
{
|
||||
$this->Characters->editCharacter(
|
||||
$character['id'],
|
||||
$types[$typeIndex]['id'],
|
||||
$charactername
|
||||
);
|
||||
|
||||
// Set Seminary fields
|
||||
foreach($fields as &$field) {
|
||||
if(!empty($fieldsValues[$field['url']])) {
|
||||
$this->Seminarycharacterfields->setSeminaryFieldOfCharacter($field['id'], $character['id'], $fieldsValues[$field['url']]);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect
|
||||
$character = $this->Characters->getCharacterById($character['id']);
|
||||
$this->redirect($this->linker->link(array('character', $seminary['url'], $character['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get XP-levels
|
||||
$xplevels = $this->Xplevels->getXPLevelsForSeminary($seminary['id']);
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
$validationSettings['charactername'] = \nre\configs\AppConfig::$validation['charactername'];
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Edit Character');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('types', $types);
|
||||
$this->set('fields', $fields);
|
||||
$this->set('charactername', $charactername);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('fieldsValidation', $fieldsValidation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
$this->set('xplevels', $xplevels);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete a Character.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $characterUrl URL-name of a Charater
|
||||
*/
|
||||
public function delete($seminaryUrl, $characterUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character
|
||||
$character = $this->Characters->getCharacterByUrl($seminary['id'], $characterUrl);
|
||||
|
||||
// Get User
|
||||
$user = $this->Users->getUserById($character['user_id']);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete Character
|
||||
$this->Characters->deleteCharacter($character['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('index', $seminary['url']), 1));
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('index', $seminary['url'], $character['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Delete Character');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('character', $character);
|
||||
$this->set('user', $user);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Send mail for new Character registration.
|
||||
*
|
||||
* @param arary $newCharacter Newly registered Character
|
||||
*/
|
||||
private function sendRegistrationMail($newCharacter)
|
||||
{
|
||||
// Get Seminary moderators
|
||||
$characters = $this->Characters->getCharactersWithCharacterRole(self::$seminary['id'], 'moderator');
|
||||
|
||||
// Send notification mail
|
||||
try {
|
||||
foreach($characters as &$character)
|
||||
{
|
||||
$moderator = $this->Users->getUserById($character['user_id']);
|
||||
if($moderator['mailing']) {
|
||||
\hhu\z\Utils::sendMail(
|
||||
$moderator['email'],
|
||||
'characterregistration',
|
||||
true,
|
||||
array(
|
||||
$moderator,
|
||||
\hhu\z\controllers\SeminaryController::$seminary,
|
||||
\hhu\z\controllers\IntermediateController::$user,
|
||||
$newCharacter
|
||||
),
|
||||
$this->linker
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(\hhu\z\exceptions\MailingException $e) {
|
||||
$this->log($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
406
controllers/CharactertypesController.inc
Normal file
406
controllers/CharactertypesController.inc
Normal file
|
|
@ -0,0 +1,406 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the CharactertypesAgent to handle Charactertyes of a
|
||||
* Seminary.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class CharactertypesController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('charactertypes', 'xplevels', 'avatars', 'media');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin', 'moderator', 'user'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* List Character types.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function index($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Check permissions
|
||||
if(
|
||||
(is_null(self::$character) && count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0) &&
|
||||
$seminary['created_user_id'] != self::$user['id']
|
||||
) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Get Character types
|
||||
$charactertypes = $this->Charactertypes->getCharacterTypesForSeminary($seminary['id']);
|
||||
|
||||
// Get Avatars
|
||||
$xplevels = $this->Xplevels->getXPLevelsForSeminary($seminary['id']);
|
||||
if(count($xplevels) > 0)
|
||||
{
|
||||
foreach($charactertypes as &$type)
|
||||
{
|
||||
try {
|
||||
$type['avatar'] = $this->Avatars->getAvatarByTypeAndLevel($seminary['id'], $type['url'], $xplevels[0]['level']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
// No Avatar available
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Charactertypes');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('xplevels', $xplevels);
|
||||
$this->set('charactertypes', $charactertypes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create new Character type for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function create($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Check permissions
|
||||
if(
|
||||
$seminary['created_user_id'] != self::$user['id'] &&
|
||||
(is_null(self::$character) && count(array_intersect(array('admin'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0)
|
||||
) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Values
|
||||
$name = '';
|
||||
$fields = array('charactertypename');
|
||||
$validation = array();
|
||||
|
||||
// Create new Charactertype
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$name = $this->request->getPostParam('charactertypename');
|
||||
if($this->Charactertypes->charactertypeNameExists($seminary['id'], $name)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactertypename', 'exist', true);
|
||||
}
|
||||
|
||||
// Create new Charactertype
|
||||
if($validation === true)
|
||||
{
|
||||
$charactertypeId = $this->Charactertypes->createCharactertype(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$name
|
||||
);
|
||||
$charactertype = $this->Charactertypes->getCharactertypeById($charactertypeId);
|
||||
|
||||
// Redirect to editing
|
||||
$this->redirect($this->linker->link(array('edit', $seminary['url'], $charactertype['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Create new Charactertype');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('name', $name);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit Character type for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of a Seminary
|
||||
* @param string $charactertypeUrl URL-title of Character type
|
||||
*/
|
||||
public function edit($seminaryUrl, $charactertypeUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Check permissions
|
||||
if(
|
||||
$seminary['created_user_id'] != self::$user['id'] &&
|
||||
(is_null(self::$character) && count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0)
|
||||
) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Get Character type
|
||||
$charactertype = $this->Charactertypes->getCharactertypeByUrl($seminary['id'], $charactertypeUrl);
|
||||
|
||||
// XP-levels
|
||||
$xplevels = $this->Xplevels->getXPLevelsForSeminary($seminary['id']);
|
||||
foreach($xplevels as &$xplevel)
|
||||
{
|
||||
try {
|
||||
$xplevel['avatar'] = $this->Avatars->getAvatarByTypeAndLevel($seminary['id'], $charactertype['url'], $xplevel['level']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
// No Avatar available
|
||||
}
|
||||
}
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
|
||||
|
||||
// Values
|
||||
$name = $charactertype['name'];
|
||||
$fields = array('charactertypename');
|
||||
$validation = array();
|
||||
$avatarVariants = array('portrait', 'avatar');
|
||||
$avatarsValidation = true;
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$name = $this->request->getPostParam('charactertypename');
|
||||
if($this->Charactertypes->charactertypeNameExists($seminary['id'], $name, $charactertype['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'charactertypename', 'exist', true);
|
||||
}
|
||||
|
||||
// Validate and upload avatars
|
||||
if(array_key_exists('avatars', $_FILES))
|
||||
{
|
||||
foreach($xplevels as &$xplevel)
|
||||
{
|
||||
if(array_key_exists($xplevel['id'], $_FILES['avatars']['error']))
|
||||
{
|
||||
foreach($avatarVariants as &$variant)
|
||||
{
|
||||
if(array_key_exists($variant, $_FILES['avatars']['error'][$xplevel['id']]) && $_FILES['avatars']['error'][$xplevel['id']][$variant] !== UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$avatar = array(
|
||||
'name' => $_FILES['avatars']['name'][$xplevel['id']][$variant],
|
||||
'type' => $_FILES['avatars']['type'][$xplevel['id']][$variant],
|
||||
'tmp_name' => $_FILES['avatars']['tmp_name'][$xplevel['id']][$variant],
|
||||
'error' => $_FILES['avatars']['error'][$xplevel['id']][$variant],
|
||||
'size' => $_FILES['avatars']['size'][$xplevel['id']][$variant]
|
||||
);
|
||||
$avatarValidation = true;
|
||||
|
||||
// Check error
|
||||
if($avatar['error'] !== UPLOAD_ERR_OK) {
|
||||
$avatarValidation = $this->Validation->addValidationResult($avatarValidation, 'avatar', 'error', $avatar['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$avatarMimetype = null;
|
||||
$avatar['mimetype'] = \hhu\z\Utils::getMimetype($avatar['tmp_name'], $avatar['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $avatar['mimetype']) {
|
||||
$avatarMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($avatarMimetype)) {
|
||||
$avatarValidation = $this->Validation->addValidationResult($avatarValidation, 'avatar', 'mimetype', $avatar['mimetype']);
|
||||
}
|
||||
elseif($avatar['size'] > $avatarMimetype['size']) {
|
||||
$avatarValidation = $this->Validation->addValidationResult($avatarValidation, 'avatar', 'size', $avatarMimetype['size']);
|
||||
}
|
||||
|
||||
// Add validation result
|
||||
if(!$avatarValidation !== true)
|
||||
{
|
||||
if(!is_array($avatarsValidation)) {
|
||||
$avatarsValidation = array();
|
||||
}
|
||||
if(!array_key_exists($xplevel['id'], $avatarsValidation)) {
|
||||
$avatarsValidation[$xplevel['id']] = array();
|
||||
}
|
||||
$avatarsValidation[$xplevel['id']][$variant] = $avatarValidation;
|
||||
}
|
||||
|
||||
// Upload avatar
|
||||
if($avatarValidation === true)
|
||||
{
|
||||
$avatar['media_id'] = $this->Media->createAvatarPicture(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('avatar-%d-%d-%s', $charactertype['id'], $xplevel['id'], $variant),
|
||||
'',
|
||||
$avatar['mimetype'],
|
||||
$avatar['tmp_name']
|
||||
);
|
||||
|
||||
// Set avatar
|
||||
if($variant == 'portrait') {
|
||||
$this->Avatars->setAvatarPortraitForTypeAndLevel(
|
||||
$this->Auth->getUserId(),
|
||||
$charactertype['id'],
|
||||
$xplevel['id'],
|
||||
$avatar['media_id']
|
||||
);
|
||||
}
|
||||
else {
|
||||
$this->Avatars->setAvatarForTypeAndLevel(
|
||||
$this->Auth->getUserId(),
|
||||
$charactertype['id'],
|
||||
$xplevel['id'],
|
||||
$avatar['media_id']
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Edit Charactertype
|
||||
if($validation === true && $avatarsValidation === true)
|
||||
{
|
||||
$this->Charactertypes->editCharactertype(
|
||||
$charactertype['id'],
|
||||
$name
|
||||
);
|
||||
$charactertype = $this->Charactertypes->getCharactertypeById($charactertype['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('index', $seminary['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Edit Charactertype');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('charactertype', $charactertype);
|
||||
$this->set('xplevels', $xplevels);
|
||||
$this->set('name', $name);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('avatarsValidation', $avatarsValidation);
|
||||
$this->set('avatarVariants', $avatarVariants);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete Character type for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of a Seminary
|
||||
* @param string $charactertypeUrl URL-title of Character type
|
||||
*/
|
||||
public function delete($seminaryUrl, $charactertypeUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Check permissions
|
||||
if(
|
||||
$seminary['created_user_id'] != self::$user['id'] &&
|
||||
(is_null(self::$character) && count(array_intersect(array('admin'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0)
|
||||
) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Get Character type
|
||||
$charactertype = $this->Charactertypes->getCharactertypeByUrl($seminary['id'], $charactertypeUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete Character type
|
||||
$this->Charactertypes->deleteCharactertype($charactertype['id']);
|
||||
}
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('index', $seminary['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Delete Charactertype');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('charactertype', $charactertype);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
51
controllers/ErrorController.inc
Normal file
51
controllers/ErrorController.inc
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to show an error page.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class ErrorController extends \hhu\z\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Set HTTP-header and print an error message.
|
||||
*
|
||||
* @param int $httpStatusCode HTTP-statuscode of the error that occurred
|
||||
*/
|
||||
public function index($httpStatusCode)
|
||||
{
|
||||
// Set HTTP-header
|
||||
if(!array_key_exists($httpStatusCode, \nre\core\WebUtils::$httpStrings)) {
|
||||
$httpStatusCode = 200;
|
||||
}
|
||||
$this->response->addHeader(\nre\core\WebUtils::getHttpHeader($httpStatusCode));
|
||||
|
||||
// Display statuscode and message
|
||||
$this->set('code', $httpStatusCode);
|
||||
$this->set('string', \nre\core\WebUtils::$httpStrings[$httpStatusCode]);
|
||||
$this->set('userId', $this->Auth->getUserId());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
37
controllers/FaultController.inc
Normal file
37
controllers/FaultController.inc
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to display a toplevel error page.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class FaultController extends \nre\core\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Show the error message.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
114
controllers/HtmlController.inc
Normal file
114
controllers/HtmlController.inc
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the HtmlAgent to display a HTML-page.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class HtmlController extends \hhu\z\Controller
|
||||
{
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('notification');
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
// Set content-type
|
||||
$this->response->addHeader("Content-type: text/html; charset=utf-8");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Postfilter that is executed after running the Controller.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function postFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
// Get title
|
||||
$this->set('title', $this->getTitle());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Create the HTML-structure.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// Set the name of the current IntermediateAgent as page title
|
||||
$this->set('title', $this->request->getParam(1, 'intermediate'));
|
||||
|
||||
// Set userdata
|
||||
$this->set('loggedUser', IntermediateController::$user);
|
||||
$this->set('loggedSeminary', SeminaryController::$seminary);
|
||||
$this->set('loggedCharacter', SeminaryController::$character);
|
||||
|
||||
// Set notifications
|
||||
$this->set('notifications', $this->Notification->getNotifications());
|
||||
|
||||
// Set some application data
|
||||
$this->set('mailcontact', \nre\configs\AppConfig::$app['mailcontact']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get title information from IntermediateController if possible
|
||||
* and create a title.
|
||||
*
|
||||
* @return string Title for the current page
|
||||
*/
|
||||
private function getTitle()
|
||||
{
|
||||
$title = array();
|
||||
|
||||
// Get title of IntermediateController
|
||||
$intermediateController = $this->agent->getIntermediateAgent()->controller;
|
||||
if($intermediateController instanceof \hhu\z\controllers\IntermediateController) {
|
||||
$title = $intermediateController->getTitle();
|
||||
}
|
||||
if(!is_array($title)) {
|
||||
$title = array($title);
|
||||
}
|
||||
|
||||
// Add application name
|
||||
$title[] = \nre\configs\AppConfig::$app['name'];
|
||||
|
||||
|
||||
// Return title with delimiter
|
||||
return implode(\nre\configs\AppConfig::$misc['title_delimiter'], $title);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
54
controllers/HtmlmailController.inc
Normal file
54
controllers/HtmlmailController.inc
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the HtmlmailAgent for generating a HTML-mail message.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class HtmlmailController extends \nre\core\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
|
||||
// Set linker
|
||||
$this->set('linker', ($request instanceof \hhu\z\requests\MailRequest && !is_null($request->getLinker())) ? $request->getLinker() : null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Create HTML-structure of mail message.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->set('appname', \nre\configs\AppConfig::$app['name']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
37
controllers/IntroductionController.inc
Normal file
37
controllers/IntroductionController.inc
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to show an introduction page.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class IntroductionController extends \hhu\z\controllers\IntermediateController
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// Pass data to view
|
||||
$this->set('userId', $this->Auth->getUserId());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
513
controllers/LibraryController.inc
Normal file
513
controllers/LibraryController.inc
Normal file
|
|
@ -0,0 +1,513 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the LibraryAgent to list Quest topics.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class LibraryController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('questtopics', 'seminaries', 'quests', 'questgroups');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'topic' => array('admin', 'moderator', 'user'),
|
||||
'manage' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin', 'moderator', 'user'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'index' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'topic' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'manage' => array('admin', 'moderator'),
|
||||
'create' => array('admin', 'moderator'),
|
||||
'edit' => array('admin', 'moderator'),
|
||||
'delete' => array('admin', 'moderator')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* List Questtopics of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of Seminary
|
||||
*/
|
||||
public function index($seminaryUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character
|
||||
$character = SeminaryController::$character;
|
||||
|
||||
// Get Quest topics
|
||||
$totalQuestcount = 0;
|
||||
$totalCharacterQuestcount = 0;
|
||||
$questtopics = $this->Questtopics->getQuesttopicsForSeminary($seminary['id']);
|
||||
foreach($questtopics as &$questtopic)
|
||||
{
|
||||
// Get Quest count
|
||||
$questtopic['questcount'] = $this->Questtopics->getQuestCountForQuesttopic($questtopic['id']);
|
||||
$totalQuestcount += $questtopic['questcount'];
|
||||
|
||||
// Get Character progress
|
||||
$questtopic['characterQuestcount'] = $this->Questtopics->getCharacterQuestCountForQuesttopic($questtopic['id'], $character['id']);
|
||||
$totalCharacterQuestcount += $questtopic['characterQuestcount'];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Library');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('totalQuestcount', $totalQuestcount);
|
||||
$this->set('totalCharacterQuestcount', $totalCharacterQuestcount);
|
||||
$this->set('questtopics', $questtopics);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: topic.
|
||||
*
|
||||
* Show a Questtopic and its Quests with Questsubtopics.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $eminaryUrl URL-Title of Seminary
|
||||
* @param string $questtopicUrl URL-Title of Questtopic
|
||||
*/
|
||||
public function topic($seminaryUrl, $questtopicUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character
|
||||
$character = SeminaryController::$character;
|
||||
|
||||
// Get Questtopic
|
||||
$questtopic = $this->Questtopics->getQuesttopicByUrl($seminary['id'], $questtopicUrl);
|
||||
$questtopic['questcount'] = $this->Questtopics->getQuestCountForQuesttopic($questtopic['id']);
|
||||
$questtopic['characterQuestcount'] = $this->Questtopics->getCharacterQuestCountForQuesttopic($questtopic['id'], $character['id']);
|
||||
|
||||
// Get Quests
|
||||
$quests = array();
|
||||
foreach($this->Quests->getQuestsForQuesttopic($questtopic['id']) as $quest)
|
||||
{
|
||||
if($this->Quests->hasCharacterEnteredQuest($quest['id'], $character['id']) || count(array_intersect(array('admin', 'moderator'), self::$character['characterroles'])) > 0)
|
||||
{
|
||||
// Get Subtopics
|
||||
$quest['subtopics'] = $this->Questtopics->getQuestsubtopicsForQuest($quest['id']);
|
||||
|
||||
$quests[] = $quest;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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('quests', $quests);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: manage.
|
||||
*
|
||||
* Manage a Questtopic and its Quests with Questsubtopics.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $eminaryUrl URL-Title of Seminary
|
||||
* @param string $questtopicUrl URL-Title of Questtopic
|
||||
*/
|
||||
public function manage($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')))
|
||||
{
|
||||
$selectedSubtopics = $this->request->getPostParam('questsubtopics');
|
||||
|
||||
// Set subtopics of Quests
|
||||
$quests = $this->Quests->getQuestsForQuesttopic($questtopic['id']);
|
||||
foreach($quests as &$quest)
|
||||
{
|
||||
$subtopics = (array_key_exists($quest['id'], $selectedSubtopics)) ? $selectedSubtopics[$quest['id']] : array();
|
||||
$this->Questtopics->setQuestsubtopicsForQuest($quest['id'], array_keys($subtopics));
|
||||
}
|
||||
|
||||
// Add Quest
|
||||
$addQuestId = $this->request->getPostParam('addquest');
|
||||
if(!empty($addQuestId))
|
||||
{
|
||||
$subtopics = (array_key_exists('addquest', $selectedSubtopics)) ? $selectedSubtopics['addquest'] : array();
|
||||
if(!empty($subtopics)) {
|
||||
$this->Questtopics->setQuestsubtopicsForQuest($addQuestId, array_keys($subtopics));
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array('topic', $seminary['url'], $questtopic['url']), 1));
|
||||
}
|
||||
|
||||
// Get Quests
|
||||
$quests = $this->Quests->getQuestsForQuesttopic($questtopic['id']);
|
||||
foreach($quests as &$quest)
|
||||
{
|
||||
// Get Subtopics
|
||||
$quest['subtopics'] = $this->Questtopics->getQuestsubtopicsForQuest($quest['id']);
|
||||
$quest['subtopics'] = array_map(function($t) { return $t['id']; }, $quest['subtopics']);
|
||||
}
|
||||
|
||||
// Get all Quests
|
||||
$allQuests = $this->Quests->getQuestsForSeminary($seminary['id']);
|
||||
|
||||
|
||||
// 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);
|
||||
$this->set('allQuests', $allQuests);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create a new Questtopic for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of Seminary
|
||||
*/
|
||||
public function create($seminaryUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Values
|
||||
$title = '';
|
||||
$fields = array('title');
|
||||
$validation = array();
|
||||
|
||||
// Create new Questtopic
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Questtopics->questtopicTitleExists($title)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
|
||||
// Create
|
||||
if($validation === true)
|
||||
{
|
||||
$questtopicId = $this->Questtopics->createQuesttopic(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$title
|
||||
);
|
||||
$questtopic = $this->Questtopics->getQuesttopicById($questtopicId);
|
||||
|
||||
// Redirect to Questtopic
|
||||
$this->redirect($this->linker->link(array('topic', $seminary['url'], $questtopic['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('New Questtopic');
|
||||
$this->addTitleLocalized('Library');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('title', $title);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit a Questtopic of a Seminary and its Questsubtopics.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $eminaryUrl URL-Title of Seminary
|
||||
* @param string $questtopicUrl URL-Title of Questtopic
|
||||
*/
|
||||
public function edit($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']);
|
||||
|
||||
// Values
|
||||
$questtopicTitle = $questtopic['title'];
|
||||
$subtopicsTitles = array();
|
||||
foreach($questsubtopics as &$questsubtopic) {
|
||||
$subtopicsTitles[$questsubtopic['id']] = $questsubtopic['title'];
|
||||
}
|
||||
$deleteSubtopics = null;
|
||||
$subtopicTitle = '';
|
||||
$validations = array(
|
||||
'edit' => true,
|
||||
'edit-subtopics' => true,
|
||||
'create-subtopic' => true
|
||||
);
|
||||
|
||||
// Edit
|
||||
$action = null;
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Edit Questtopic
|
||||
if(!is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
$action = 'edit';
|
||||
|
||||
// Get params and validate them
|
||||
$validations[$action] = $this->Validation->validateParams($this->request->getPostParams(), array('title'));
|
||||
$questtopicTitle = $this->request->getPostParam('title');
|
||||
if($this->Questtopics->questsubtopicTitleExists($questtopicTitle, $questtopic['id'])) {
|
||||
$validations[$action] = $this->Validation->addValidationResult($validations[$action], 'title', 'exist', true);
|
||||
}
|
||||
|
||||
// Edit
|
||||
if($validations[$action] === true)
|
||||
{
|
||||
$this->Questtopics->editQuesttopic(
|
||||
$questtopic['id'],
|
||||
$questtopicTitle
|
||||
);
|
||||
$questtopic = $this->Questtopics->getQuesttopicById($questtopic['id']);
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array('topic', $seminary['url'], $questtopic['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Edit and delete Questsubtopics
|
||||
elseif(!is_null($this->request->getPostParam('edit-subtopics')))
|
||||
{
|
||||
$action = 'edit-subtopics';
|
||||
|
||||
// Get params and validate them
|
||||
$subtopicsTitles = $this->request->getPostParam('subtopics');
|
||||
$deleteSubtopics = $this->request->getPostParam('delete-subtopics');
|
||||
foreach($questsubtopics as &$questsubtopic)
|
||||
{
|
||||
if(!is_null($deleteSubtopics) && array_key_exists($questsubtopic['id'], $deleteSubtopics)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$title = $subtopicsTitles[$questsubtopic['id']];
|
||||
$subtopicValidation = $this->Validation->validate($title, \nre\configs\AppConfig::$validation['title']);
|
||||
if($subtopicValidation !== true)
|
||||
{
|
||||
if(!is_array($validations['edit-subtopics'])) {
|
||||
$validations['edit-subtopics'] = array();
|
||||
}
|
||||
if(!array_key_exists($questsubtopic['id'], $validations['edit-subtopics']) || !is_array($validations['edit-subtopics'][$questsubtopic['id']])) {
|
||||
$validations['edit-subtopics'][$questsubtopic['id']] = array();
|
||||
}
|
||||
//$validations['edit-subtopics'][$questsubtopic['id']]['title'] = $subtopicValidation;
|
||||
$validations['edit-subtopics'][$questsubtopic['id']] = $this->Validation->addValidationResults($validations['edit-subtopics'][$questsubtopic['id']], 'title', $subtopicValidation);
|
||||
}
|
||||
if($this->Questtopics->questsubtopicTitleExists($questtopic['id'], $title, $questsubtopic['id']))
|
||||
{
|
||||
if(!is_array($validations['edit-subtopics'])) {
|
||||
$validations['edit-subtopics'] = array();
|
||||
}
|
||||
if(!array_key_exists($questsubtopic['id'], $validations['edit-subtopics']) || !is_array($validations['edit-subtopics'][$questsubtopic['id']])) {
|
||||
$validations['edit-subtopics'][$questsubtopic['id']] = array();
|
||||
}
|
||||
$validations['edit-subtopics'][$questsubtopic['id']] = $this->Validation->addValidationResult($validations['edit-subtopics'][$questsubtopic['id']], 'title', 'exist', true);
|
||||
}
|
||||
}
|
||||
|
||||
// Edit and delete
|
||||
if($validations['edit-subtopics'] === true)
|
||||
{
|
||||
foreach($questsubtopics as &$questsubtopic)
|
||||
{
|
||||
// Delete
|
||||
if(!is_null($deleteSubtopics) && array_key_exists($questsubtopic['id'], $deleteSubtopics)) {
|
||||
$this->Questtopics->deleteQuestsubtopic($questsubtopic['id']);
|
||||
}
|
||||
// Edit
|
||||
elseif(!is_null($subtopicsTitles) && array_key_exists($questsubtopic['id'], $subtopicsTitles))
|
||||
{
|
||||
$title = $subtopicsTitles[$questsubtopic['id']];
|
||||
$this->Questtopics->editQuestsubtopic($questsubtopic['id'], $title);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array($seminary['url'], $questtopic['url']), 2));
|
||||
}
|
||||
}
|
||||
|
||||
// Create Questsubtopic
|
||||
elseif(!is_null($this->request->getPostParam('create-subtopic')))
|
||||
{
|
||||
$action = 'create-subtopic';
|
||||
|
||||
// Get params and validate them
|
||||
$validations[$action] = $this->Validation->validateParams($this->request->getPostParams(), array('title'));
|
||||
$subtopicTitle = $this->request->getPostParam('title');
|
||||
if($this->Questtopics->questsubtopicTitleExists($questtopic['id'], $subtopicTitle)) {
|
||||
$validations[$action] = $this->Validation->addValidationResult($validations[$action], 'title', 'exist', true);
|
||||
}
|
||||
|
||||
// Create
|
||||
if($validations[$action] === true)
|
||||
{
|
||||
$this->Questtopics->createQuestsubtopic(
|
||||
$this->Auth->getUserId(),
|
||||
$questtopic['id'],
|
||||
$subtopicTitle
|
||||
);
|
||||
$subtopicTitle = '';
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(null, 4));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array(
|
||||
'title' => \nre\configs\AppConfig::$validation['title']
|
||||
);
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Edit Questtopic');
|
||||
$this->addTitleLocalized('Library');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questtopicTitle', $questtopicTitle);
|
||||
$this->set('subtopicsTitles', $subtopicsTitles);
|
||||
$this->set('deleteSubtopics', $deleteSubtopics);
|
||||
$this->set('subtopicTitle', $subtopicTitle);
|
||||
$this->set('action', $action);
|
||||
$this->set('validations', $validations);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete a Questtopic of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $eminaryUrl URL-Title of Seminary
|
||||
* @param string $questtopicUrl URL-Title of Questtopic
|
||||
*/
|
||||
public function delete($seminaryUrl, $questtopicUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questtopic
|
||||
$questtopic = $this->Questtopics->getQuesttopicByUrl($seminary['id'], $questtopicUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete seminary
|
||||
$this->Questtopics->deleteQuesttopic($questtopic['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(array('index', $seminary['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set title
|
||||
$this->addTitleLocalized('Delete Questtopic');
|
||||
$this->addTitleLocalized('Library');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questtopic', $questtopic);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
136
controllers/MailController.inc
Normal file
136
controllers/MailController.inc
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the MailAgent to generate a mail message.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class MailController extends \nre\core\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
|
||||
// Set linker
|
||||
$this->set('linker', ($request instanceof \hhu\z\requests\MailRequest && !is_null($request->getLinker())) ? $request->getLinker() : null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: userregistration.
|
||||
*
|
||||
* Generate a mail message to notify of a new user registration.
|
||||
*
|
||||
* @param array $receiver User that the message will be send to
|
||||
* @param array $neUser Newly registered user
|
||||
*/
|
||||
public function userregistration($receiver, $newUser)
|
||||
{
|
||||
// Set subject
|
||||
$this->response->setSubject(_('New user registration'));
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('user', $newUser);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: characterregistration.
|
||||
*
|
||||
* Generate a mail message to notify of a new Character
|
||||
* registration.
|
||||
*
|
||||
* @param array $receiver User that the message will be send to
|
||||
* @param array $seminary Seminary which the Character was created for
|
||||
* @param arary $user User of the newly registered Character
|
||||
* @param array $newCharacter Newly registered Character
|
||||
*/
|
||||
public function characterregistration($receiver, $seminary, $user, $newCharacter)
|
||||
{
|
||||
// Set subject
|
||||
$this->response->setSubject(_('New Character registration'));
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('user', $user);
|
||||
$this->set('character', $newCharacter);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: charactersubmission.
|
||||
*
|
||||
* Generate a mail message to notify of a new Character
|
||||
* submission for a Quest that needs to be valuated.
|
||||
*
|
||||
* @param array $receiver User that the message will be send to
|
||||
* @param array $seminary Seminary which the Quest belongs to
|
||||
* @param array $questgroup Questgroup of Quest
|
||||
* @param array $quest Quest the answer has been submitted for
|
||||
* @param array $character Character that send the submission
|
||||
*/
|
||||
public function charactersubmission($receiver, $seminary, $questgroup, $quest, $character)
|
||||
{
|
||||
// Set subject
|
||||
$this->response->setSubject(_('New Character submission'));
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('quest', $quest);
|
||||
$this->set('character', $character);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: charactersubmissionapproved.
|
||||
*
|
||||
* Generate a mail message to notify a Character that its
|
||||
* submission has been approved.
|
||||
*
|
||||
* @param array $receiver User that the message will be send to
|
||||
* @param array $seminary Seminary which the Quest belongs to
|
||||
* @param array $questgroup Questgroup of Quest
|
||||
* @param array $quest Quest the answer has been submitted for
|
||||
*/
|
||||
public function charactersubmissionapproved($receiver, $seminary, $questgroup, $quest)
|
||||
{
|
||||
// Set subject
|
||||
$this->response->setSubject(_('Character submission approved'));
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('quest', $quest);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
39
controllers/MailreceiverController.inc
Normal file
39
controllers/MailreceiverController.inc
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the MailreceiverAgent to generate a mail receiver
|
||||
* salutation.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class MailreceiverController extends \nre\core\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* @param $array $user User receiving mail
|
||||
*/
|
||||
public function index($user)
|
||||
{
|
||||
$this->set('user', $user);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
72
controllers/MapController.inc
Normal file
72
controllers/MapController.inc
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the MapAgent to display a map.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class MapController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'map');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'index' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Draw the map.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of Seminary
|
||||
*/
|
||||
public function index($seminaryUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get map
|
||||
$map = $this->Map->getMapOfSeminary($seminary['id']);
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('map', $map);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
597
controllers/MediaController.inc
Normal file
597
controllers/MediaController.inc
Normal file
|
|
@ -0,0 +1,597 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the MediaAgent to process and show Media.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class MediaController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'seminarymoodpic' => array('admin', 'moderator', 'user'),
|
||||
'seminarymap' => array('admin', 'moderator', 'user'),
|
||||
'seminary' => array('admin', 'moderator', 'user'),
|
||||
'avatar' => array('admin', 'moderator', 'user'),
|
||||
'achievement' => array('admin', 'moderator', 'user'),
|
||||
'charactergroup' => array('admin', 'moderator', 'user'),
|
||||
'charactergroupsquest' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'seminary' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'achievement' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'charactergroup' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'charactergroupsquest' => array('admin', 'moderator', 'user', 'guest')
|
||||
);
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'achievements', 'media', 'avatars', 'charactergroups', 'charactergroupsquests', 'map');
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
// Set headers for caching control
|
||||
$response->addHeader("Pragma: public");
|
||||
$response->addHeader("Cache-control: must-revalidate");
|
||||
$response->addHeader("Date: ".gmdate(\DateTime::RFC822));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: index
|
||||
*
|
||||
* Display a medium.
|
||||
*
|
||||
* @param string $mediaUrl URL-name of the medium
|
||||
* @param string $action Action for processing the media
|
||||
*/
|
||||
public function index($mediaUrl, $action=null)
|
||||
{
|
||||
// Get Media
|
||||
$media = $this->Media->getMediaByUrl($mediaUrl);
|
||||
|
||||
// Get file
|
||||
$file = $this->getMediaFile($media, $action);
|
||||
if(is_null($media)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: seminarymoodpic
|
||||
*
|
||||
* Display the moodpic for a category of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of the Seminary
|
||||
* @param string $category Category to show moodpic of
|
||||
* @param string $action Action for processing the media
|
||||
*/
|
||||
public function seminarymoodpic($seminaryUrl, $category=null, $action=null)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Set index
|
||||
switch($category)
|
||||
{
|
||||
case null:
|
||||
$index = 'seminarymedia_id';
|
||||
break;
|
||||
case 'charactergroups':
|
||||
$index = 'charactergroups_seminarymedia_id';
|
||||
break;
|
||||
case 'achievements':
|
||||
$index = 'achievements_seminarymedia_id';
|
||||
break;
|
||||
case 'library':
|
||||
$index = 'library_seminarymedia_id';
|
||||
break;
|
||||
}
|
||||
|
||||
// Get media
|
||||
$media = $this->Media->getSeminaryMediaById($seminary[$index]);
|
||||
|
||||
// Get file
|
||||
$file = $this->getMediaFile($media, $action);
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: seminarymap
|
||||
*
|
||||
* Display the map of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of the Seminary
|
||||
*/
|
||||
public function seminarymap($seminaryUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get map
|
||||
$map = $this->Map->getMapOfSeminary($seminary['id']);
|
||||
if(is_null($map)) {
|
||||
throw new \nre\exceptions\IdNotFoundException($seminaryUrl);
|
||||
}
|
||||
|
||||
// Get media
|
||||
$media = $this->Media->getSeminaryMediaById($map['seminarymedia_id']);
|
||||
|
||||
// Get file
|
||||
$file = $this->getMediaFile($media);
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: seminary.
|
||||
*
|
||||
* Display a Seminary medium.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of the Seminary
|
||||
* @param string $mediaUrl URL-name of the medium
|
||||
* @param string $action Action for processing the media
|
||||
*/
|
||||
public function seminary($seminaryUrl, $mediaUrl, $action=null)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Media
|
||||
$media = $this->Media->getSeminaryMediaByUrl($seminary['id'], $mediaUrl);
|
||||
|
||||
// Get file
|
||||
$file = $this->getMediaFile($media, $action);
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: avatar.
|
||||
*
|
||||
* Display an Avatar as full size or portrait.
|
||||
*
|
||||
* @throws \nre\exceptions\ParamsNotValidException
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of the Seminary
|
||||
* @param string $charactertypeUrl URL-title of Character type
|
||||
* @param int $xplevel XP-level
|
||||
* @param string $action Size to show (avatar or portrait)
|
||||
*/
|
||||
public function avatar($seminaryUrl, $charactertypeUrl, $xplevel, $action='avatar')
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Avatar
|
||||
$avatar = $this->Avatars->getAvatarByTypeAndLevel($seminary['id'], $charactertypeUrl, $xplevel);
|
||||
|
||||
// Get media
|
||||
switch($action)
|
||||
{
|
||||
case null:
|
||||
case 'avatar':
|
||||
$media = $this->Media->getSeminaryMediaById($avatar['avatarpicture_id']);
|
||||
$file = $this->getMediaFile($media, 'avatar');
|
||||
break;
|
||||
case 'portrait':
|
||||
$media = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']);
|
||||
$file = $this->getMediaFile($media);
|
||||
break;
|
||||
default:
|
||||
throw new \nre\exceptions\ParamsNotValidException($action);
|
||||
break;
|
||||
}
|
||||
|
||||
// Get file
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: achievement
|
||||
*
|
||||
* Display the achievement of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of the Seminary
|
||||
* @param string $achievementUrl URL-title of the Achievement
|
||||
* @param string $action Action for processing the media
|
||||
*/
|
||||
public function achievement($seminaryUrl, $achievementUrl, $locked=null)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character
|
||||
$character = SeminaryController::$character;
|
||||
|
||||
// Get Achievement
|
||||
$achievement = $this->Achievements->getAchievementByUrl($seminary['id'], $achievementUrl);
|
||||
|
||||
// Get media
|
||||
switch($locked)
|
||||
{
|
||||
case null:
|
||||
if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\SeminaryController::$character['characterroles'])) == 0) {
|
||||
if(is_null($character) || !$this->Achievements->hasCharacterAchievedAchievement($achievement['id'], $character['id'])) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
}
|
||||
$index = 'achieved_achievementsmedia_id';
|
||||
break;
|
||||
case 'locked':
|
||||
$index = 'unachieved_achievementsmedia_id';
|
||||
break;
|
||||
default:
|
||||
throw new \nre\exceptions\ParamsNotValidException($locked);
|
||||
break;
|
||||
}
|
||||
if(is_null($achievement[$index])) {
|
||||
throw new \nre\exceptions\IdNotFoundException($achievementUrl);
|
||||
}
|
||||
$media = $this->Media->getSeminaryMediaById($achievement[$index]);
|
||||
|
||||
// Get file
|
||||
$file = $this->getMediaFile($media, null);
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: charactergroup
|
||||
*
|
||||
* Display the icon for a Character group of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $groupUrl URL-Title of a Character group
|
||||
*/
|
||||
public function charactergroup($seminaryUrl, $groupsgroupUrl, $groupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character group
|
||||
$group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl);
|
||||
|
||||
// Check media
|
||||
if(is_null($group['charactergroupsmedia_id'])) {
|
||||
$this->redirect($this->linker->link(array('grafics','charactergroup.jpg')));
|
||||
}
|
||||
|
||||
// Get media
|
||||
$media = $this->Media->getSeminaryMediaById($group['charactergroupsmedia_id']);
|
||||
|
||||
// Get file
|
||||
$file = $this->getMediaFile($media, 'charactergroup');
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: charactergroupsquest
|
||||
*
|
||||
* Display the icon for a Character groups Quest of a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $questUrl URL-Title of a Character groups Quest
|
||||
*/
|
||||
public function charactergroupsquest($seminaryUrl, $groupsgroupUrl, $questUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character groups Quests
|
||||
$quest = $this->Charactergroupsquests->getQuestByUrl($groupsgroup['id'], $questUrl);
|
||||
|
||||
// Check media
|
||||
if(is_null($quest['questsmedia_id'])) {
|
||||
$this->redirect($this->linker->link(array('grafics','charactergroup.jpg')));
|
||||
}
|
||||
|
||||
// Get media
|
||||
$media = $this->Media->getSeminaryMediaById($quest['questsmedia_id']);
|
||||
|
||||
// Get file
|
||||
$file = $this->getMediaFile($media, 'charactergroupsquest');
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('media', $media);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Determine file information and set the HTTP-header for
|
||||
* caching accordingly.
|
||||
*
|
||||
* @param string $fileName Filename
|
||||
* @return boolean HTTP-status 304 was set (in cache)
|
||||
*/
|
||||
private function setCacheHeaders($fileName)
|
||||
{
|
||||
// Determine last change of file
|
||||
$fileLastModified = gmdate('r', filemtime($fileName));
|
||||
|
||||
// Generate E-Tag
|
||||
$fileEtag = hash('sha256', $fileLastModified.$fileName);
|
||||
|
||||
|
||||
// Set header
|
||||
$this->response->addHeader("Last-Modified: ".$fileLastModified);
|
||||
$this->response->addHeader("Etag: ".$fileEtag);
|
||||
// HTTP-status
|
||||
$headerModifiedSince = $this->request->getServerParam('HTTP_IF_MODIFIED_SINCE');
|
||||
$headerNoneMatch = $this->request->getServerParam('HTTP_IF_NONE_MATCH');
|
||||
if(
|
||||
!is_null($headerModifiedSince) && strtotime($fileLastModified) <= strtotime($headerModifiedSince) &&
|
||||
!is_null($headerNoneMatch) && $headerNoneMatch == $fileEtag
|
||||
) {
|
||||
$this->response->setExit(true);
|
||||
$this->response->addHeader(\nre\core\WebUtils::getHttpHeader(304));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine the file for a medium and process it if necessary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @throws \nre\exceptions\ParamsNotValidException
|
||||
* @param array $media Medium to get file for
|
||||
* @param string $action Action for processing the media
|
||||
* @return object File for the medium (or null if medium is cached)
|
||||
*/
|
||||
private function getMediaFile($media, $action=null)
|
||||
{
|
||||
// Get format
|
||||
$format = explode('/', $media['mimetype']);
|
||||
$format = $format[1];
|
||||
|
||||
// Set content-type
|
||||
$this->response->addHeader("Content-type: ".$media['mimetype']."");
|
||||
|
||||
// Set filename
|
||||
$media['filename'] = ROOT.DS.\nre\configs\AppConfig::$dirs['seminarymedia'].DS.$media['id'];
|
||||
if(!file_exists($media['filename'])) {
|
||||
throw new \nre\exceptions\IdNotFoundException($media['id'].': '.$media['url']);
|
||||
}
|
||||
|
||||
// Cache
|
||||
if($this->setCacheHeaders($media['filename'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Load and process file
|
||||
$file = null;
|
||||
switch($action)
|
||||
{
|
||||
// No action
|
||||
case null:
|
||||
// Do not process the file
|
||||
$file = file_get_contents($media['filename']);
|
||||
break;
|
||||
case 'questgroup':
|
||||
if(!in_array(strtoupper($format), self::getImageTypes())) {
|
||||
$file = file_get_contents($media['filename']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$file = self::resizeImage(
|
||||
$media['filename'],
|
||||
$format,
|
||||
\nre\configs\AppConfig::$media['questgroup']['width'],
|
||||
\nre\configs\AppConfig::$media['questgroup']['height']
|
||||
);
|
||||
}
|
||||
break;
|
||||
case 'avatar':
|
||||
$file = self::resizeImage(
|
||||
$media['filename'],
|
||||
$format,
|
||||
\nre\configs\AppConfig::$media['avatar']['width'],
|
||||
\nre\configs\AppConfig::$media['avatar']['height']
|
||||
);
|
||||
break;
|
||||
case 'charactergroup':
|
||||
$file = self::resizeImage(
|
||||
$media['filename'],
|
||||
$format,
|
||||
\nre\configs\AppConfig::$media['charactergroup']['width'],
|
||||
\nre\configs\AppConfig::$media['charactergroup']['height']
|
||||
);
|
||||
break;
|
||||
case 'charactergroupsquest':
|
||||
$file = self::resizeImage(
|
||||
$media['filename'],
|
||||
$format,
|
||||
\nre\configs\AppConfig::$media['charactergroupsquest']['width'],
|
||||
\nre\configs\AppConfig::$media['charactergroupsquest']['height']
|
||||
);
|
||||
break;
|
||||
default:
|
||||
throw new ParamsNotValidException($action);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Return file
|
||||
return $file;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get supported image types.
|
||||
*
|
||||
* @return array List of supported image types
|
||||
*/
|
||||
private static function getImageTypes()
|
||||
{
|
||||
$im = new \Imagick();
|
||||
|
||||
|
||||
return $im->queryFormats();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resize an image.
|
||||
*
|
||||
* @param string $fileName Absolute pathname of image to resize
|
||||
* @param string $mimeType Mimetype of target image
|
||||
* @param int $width Max. width to resize to
|
||||
* @param int $height Max. height to resize to
|
||||
* @return mixed Resized image
|
||||
*/
|
||||
private static function resizeImage($fileName, $mimeType, $width, $height)
|
||||
{
|
||||
// Read image from cache
|
||||
$tempFileName = ROOT.DS.\nre\configs\AppConfig::$dirs['temporary'].DS.'media-'.basename($fileName).'-'.$width.'x'.$height;
|
||||
if(file_exists($tempFileName))
|
||||
{
|
||||
// Check age of file
|
||||
if(filemtime($fileName) > filemtime($tempFileName)) {
|
||||
// Too old, delete
|
||||
unlink($tempFileName);
|
||||
}
|
||||
else {
|
||||
// Valid, read and return
|
||||
return file_get_contents($tempFileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ImageMagick
|
||||
$im = new \Imagick($fileName);
|
||||
|
||||
// Calculate new size
|
||||
$geometry = $im->getImageGeometry();
|
||||
if($geometry['width'] < $width) {
|
||||
$width = $geometry['width'];
|
||||
}
|
||||
if($geometry['height'] < $height) {
|
||||
$height = $geometry['width'];
|
||||
}
|
||||
|
||||
// Process
|
||||
$im->thumbnailImage($width, $height, true);
|
||||
$im->contrastImage(1);
|
||||
$im->setImageFormat($mimeType);
|
||||
|
||||
// Save temporary file
|
||||
$im->writeImage($tempFileName);
|
||||
|
||||
|
||||
// Return resized image
|
||||
return $im;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
52
controllers/MenuController.inc
Normal file
52
controllers/MenuController.inc
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to display a menu.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class MenuController extends \hhu\z\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
// Set userdata
|
||||
$this->set('loggedUser', IntermediateController::$user);
|
||||
$this->set('loggedCharacter', SeminaryController::$character);
|
||||
$this->set('loggedSeminary', SeminaryController::$seminary);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
757
controllers/QuestgroupsController.inc
Normal file
757
controllers/QuestgroupsController.inc
Normal file
|
|
@ -0,0 +1,757 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the QuestgroupsAgent to display Questgroups.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class QuestgroupsController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'questgroupshierarchy', 'questgroups', 'questgrouptexts', 'quests', 'questtexts', 'media');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'questgroup' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin', 'moderator', 'user'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'edittexts' => array('admin', 'moderator', 'user'),
|
||||
'moveup' => array('admin', 'moderator', 'user'),
|
||||
'movedown' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'questgroup' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin'),
|
||||
'edit' => array('admin', 'moderator'),
|
||||
'edittexts' => array('admin', 'moderator'),
|
||||
'moveup' => array('admin'),
|
||||
'movedown' => array('admin'),
|
||||
'delete' => array('admin')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: questgroup.
|
||||
*
|
||||
* Display a Questgroup and its data.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $questgroupUrl URL-Title of a Questgroup
|
||||
*/
|
||||
public function questgroup($seminaryUrl, $questgroupUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl);
|
||||
|
||||
// Get Questgrouphierarchy
|
||||
$questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']);
|
||||
|
||||
// Get Character
|
||||
$character = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']);
|
||||
|
||||
// Check permission
|
||||
if(count(array_intersect(array('admin','moderator'), SeminaryController::$character['characterroles'])) == 0)
|
||||
{
|
||||
// Only check permissions if Character has not entered Quest before
|
||||
if(!$this->Questgroups->hasCharacterEnteredQuestgroup($questgroup['id'], $character['id']))
|
||||
{
|
||||
$previousQuestgroup = $this->Questgroups->getPreviousQuestgroup($seminary['id'], $questgroup['id']);
|
||||
if(!is_null($previousQuestgroup)) {
|
||||
if(!$this->Questgroups->hasCharacterSolvedQuestgroup($previousQuestgroup['id'], $character['id'])) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set status “entered”
|
||||
$this->Questgroups->setQuestgroupEntered($questgroup['id'], $character['id']);
|
||||
|
||||
// Get child Questgroupshierarchy
|
||||
$childQuestgroupshierarchy = null;
|
||||
if(!empty($questgroup['hierarchy']))
|
||||
{
|
||||
$childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroup['hierarchy']['id']);
|
||||
foreach($childQuestgroupshierarchy as &$hierarchy)
|
||||
{
|
||||
// Get Questgroups
|
||||
$hierarchy['questgroups'] = $this->Questgroups->getQuestgroupsForHierarchy($hierarchy['id'], $questgroup['id']);
|
||||
|
||||
// Get additional data
|
||||
foreach($hierarchy['questgroups'] as $i => &$group)
|
||||
{
|
||||
$group['solved'] = $this->Questgroups->hasCharacterSolvedQuestgroup($group['id'], $character['id']);
|
||||
|
||||
// Check permission of Questgroups
|
||||
if($i >= 1 && count(array_intersect(array('admin','moderator'), SeminaryController::$character['characterroles'])) == 0)
|
||||
{
|
||||
if(!$hierarchy['questgroups'][$i-1]['solved'])
|
||||
{
|
||||
$hierarchy['questgroups'] = array_slice($hierarchy['questgroups'], 0, $i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Get Character XPs
|
||||
$group['character_xps'] = $this->Questgroups->getAchievedXPsForQuestgroup($group['id'], $character['id']);
|
||||
|
||||
// Attach related Questgroups
|
||||
$group['relatedQuestgroups'] = array();
|
||||
$relatedQuestgroups = $this->Questgroups->getRelatedQuestsgroupsOfQuestgroup($group['id']);
|
||||
foreach($relatedQuestgroups as &$relatedQuestgroup) {
|
||||
if($this->Questgroups->hasCharacterEnteredQuestgroup($relatedQuestgroup['id'], $character['id'])) {
|
||||
$group['relatedQuestgroups'][] = $this->Questgroups->getQuestgroupById($relatedQuestgroup['id']);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get texts
|
||||
$questgroupTexts = $this->Questgrouptexts->getQuestgroupTexts($questgroup['id']);
|
||||
|
||||
// Media
|
||||
$picture = null;
|
||||
if(!is_null($questgroup['questgroupspicture_id']))
|
||||
{
|
||||
$picture = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']);
|
||||
}
|
||||
|
||||
|
||||
// Get Quests
|
||||
$quests = array();
|
||||
if(count($childQuestgroupshierarchy) == 0)
|
||||
{
|
||||
$currentQuest = null;
|
||||
do {
|
||||
// Get next Quest
|
||||
if(is_null($currentQuest)) {
|
||||
$currentQuest = $this->Quests->getFirstQuestOfQuestgroup($questgroup['id']);
|
||||
}
|
||||
else {
|
||||
$nextQuests = $this->Quests->getNextQuests($currentQuest['id']);
|
||||
$currentQuest = null;
|
||||
foreach($nextQuests as &$nextQuest) {
|
||||
if($this->Quests->hasCharacterEnteredQuest($nextQuest['id'], $character['id'])) {
|
||||
$currentQuest = $nextQuest;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add additional data
|
||||
if(!is_null($currentQuest))
|
||||
{
|
||||
// Set status
|
||||
$currentQuest['solved'] = $this->Quests->hasCharacterSolvedQuest($currentQuest['id'], $character['id']);
|
||||
|
||||
// Attach related Questgroups
|
||||
$currentQuest['relatedQuestgroups'] = array();
|
||||
$relatedQuestgroups = $this->Questgroups->getRelatedQuestsgroupsOfQuest($currentQuest['id']);
|
||||
foreach($relatedQuestgroups as &$relatedQuestgroup)
|
||||
{
|
||||
if($this->Questgroups->hasCharacterEnteredQuestgroup($relatedQuestgroup['id'], $character['id'])) {
|
||||
$currentQuest['relatedQuestgroups'][] = $this->Questgroups->getQuestgroupById($relatedQuestgroup['id']);
|
||||
}
|
||||
}
|
||||
|
||||
// Add Quest to Quests
|
||||
$quests[] = $currentQuest;
|
||||
}
|
||||
}
|
||||
while(!is_null($currentQuest) && ($currentQuest['solved'] || count(array_intersect(array('admin','moderator'), SeminaryController::$character['characterroles'])) > 0));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
if(!is_null($questgroup['hierarchy'])) {
|
||||
$this->addTitle(sprintf('%s %d: %s', $questgroup['hierarchy']['title_singular'], $questgroup['hierarchy']['questgroup_pos'], $questgroup['title']));
|
||||
}
|
||||
else {
|
||||
$this->addTitle($questgroup['title']);
|
||||
}
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('childquestgroupshierarchy', $childQuestgroupshierarchy);
|
||||
$this->set('texts', $questgroupTexts);
|
||||
$this->set('picture', $picture);
|
||||
$this->set('quests', $quests);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create a new Questgroup.
|
||||
*
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function create($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
|
||||
|
||||
// Values
|
||||
$selectedQuestgroupshierarchy = null;
|
||||
$selectedQuestgroup = null;
|
||||
$title = '';
|
||||
$fields = array('title');
|
||||
$validation = array();
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Questgroups->questgroupTitleExists($seminary['id'], $title)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
|
||||
// Validate Questgroupshierarchy
|
||||
try {
|
||||
$selectedQuestgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $this->request->getPostParam('questgroupshierarchy'));
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($this->request->getPostParam('questgroupshierarchy'));
|
||||
}
|
||||
|
||||
// Validate Questgroup
|
||||
if(!is_null($selectedQuestgroupshierarchy['parent_questgroupshierarchy_id'])) {
|
||||
try {
|
||||
$selectedQuestgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $this->request->getPostParam('questgroup'));
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($this->request->getPostParam('questgroups'));
|
||||
}
|
||||
}
|
||||
|
||||
// Validate moodpic
|
||||
$moodpic = null;
|
||||
if(!empty($_FILES) && array_key_exists('moodpic', $_FILES) && $_FILES['moodpic']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$moodpic = $_FILES['moodpic'];
|
||||
|
||||
// Check error
|
||||
if($moodpic['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'error', $moodpic['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$moodpic['mimetype'] = \hhu\z\Utils::getMimetype($moodpic['tmp_name'], $moodpic['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $moodpic['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'mimetype', $moodpic['mimetype']);
|
||||
}
|
||||
elseif($moodpic['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Create new Questgroup
|
||||
if($validation === true)
|
||||
{
|
||||
$questgroupId = $this->Questgroups->createQuestgroup(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$title
|
||||
);
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($questgroupId);
|
||||
|
||||
// Add to Hierarchy
|
||||
$this->Questgroups->addQuestgroupToHierarchy(
|
||||
$questgroupId,
|
||||
$selectedQuestgroupshierarchy['id'],
|
||||
(!is_null($selectedQuestgroup)) ? $selectedQuestgroup['id'] : null
|
||||
);
|
||||
|
||||
// Upload moodpic
|
||||
if(!is_null($moodpic))
|
||||
{
|
||||
$mediaId = $this->Media->createQuestgrouppicture(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$questgroup['id'],
|
||||
sprintf('questgroupmoodpic-%s', $questgroup['url']),
|
||||
'',
|
||||
$moodpic['mimetype'],
|
||||
$moodpic['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Questgroups->setMoodpicForQuestgroup($questgroup['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Redirect to new Questgroup
|
||||
$this->redirect($this->linker->link(array('questgroup', $seminary['url'], $questgroup['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Create Questgroup');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('questgroupshierarchy', $selectedQuestgroupshierarchy);
|
||||
$this->set('questgroup', $selectedQuestgroup);
|
||||
$this->set('title', $title);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit a Questgroup.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of a Seminary
|
||||
* @param string $questgroupUrl URL-title of Questgroup to edit
|
||||
*/
|
||||
public function edit($seminaryUrl, $questgroupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl);
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
|
||||
|
||||
// Values
|
||||
$title = $questgroup['title'];
|
||||
$fields = array('title');
|
||||
$validation = array();
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Questgroups->questgroupTitleExists($seminary['id'], $title, $questgroup['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
|
||||
// Validate moodpic
|
||||
$moodpic = null;
|
||||
if(!empty($_FILES) && array_key_exists('moodpic', $_FILES) && $_FILES['moodpic']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$moodpic = $_FILES['moodpic'];
|
||||
|
||||
// Check error
|
||||
if($moodpic['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'error', $moodpic['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$moodpic['mimetype'] = \hhu\z\Utils::getMimetype($moodpic['tmp_name'], $moodpic['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $moodpic['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'mimetype', $moodpic['mimetype']);
|
||||
}
|
||||
elseif($moodpic['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Edit Questgroup
|
||||
if($validation === true)
|
||||
{
|
||||
$this->Questgroups->editQuestgroup(
|
||||
$questgroup['id'],
|
||||
$title
|
||||
);
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($questgroup['id']);
|
||||
|
||||
// Upload moodpic
|
||||
if(!is_null($moodpic))
|
||||
{
|
||||
$mediaId = $this->Media->createQuestgrouppicture(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$questgroup['id'],
|
||||
sprintf('questgroupmoodpic-%s', $questgroup['url']),
|
||||
'',
|
||||
$moodpic['mimetype'],
|
||||
$moodpic['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Questgroups->setMoodpicForQuestgroup($questgroup['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Redirect to new 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']);
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Edit Questgroup');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('picture', $picture);
|
||||
$this->set('title', $title);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edittexts.
|
||||
*
|
||||
* Edit the texts of a Questgroup.
|
||||
*
|
||||
* @throws \nre\exceptions\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.
|
||||
*
|
||||
* Move a Questgroup up (decrement position).
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $questgroupUrl URL-title of Questgroup
|
||||
*/
|
||||
public function moveup($seminaryUrl, $questgroupUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl);
|
||||
$questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('move')))
|
||||
{
|
||||
// Set position
|
||||
$this->Questgroups->moveQuestgroup($questgroup, true);
|
||||
}
|
||||
|
||||
// Redirect
|
||||
$referer = $this->request->getGetParam('referer');
|
||||
if(!is_null($referer))
|
||||
{
|
||||
try {
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($referer);
|
||||
$this->redirect($this->linker->link(array('questgroups', 'questgroup', $seminary['url'], $questgroup['url'])));
|
||||
}
|
||||
catch(IdNotFoundException $e) {
|
||||
}
|
||||
}
|
||||
$this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
|
||||
// Media
|
||||
$picture = null;
|
||||
if(!is_null($questgroup['questgroupspicture_id'])) {
|
||||
$picture = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']);
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Move Questgroup');
|
||||
|
||||
// Show confirmation
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('picture', $picture);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: movedown
|
||||
*
|
||||
* Move a Questgroup down (increment position).
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $questgroupUrl URL-title of Questgroup
|
||||
*/
|
||||
public function movedown($seminaryUrl, $questgroupUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl);
|
||||
$questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('move')))
|
||||
{
|
||||
// Set position
|
||||
$this->Questgroups->moveQuestgroup($questgroup, false);
|
||||
}
|
||||
|
||||
// Redirect
|
||||
$referer = $this->request->getGetParam('referer');
|
||||
if(!is_null($referer))
|
||||
{
|
||||
try {
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($referer);
|
||||
$this->redirect($this->linker->link(array('questgroups', 'questgroup', $seminary['url'], $questgroup['url'])));
|
||||
}
|
||||
catch(IdNotFoundException $e) {
|
||||
}
|
||||
}
|
||||
$this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
|
||||
// Media
|
||||
$picture = null;
|
||||
if(!is_null($questgroup['questgroupspicture_id'])) {
|
||||
$picture = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']);
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Move Questgroup');
|
||||
|
||||
// Show confirmation
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('picture', $picture);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete a Questgroup.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $questgroupUrl URL-Title of a Questgroup
|
||||
*/
|
||||
public function delete($seminaryUrl, $questgroupUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl);
|
||||
|
||||
// Get Questgrouphierarchy
|
||||
$questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete Questgroup
|
||||
$this->Questgroups->deleteQuestgroup($questgroup['id']);
|
||||
|
||||
// Redirect
|
||||
if(!is_null($questgroup['hierarchy']))
|
||||
{
|
||||
// Parent Questgroup
|
||||
if(is_null($questgroup['hierarchy']['parent_questgroup_id'])) {
|
||||
$this->redirect($this->linker->link(array('simenaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
else
|
||||
{
|
||||
$parentQuestgroup = $this->Questgroups->getQuestgroupById($questgroup['hierarchy']['parent_questgroup_id']);
|
||||
$this->redirect($this->linker->link(array('questgroup', $seminary['url'], $parentQuestgroup['url']), 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Related Questgroup
|
||||
$questtexts = $this->Questtexts->getRelatedQuesttextsForQuestgroup($questgroup['id']);
|
||||
$questtext = $this->Questtexts->pickQuesttextLastEnteredByCharacter(\hhu\z\controllers\SeminaryController::$character['id'], $questtexts);
|
||||
$quest = $this->Quests->getQuestById($questtext['quest_id']);
|
||||
$relatedQuestgroup = $this->Questgroups->getQuestgroupById($quest['questgroup_id']);
|
||||
$this->redirect($this->linker->link(array('questgroup', $seminary['url'], $relatedQuestgroup['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$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('Delete Questgroup');
|
||||
|
||||
// Show confirmation
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroup', $questgroup);
|
||||
$this->set('picture', $picture);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
346
controllers/QuestgroupshierarchyController.inc
Normal file
346
controllers/QuestgroupshierarchyController.inc
Normal file
|
|
@ -0,0 +1,346 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the QuestgroupsAgent to display Questgroups.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class QuestgroupshierarchyController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'questgroupshierarchy', 'questgroups');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'create' => array('admin', 'moderator', 'user'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'moveup' => array('admin', 'moderator', 'user'),
|
||||
'movedown' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'create' => array('admin'),
|
||||
'edit' => array('admin'),
|
||||
'moveup' => array('admin'),
|
||||
'movedown' => array('admin'),
|
||||
'delete' => array('admin')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create a new Questgroupshierarchy.
|
||||
*
|
||||
* @param string $seminaryUrl URL-title of a Seminary
|
||||
*/
|
||||
public function create($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get parent Questgroupshierarchy
|
||||
$parentQuestgroupshierarchy = $this->Questgroupshierarchy->getHierarchyOfSeminary($seminary['id']);
|
||||
|
||||
// Values
|
||||
$titleSingular = '';
|
||||
$titlePlural = '';
|
||||
$validation = array();
|
||||
|
||||
// Create Questgroupshierarchy
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$titleSingular = $this->request->getPostParam('title_singular');
|
||||
$validation = $this->Validation->addValidationResults(
|
||||
$validation,
|
||||
'titleSingular',
|
||||
$this->Validation->validate($titleSingular, \nre\configs\AppConfig::$validation['questgroupshierarchytitle'])
|
||||
);
|
||||
if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titleSingular, $seminary['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'titleSingular', 'exist', true);
|
||||
}
|
||||
$titlePlural = $this->request->getPostParam('title_plural');
|
||||
$validation = $this->Validation->addValidationResults(
|
||||
$validation,
|
||||
'titlePlural',
|
||||
$this->Validation->validate($titlePlural, \nre\configs\AppConfig::$validation['questgroupshierarchytitle'])
|
||||
);
|
||||
if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titlePlural, $seminary['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'titlePlural', 'exist', true);
|
||||
}
|
||||
|
||||
// Validate parent Questgroupshierarchy
|
||||
$parentQuestgroupshierarchyIndex = null;
|
||||
foreach($parentQuestgroupshierarchy as $index => &$parentHierarchy)
|
||||
{
|
||||
$parentHierarchy['selected'] = ($parentHierarchy['url'] == $this->request->getPostParam('parent'));
|
||||
if($parentHierarchy['selected']) {
|
||||
$parentQuestgroupshierarchyIndex = $index;
|
||||
}
|
||||
}
|
||||
|
||||
// Create new Questgroupshierarchy
|
||||
if($validation === true)
|
||||
{
|
||||
$questgroupshierarchyId = $this->Questgroupshierarchy->createQuestgroupshierarchy(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
(!is_null($parentQuestgroupshierarchyIndex) ? $parentQuestgroupshierarchy[$parentQuestgroupshierarchyIndex]['id'] : null),
|
||||
$titleSingular,
|
||||
$titlePlural
|
||||
);
|
||||
$questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyById($questgroupshierarchyId);
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array(
|
||||
'title' => \nre\configs\AppConfig::$validation['title']
|
||||
);
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Create Questgroupshierarchy');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('titleSingular', $titleSingular);
|
||||
$this->set('titlePlural', $titlePlural);
|
||||
$this->set('parentQuestgroupshierarchy', $parentQuestgroupshierarchy);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit a Questgroupshierarchy.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy
|
||||
*/
|
||||
public function edit($seminaryUrl, $questgroupshierarchyUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroupshierarchy
|
||||
$questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl);
|
||||
|
||||
// Values
|
||||
$titleSingular = $questgroupshierarchy['title_singular'];
|
||||
$titlePlural = $questgroupshierarchy['title_plural'];
|
||||
$validation = array();
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$titleSingular = $this->request->getPostParam('title_singular');
|
||||
$validation = $this->Validation->addValidationResults(
|
||||
$validation,
|
||||
'titleSingular',
|
||||
$this->Validation->validate($titleSingular, \nre\configs\AppConfig::$validation['questgroupshierarchytitle'])
|
||||
);
|
||||
if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titleSingular, $seminary['id'], $questgroupshierarchy['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'titleSingular', 'exist', true);
|
||||
}
|
||||
$titlePlural = $this->request->getPostParam('title_plural');
|
||||
$validation = $this->Validation->addValidationResults(
|
||||
$validation,
|
||||
'titlePlural',
|
||||
$this->Validation->validate($titlePlural, \nre\configs\AppConfig::$validation['questgroupshierarchytitle'])
|
||||
);
|
||||
if($this->Questgroupshierarchy->questgroupshierarchyTitleSingularExists($titlePlural, $seminary['id'], $questgroupshierarchy['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'titlePlural', 'exist', true);
|
||||
}
|
||||
|
||||
|
||||
// Edit Questgroup
|
||||
if($validation === true)
|
||||
{
|
||||
$this->Questgroupshierarchy->editQuestgroupshierarchy(
|
||||
$questgroupshierarchy['id'],
|
||||
$titleSingular,
|
||||
$titlePlural
|
||||
);
|
||||
$questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyById($questgroupshierarchy['id']);
|
||||
|
||||
// Redirect to Seminary page
|
||||
$this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array(
|
||||
'title' => \nre\configs\AppConfig::$validation['title']
|
||||
);
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Edit Questgroupshierarchy');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('titleSingular', $titleSingular);
|
||||
$this->set('titlePlural', $titlePlural);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: moveup.
|
||||
*
|
||||
* Move a Questgroupshierarchy up (decrement position).
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy
|
||||
*/
|
||||
public function moveup($seminaryUrl, $questgroupshierarchyUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroupshierarchy
|
||||
$questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl);
|
||||
|
||||
// Set position
|
||||
$this->Questgroupshierarchy->moveQuestgroupshierarchy($questgroupshierarchy, true);
|
||||
|
||||
|
||||
// Redirect
|
||||
$referer = $this->request->getGetParam('referer');
|
||||
if(!is_null($referer))
|
||||
{
|
||||
try {
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($referer);
|
||||
$this->redirect($this->linker->link(array('questgroups', 'questgroup', $seminary['url'], $questgroup['url'])));
|
||||
}
|
||||
catch(IdNotFoundException $e) {
|
||||
}
|
||||
}
|
||||
$this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: movedown.
|
||||
*
|
||||
* Move a Questgroupshierarchy down (increment position).
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy
|
||||
*/
|
||||
public function movedown($seminaryUrl, $questgroupshierarchyUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroupshierarchy
|
||||
$questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl);
|
||||
|
||||
// Set position
|
||||
$this->Questgroupshierarchy->moveQuestgroupshierarchy($questgroupshierarchy, false);
|
||||
|
||||
|
||||
// Redirect
|
||||
$referer = $this->request->getGetParam('referer');
|
||||
if(!is_null($referer))
|
||||
{
|
||||
try {
|
||||
$questgroup = $this->Questgroups->getQuestgroupById($referer);
|
||||
$this->redirect($this->linker->link(array('questgroups', 'questgroup', $seminary['url'], $questgroup['url'])));
|
||||
}
|
||||
catch(IdNotFoundException $e) {
|
||||
}
|
||||
}
|
||||
$this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete a Questgroupshierarchy.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $questgroupshierarchyUrl URL-title of Questgroupshierarchy
|
||||
*/
|
||||
public function delete($seminaryUrl, $questgroupshierarchyUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroupshierarchy
|
||||
$questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyByUrl($seminary['id'], $questgroupshierarchyUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete Questgroupshierarchy
|
||||
$this->Questgroupshierarchy->deleteQuestgroupshierarchy($questgroupshierarchy['id']);
|
||||
}
|
||||
|
||||
// Redirect to Seminary page
|
||||
$this->redirect($this->linker->link(array('seminaries', 'seminary', $seminary['url'])));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Delete Questgroupshierarchy');
|
||||
|
||||
// Show confirmation
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroupshierarchy', $questgroupshierarchy);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
91
controllers/QuestgroupshierarchypathController.inc
Normal file
91
controllers/QuestgroupshierarchypathController.inc
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of QuestgroupshierarchypathAgent to display the
|
||||
* Questgroups hierarchy path.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class QuestgroupshierarchypathController extends \hhu\z\Controller
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('seminaries', 'questgroups', 'questgroupshierarchy', 'quests', 'questtexts');
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Calculate and show the hierarchy path of a Questgroup.
|
||||
*
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $questgroupUrl URL-Title of a Questgroup
|
||||
* @param boolean $showGroup Show the current group itself
|
||||
*/
|
||||
public function index($seminaryUrl, $questgroupUrl, $showGroup=false)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Questgroup
|
||||
$questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl);
|
||||
$questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']);
|
||||
|
||||
// Get parent Questgrouphierarchy
|
||||
$currentQuestgroup = $questgroup;
|
||||
$parentQuestgroupshierarchy = array();
|
||||
if($showGroup) {
|
||||
array_unshift($parentQuestgroupshierarchy, $currentQuestgroup);
|
||||
}
|
||||
if(is_null($questgroup['hierarchy']))
|
||||
{
|
||||
// Get related Questgroup
|
||||
$questtexts = $this->Questtexts->getRelatedQuesttextsForQuestgroup($currentQuestgroup['id']);
|
||||
$questtext = $this->Questtexts->pickQuesttextLastEnteredByCharacter(\hhu\z\controllers\SeminaryController::$character['id'], $questtexts);
|
||||
$quest = $this->Quests->getQuestById($questtext['quest_id']);
|
||||
$currentQuestgroup = $this->Questgroups->getQuestgroupById($quest['questgroup_id']);
|
||||
$currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($currentQuestgroup['id']);
|
||||
$quest['questgroup'] = $currentQuestgroup;
|
||||
|
||||
// Use Hierarchy name for optional Questgroup
|
||||
if(!empty($parentQuestgroupshierarchy)) {
|
||||
$parentQuestgroupshierarchy[0]['hierarchy'] = $currentQuestgroup['hierarchy'];
|
||||
unset($parentQuestgroupshierarchy[0]['hierarchy']['questgroup_pos']);
|
||||
}
|
||||
|
||||
array_unshift($parentQuestgroupshierarchy, $quest);
|
||||
array_unshift($parentQuestgroupshierarchy, $currentQuestgroup);
|
||||
}
|
||||
while(!empty($currentQuestgroup['hierarchy']) && !is_null($currentQuestgroup['hierarchy']['parent_questgroup_id']))
|
||||
{
|
||||
$currentQuestgroup = $this->Questgroups->GetQuestgroupById($currentQuestgroup['hierarchy']['parent_questgroup_id']);
|
||||
$currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($currentQuestgroup['id']);
|
||||
array_unshift($parentQuestgroupshierarchy, $currentQuestgroup);
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('parentquestgroupshierarchy', $parentQuestgroupshierarchy);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
1506
controllers/QuestsController.inc
Normal file
1506
controllers/QuestsController.inc
Normal file
File diff suppressed because it is too large
Load diff
601
controllers/SeminariesController.inc
Normal file
601
controllers/SeminariesController.inc
Normal file
|
|
@ -0,0 +1,601 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to list registered seminaries.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class SeminariesController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('users', 'seminaries', 'characterroles', 'charactertypes', 'xplevels', 'questgroupshierarchy', 'questgroups', 'questgrouptexts', 'quests', 'questtexts', 'media');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator', 'user'),
|
||||
'seminary' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin', 'moderator'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'copy' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin', 'moderator', 'user'),
|
||||
'calculatexps' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'seminary' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'edit' => array('admin'),
|
||||
'copy' => array('admin'),
|
||||
'delete' => array('admin'),
|
||||
'calculatexps' => array('admin', 'moderator')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* List registered seminaries.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// Get seminaries
|
||||
$seminaries = $this->Seminaries->getSeminaries();
|
||||
|
||||
// Get additional data
|
||||
foreach($seminaries as &$seminary)
|
||||
{
|
||||
$description = \hhu\z\Utils::shortenString($seminary['description'], 100, 120);
|
||||
$seminary['description'] = $description.(strlen($description) < strlen($seminary['description']) ? ' …' : null);
|
||||
$seminary['creator'] = $this->Users->getUserById($seminary['created_user_id']);
|
||||
$seminary['charactertypes'] = $this->Charactertypes->getCharacterTypesForSeminary($seminary['id']);
|
||||
$seminary['xplevels'] = $this->Xplevels->getXPLevelsForSeminary($seminary['id']);
|
||||
|
||||
// Character of currently logged-in user
|
||||
try {
|
||||
$seminary['usercharacter'] = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']);
|
||||
$seminary['usercharacter']['characterroles'] = $this->Characterroles->getCharacterrolesForCharacterById($seminary['usercharacter']['id']);
|
||||
$seminary['xps'] = $this->Seminaries->getTotalXPs($seminary['id']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Seminaries');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminaries', $seminaries);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: seminary.
|
||||
*
|
||||
* Show a seminary and its details.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a seminary
|
||||
*/
|
||||
public function seminary($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Created user
|
||||
$seminary['creator'] = $this->Users->getUserById($seminary['created_user_id']);
|
||||
|
||||
// Get Character
|
||||
$character = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']);
|
||||
|
||||
// Questgrouphierarchy and Questgroups
|
||||
$questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyOfSeminary($seminary['id']);
|
||||
foreach($questgroupshierarchy as &$hierarchy)
|
||||
{
|
||||
// Get Questgroups
|
||||
$hierarchy['questgroups'] = $this->Questgroups->getQuestgroupsForHierarchy($hierarchy['id']);
|
||||
|
||||
// Get additional data
|
||||
foreach($hierarchy['questgroups'] as $i => &$questgroup)
|
||||
{
|
||||
// Check permission of Questgroups
|
||||
if($i >= 1 && count(array_intersect(array('admin','moderator'), SeminaryController::$character['characterroles'])) == 0)
|
||||
{
|
||||
if(!$this->Questgroups->hasCharacterSolvedQuestgroup($hierarchy['questgroups'][$i-1]['id'], $character['id']))
|
||||
{
|
||||
$hierarchy['questgroups'] = array_slice($hierarchy['questgroups'], 0, $i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Get first Questgroup text
|
||||
$text = $this->getFirstQuestgroupText($questgroup['id']);
|
||||
if(!is_null($text))
|
||||
{
|
||||
$questgroup['text'] = \hhu\z\Utils::shortenString($text, 100, 120).' …';
|
||||
}
|
||||
|
||||
// Get Character XPs
|
||||
$questgroup['character_xps'] = $this->Questgroups->getAchievedXPsForQuestgroup($questgroup['id'], $character['id']);
|
||||
|
||||
// Get Media
|
||||
$questgroup['picture'] = null;
|
||||
try {
|
||||
$questgroup['picture'] = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']);
|
||||
}
|
||||
catch(\nre\exceptions\IdNotFoundException $e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('questgroupshierarchy', $questgroupshierarchy);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create a new Seminary.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
|
||||
|
||||
// Values
|
||||
$title = '';
|
||||
$course = '';
|
||||
$description = '';
|
||||
$fields = array('title', 'course');
|
||||
$validation = array();
|
||||
|
||||
// Create a new Seminary
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Seminaries->seminaryTitleExists($title)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
$course = $this->request->getPostParam('course');
|
||||
$description = $this->request->getPostParam('description');
|
||||
|
||||
// Validate moodpic
|
||||
$moodpic = null;
|
||||
if(!empty($_FILES) && array_key_exists('moodpic', $_FILES) && $_FILES['moodpic']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$moodpic = $_FILES['moodpic'];
|
||||
|
||||
// Check error
|
||||
if($moodpic['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'error', $moodpic['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$moodpic['mimetype'] = \hhu\z\Utils::getMimetype($moodpic['tmp_name'], $moodpic['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $moodpic['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'mimetype', $moodpic['mimetype']);
|
||||
}
|
||||
elseif($moodpic['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Create new Seminary
|
||||
if($validation === true)
|
||||
{
|
||||
$seminaryId = $this->Seminaries->createSeminary(
|
||||
$this->Auth->getUserId(),
|
||||
$title,
|
||||
$course,
|
||||
$description
|
||||
);
|
||||
$seminary = $this->Seminaries->getSeminaryById($seminaryId);
|
||||
|
||||
// Upload moodpic
|
||||
if(!is_null($moodpic))
|
||||
{
|
||||
$mediaId = $this->Media->createMoodpic(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('seminarymoodpic-%s', $seminary['url']),
|
||||
'',
|
||||
$moodpic['mimetype'],
|
||||
$moodpic['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Seminaries->setMoodpicForSeminary($seminary['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to Seminary overview
|
||||
$this->redirect($this->linker->link('index', 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('New seminary');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('title', $title);
|
||||
$this->set('course', $course);
|
||||
$this->set('description', $description);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit a seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a seminary
|
||||
*/
|
||||
public function edit($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get allowed mimetypes
|
||||
$mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics'];
|
||||
|
||||
// Values
|
||||
$title = $seminary['title'];
|
||||
$course = $seminary['course'];
|
||||
$description = $seminary['description'];
|
||||
$fields = array('title', 'course');
|
||||
$validation = array();
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Seminaries->seminaryTitleExists($title, $seminary['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
$course = $this->request->getPostParam('course');
|
||||
$description = $this->request->getPostParam('description');
|
||||
|
||||
// Validate moodpic
|
||||
$moodpic = null;
|
||||
if(!empty($_FILES) && array_key_exists('moodpic', $_FILES) && $_FILES['moodpic']['error'] != UPLOAD_ERR_NO_FILE)
|
||||
{
|
||||
$moodpic = $_FILES['moodpic'];
|
||||
|
||||
// Check error
|
||||
if($moodpic['error'] !== UPLOAD_ERR_OK) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'error', $moodpic['error']);
|
||||
}
|
||||
|
||||
// Check mimetype
|
||||
$mediaMimetype = null;
|
||||
$moodpic['mimetype'] = \hhu\z\Utils::getMimetype($moodpic['tmp_name'], $moodpic['type']);
|
||||
foreach($mimetypes as &$mimetype) {
|
||||
if($mimetype['mimetype'] == $moodpic['mimetype']) {
|
||||
$mediaMimetype = $mimetype;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(is_null($mediaMimetype)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'mimetype', $moodpic['mimetype']);
|
||||
}
|
||||
elseif($moodpic['size'] > $mediaMimetype['size']) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'moodpic', 'size', $mediaMimetype['size']);
|
||||
}
|
||||
}
|
||||
|
||||
// Edit Seminary
|
||||
if($validation === true)
|
||||
{
|
||||
$this->Seminaries->editSeminary(
|
||||
$seminary['id'],
|
||||
$title,
|
||||
$course,
|
||||
$description
|
||||
);
|
||||
$seminary = $this->Seminaries->getSeminaryById($seminary['id']);
|
||||
|
||||
// Update moodpic
|
||||
if(!is_null($moodpic))
|
||||
{
|
||||
$mediaId = $this->Media->createMoodpic(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
sprintf('seminarymoodpic-%s', $seminary['url']),
|
||||
'',
|
||||
$moodpic['mimetype'],
|
||||
$moodpic['tmp_name']
|
||||
);
|
||||
if($mediaId !== false) {
|
||||
$this->Seminaries->setMoodpicForSeminary($seminary['id'], $mediaId);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('seminary', $seminary['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Edit seminary');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('title', $title);
|
||||
$this->set('course', $course);
|
||||
$this->set('description', $description);
|
||||
$this->set('mimetypes', $mimetypes);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Copy a Seminary and selected content.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a seminary
|
||||
*/
|
||||
public function copy($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Values
|
||||
$title = sprintf('%s (%s)', $seminary['title'], _('Copy'));
|
||||
$course = $seminary['course'];
|
||||
$description = $seminary['description'];
|
||||
$elements = array();
|
||||
$fields = array('title', 'course');
|
||||
$validation = array();
|
||||
$exception = null;
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$title = $this->request->getPostParam('title');
|
||||
if($this->Seminaries->seminaryTitleExists($title)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true);
|
||||
}
|
||||
$course = $this->request->getPostParam('course');
|
||||
$description = $this->request->getPostParam('description');
|
||||
$elements = $this->request->getPostParam('elements');
|
||||
if(!is_array($elements)) {
|
||||
$elements = array();
|
||||
}
|
||||
|
||||
// Copy Seminary
|
||||
if($validation === true)
|
||||
{
|
||||
try {
|
||||
$seminaryId = $this->Seminaries->copySeminary(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$title,
|
||||
$course,
|
||||
$description,
|
||||
array_key_exists('seminaryfields', $elements),
|
||||
array_key_exists('media', $elements),
|
||||
array_key_exists('questgroupshierarchy', $elements),
|
||||
array_key_exists('questgroups', $elements),
|
||||
array_key_exists('quests', $elements),
|
||||
array_key_exists('questtopics', $elements),
|
||||
array_key_exists('charactertypes', $elements),
|
||||
array_key_exists('xplevels', $elements),
|
||||
array_key_exists('avatars', $elements),
|
||||
array_key_exists('achievements', $elements),
|
||||
array_key_exists('charactergroupsgroups', $elements),
|
||||
array_key_exists('charactergroupsquests', $elements)
|
||||
);
|
||||
$seminary = $this->Seminaries->getSeminaryById($seminaryId);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link('index', 1));
|
||||
}
|
||||
catch(\hhu\z\exceptions\QuesttypeModelNotValidException $e) {
|
||||
$exception = $e;
|
||||
}
|
||||
catch(\hhu\z\exceptions\QuesttypeModelNotFoundException $e) {
|
||||
$exception = $e;
|
||||
}
|
||||
catch(\hhu\z\exceptions\FileCopyException $e) {
|
||||
$exception = $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('title', $title);
|
||||
$this->set('course', $course);
|
||||
$this->set('description', $description);
|
||||
$this->set('elements', $elements);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
$this->set('exception', $exception);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete a seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a seminary
|
||||
*/
|
||||
public function delete($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete seminary
|
||||
$this->Seminaries->deleteSeminary($seminary['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(null, 1));
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('seminary', $seminary['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Delete seminary');
|
||||
|
||||
// Show confirmation
|
||||
$this->set('seminary', $seminary);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: calculatexps.
|
||||
*
|
||||
* (Re-) Calculate the amount of achievable XPs for a Seminary.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function calculatexps($seminaryUrl)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// (Re-) Calculate XPs
|
||||
$this->Seminaries->calculateXPsForSeminary($seminary['id']);
|
||||
|
||||
// Redirect to Questgroup
|
||||
$this->redirect($this->linker->link(array('seminary', $seminary['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the first text of a Questgroup.
|
||||
*
|
||||
* @param int $questgroupId ID of a Questgroup
|
||||
* @return string First text of this Questgroup or NULL
|
||||
*/
|
||||
private function getFirstQuestgroupText($questgroupId)
|
||||
{
|
||||
// Text of Questgroup itself
|
||||
$questgroupTexts = $this->Questgrouptexts->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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
89
controllers/SeminarybarController.inc
Normal file
89
controllers/SeminarybarController.inc
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to display a sidebar with Seminary related
|
||||
* information.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class SeminarybarController extends \hhu\z\Controller
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('characters', 'quests', 'questgroups', 'achievements', 'charactergroups', 'avatars', 'media', 'xplevels');
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// Do not render at first
|
||||
$this->set('render', false);
|
||||
|
||||
// Get Seminary
|
||||
$seminary = SeminaryController::$seminary;
|
||||
if(is_null($seminary)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get Character
|
||||
$character = SeminaryController::$character;
|
||||
if(is_null($character)) {
|
||||
return;
|
||||
}
|
||||
$character['rank'] = $this->Characters->getXPRank($seminary['id'], $character['xps']);
|
||||
|
||||
// Get “last” Quest
|
||||
$lastQuest = $this->Quests->getLastQuestForCharacter($character['id']);
|
||||
if(!is_null($lastQuest)) {
|
||||
$lastQuest['questgroup'] = $this->Questgroups->getQuestgroupById($lastQuest['questgroup_id']);
|
||||
}
|
||||
|
||||
// Get last achieved Achievement
|
||||
$achievements = $this->Achievements->getAchievedAchievementsForCharacter($character['id'], false);
|
||||
$lastAchievement = array_shift($achievements);
|
||||
|
||||
// Get Character group members
|
||||
$characterGroups = array();
|
||||
foreach($this->Charactergroups->getGroupsForCharacter($character['id']) as $group)
|
||||
{
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupById($group['charactergroupsgroup_id']);
|
||||
if($groupsgroup['preferred'])
|
||||
{
|
||||
$group['members'] = $this->Characters->getCharactersForGroup($group['id']);
|
||||
$characterGroups[] = $group;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('character', $character);
|
||||
$this->set('lastQuest', $lastQuest);
|
||||
$this->set('lastAchievement', $lastAchievement);
|
||||
$this->set('characterGroups', $characterGroups);
|
||||
// Render now
|
||||
$this->set('render', true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
53
controllers/SeminarymenuController.inc
Normal file
53
controllers/SeminarymenuController.inc
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to display a menu with Seminary related
|
||||
* links.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class SeminarymenuController extends \hhu\z\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
// Set userdata
|
||||
$this->set('loggedUser', \hhu\z\controllers\IntermediateController::$user);
|
||||
$this->set('loggedSeminary', \hhu\z\controllers\SeminaryController::$seminary);
|
||||
$this->set('loggedCharacter', \hhu\z\controllers\SeminaryController::$character);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
55
controllers/TextmailController.inc
Normal file
55
controllers/TextmailController.inc
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the TextmailAgent for generating a simple text-mail
|
||||
* message.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class TextmailController extends \nre\core\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
|
||||
// Set linker
|
||||
$this->set('linker', ($request instanceof \hhu\z\requests\MailRequest && !is_null($request->getLinker())) ? $request->getLinker() : null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* Create simple text-mail message.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->set('appname', \nre\configs\AppConfig::$app['name']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
318
controllers/UploadsController.inc
Normal file
318
controllers/UploadsController.inc
Normal file
|
|
@ -0,0 +1,318 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the UploadsAgent to process and show user uploads.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class UploadsController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('uploads', 'users', 'userroles', 'characterroles', 'seminaries', 'charactergroups');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'seminary' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'charactergroup' => array('admin', 'moderator', 'user', 'guest')
|
||||
);
|
||||
/**
|
||||
* User seminary permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $seminaryPermissions = array(
|
||||
'seminary' => array('admin', 'moderator', 'user', 'guest'),
|
||||
'charactergroup' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prefilter.
|
||||
*
|
||||
* @param \nre\core\Request $request Current request
|
||||
* @param \nre\core\Response $response Current response
|
||||
*/
|
||||
public function preFilter(\nre\core\Request $request, \nre\core\Response $response)
|
||||
{
|
||||
parent::preFilter($request, $response);
|
||||
|
||||
// Set headers for caching control
|
||||
$response->addHeader("Pragma: public");
|
||||
$response->addHeader("Cache-control: public, max-age=".(60*60*24));
|
||||
$response->addHeader("Expires: ".gmdate('r', time()+(60*60*24)));
|
||||
$response->addHeader("Date: ".gmdate(\DateTime::RFC822));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: seminary.
|
||||
*
|
||||
* Display a Seminary upload.
|
||||
*
|
||||
* @throws \nre\exceptions\AccessDeniedException
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-title of Seminary
|
||||
* @param string $uploadUrl URL-name of the upload
|
||||
* @param string $action Current action (optional)
|
||||
*/
|
||||
public function seminary($seminaryUrl, $uploadUrl, $action=null)
|
||||
{
|
||||
// Get Seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Upload
|
||||
$upload = $this->Uploads->getSeminaryuploadByUrl($seminary['id'], $uploadUrl);
|
||||
|
||||
// Check permissions
|
||||
if(!$upload['public'])
|
||||
{
|
||||
$user = $this->Users->getUserById($this->Auth->getUserId());
|
||||
$user['roles'] = array_map(function($r) { return $r['name']; }, $this->Userroles->getUserrolesForUserById($user['id']));
|
||||
|
||||
// System roles
|
||||
if(count(array_intersect(array('admin', 'moderator'), $user['roles'])) == 0)
|
||||
{
|
||||
// Owner of file
|
||||
if($upload['created_user_id'] != $user['id'])
|
||||
{
|
||||
// Seminary permissions
|
||||
$characterRoles = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
|
||||
if(count(array_intersect(array('admin', 'moderator'), $characterRoles)) == 0) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get file
|
||||
switch($action)
|
||||
{
|
||||
case null:
|
||||
$file = $this->getUploadFile($upload);
|
||||
break;
|
||||
case 'thumbnail':
|
||||
$file = $this->createThumbnail($upload);
|
||||
break;
|
||||
default:
|
||||
throw new \nre\exceptions\ParamsNotValidException($action);
|
||||
break;
|
||||
}
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('upload', $upload);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: charactergroup.
|
||||
*
|
||||
* Display the icon of a Character group.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
* @param string $groupsgroupUrl URL-Title of a Character groups-group
|
||||
* @param string $groupUrl URL-Title of a Character group
|
||||
*/
|
||||
public function charactergroup($seminaryUrl, $groupsgroupUrl, $groupUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Get Character groups-group
|
||||
$groupsgroup = $this->Charactergroups->getGroupsgroupByUrl($seminary['id'], $groupsgroupUrl);
|
||||
|
||||
// Get Character group
|
||||
$group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl);
|
||||
|
||||
// Get Upload
|
||||
$upload = $this->Uploads->getSeminaryuploadById($group['seminaryupload_id']);
|
||||
|
||||
// Get file
|
||||
$file = $this->getUploadFile($upload);
|
||||
if(is_null($file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('upload', $upload);
|
||||
$this->set('file', $file);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Determine the file for an upload.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param array $upload Upload to get file for
|
||||
* @return object File for the upload (or null if upload is cached)
|
||||
*/
|
||||
private function getUploadFile($upload)
|
||||
{
|
||||
// Set content-type
|
||||
$this->response->addHeader("Content-type: ".$upload['mimetype']."");
|
||||
|
||||
// Set filename
|
||||
$upload['filename'] = ROOT.DS.\nre\configs\AppConfig::$dirs['seminaryuploads'].DS.$upload['url'];
|
||||
if(!file_exists($upload['filename'])) {
|
||||
throw new \nre\exceptions\IdNotFoundException($uploadUrl);
|
||||
}
|
||||
|
||||
// Cache
|
||||
if($this->setCacheHeaders($upload['filename'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
return file_get_contents($upload['filename']);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a thumbnail from an upload.
|
||||
*
|
||||
* @param array $upload Upload to create thumbnail for
|
||||
* @return object Thumbnail for the upload (or null if thumbnail is cached)
|
||||
*/
|
||||
private function createThumbnail($upload)
|
||||
{
|
||||
// Set filename
|
||||
$upload['filename'] = ROOT.DS.\nre\configs\AppConfig::$dirs['seminaryuploads'].DS.$upload['url'];
|
||||
|
||||
// Set content-type
|
||||
$this->response->addHeader("Content-type: image/jpeg");
|
||||
|
||||
// Check file
|
||||
if(!file_exists($upload['filename'])) {
|
||||
throw new \nre\exceptions\IdNotFoundException($upload['url']);
|
||||
}
|
||||
|
||||
// Cache
|
||||
if($this->setCacheHeaders($upload['filename'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Set geometry
|
||||
$width = 100;
|
||||
$height = 100;
|
||||
|
||||
switch($upload['mimetype'])
|
||||
{
|
||||
case 'image/jpeg':
|
||||
case 'image/png':
|
||||
// Read image from cache
|
||||
$tempFileName = ROOT.DS.\nre\configs\AppConfig::$dirs['temporary'].DS.$upload['url'].'-'.$width.'x'.$height;
|
||||
if(file_exists($tempFileName))
|
||||
{
|
||||
// Check age of file
|
||||
if(date('r', filemtime($tempFileName)+(60*60*24)) > date('r', time())) {
|
||||
// Too old, delete
|
||||
unlink($tempFileName);
|
||||
}
|
||||
else {
|
||||
// Valid, read and return
|
||||
return file_get_contents($tempFileName);
|
||||
}
|
||||
}
|
||||
|
||||
// ImageMagick
|
||||
$im = new \Imagick($upload['filename']);
|
||||
|
||||
// Calculate new size
|
||||
$geometry = $im->getImageGeometry();
|
||||
if($geometry['width'] < $width) {
|
||||
$width = $geometry['width'];
|
||||
}
|
||||
if($geometry['height'] < $height) {
|
||||
$height = $geometry['width'];
|
||||
}
|
||||
|
||||
// Process
|
||||
$im->thumbnailImage($width, $height, true);
|
||||
$im->contrastImage(1);
|
||||
$im->setImageFormat('jpeg');
|
||||
|
||||
// Save temporary file
|
||||
$im->writeImage($tempFileName);
|
||||
|
||||
|
||||
// Return resized image
|
||||
return $im;
|
||||
break;
|
||||
default:
|
||||
throw new \nre\exceptions\ParamsNotValidException('thumbnail');
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return $this->getUploadFile($upload);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine file information and set the HTTP-header for
|
||||
* caching accordingly.
|
||||
*
|
||||
* @param string $fileName Filename
|
||||
* @return boolean HTTP-status 304 was set (in cache)
|
||||
*/
|
||||
private function setCacheHeaders($fileName)
|
||||
{
|
||||
// Determine last change of file
|
||||
$fileLastModified = gmdate('r', filemtime($fileName));
|
||||
|
||||
// Generate E-Tag
|
||||
$fileEtag = hash('sha256', $fileLastModified.$fileName);
|
||||
|
||||
|
||||
// Set header
|
||||
$this->response->addHeader("Last-Modified: ".$fileLastModified);
|
||||
$this->response->addHeader("Etag: ".$fileEtag);
|
||||
// HTTP-status
|
||||
$headerModifiedSince = $this->request->getServerParam('HTTP_IF_MODIFIED_SINCE');
|
||||
$headerNoneMatch = $this->request->getServerParam('HTTP_IF_NONE_MATCH');
|
||||
if(
|
||||
!is_null($headerModifiedSince) && $fileLastModified < strtotime($headerModifiedSince) &&
|
||||
!is_null($headerNoneMatch) && $headerNoneMatch == $fileEtag
|
||||
) {
|
||||
$this->response->setExit(true);
|
||||
$this->response->addHeader(\nre\core\WebUtils::getHttpHeader(304));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
47
controllers/UserrolesController.inc
Normal file
47
controllers/UserrolesController.inc
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to display and manage userroles.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class UserrolesController extends \hhu\z\Controller
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: user.
|
||||
*
|
||||
* Show a user and its details.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $userUrl URL-Username of an user
|
||||
*/
|
||||
public function user($userUrl)
|
||||
{
|
||||
// Get userroles
|
||||
$roles = $this->Userroles->getUserrolesForUserByUrl($userUrl);
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('roles', $roles);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
641
controllers/UsersController.inc
Normal file
641
controllers/UsersController.inc
Normal file
|
|
@ -0,0 +1,641 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the Agent to list registered users and their data.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class UsersController extends \hhu\z\controllers\IntermediateController
|
||||
{
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'index' => array('admin', 'moderator'),
|
||||
'user' => array('admin', 'moderator', 'user'),
|
||||
'create' => array('admin', 'moderator'),
|
||||
'edit' => array('admin', 'moderator', 'user'),
|
||||
'delete' => array('admin')
|
||||
);
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('users', 'userroles', 'characters', 'characterroles', 'avatars', 'media', 'xplevels');
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: index.
|
||||
*
|
||||
* @param string $all Whether to list all users at once or not (optional)
|
||||
*/
|
||||
public function index($all=null)
|
||||
{
|
||||
// Set filters
|
||||
$sortorder = 'username';
|
||||
$username = null;
|
||||
$name = null;
|
||||
$email = null;
|
||||
$page = 1;
|
||||
if($this->request->getRequestMethod() == 'GET')
|
||||
{
|
||||
$sortorder = $this->request->getGetParam('sortorder');
|
||||
$sortorder = !empty($sortorder) ? $sortorder : 'username';
|
||||
$username = (!is_null($this->request->getGetParam('username'))) ? $this->request->getGetParam('username') : $username;
|
||||
$name = (!is_null($this->request->getGetParam('name'))) ? $this->request->getGetParam('name') : $name;
|
||||
$email = (!is_null($this->request->getGetParam('email'))) ? $this->request->getGetParam('email') : $email;
|
||||
$page = $this->request->getGetParam('page');
|
||||
$page = !empty($page) ? intval($page) : 1;
|
||||
}
|
||||
|
||||
// Get registered users
|
||||
$limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['lists_limit'] : null;
|
||||
$offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0;
|
||||
$usersCount = $this->Users->getUsersCount($username, $name, $email);
|
||||
$users = $this->Users->getUsers($sortorder, $username, $name, $email, $limit, $offset);
|
||||
foreach($users as &$user) {
|
||||
$user['roles'] = array_map(function($r) { return $r['name']; }, $this->Userroles->getUserrolesForUserById($user['id']));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Users');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('users', $users);
|
||||
$this->set('usersCount', $usersCount);
|
||||
$this->set('sortorder', $sortorder);
|
||||
$this->set('username', $username);
|
||||
$this->set('name', $name);
|
||||
$this->set('email', $email);
|
||||
$this->set('all', $all);
|
||||
$this->set('page', $page);
|
||||
$this->set('limit', $limit);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: user.
|
||||
*
|
||||
* Show a user and its details.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @throws \nre\exceptions\AccessDeniedException
|
||||
* @param string $userUrl URL-Username of an user
|
||||
*/
|
||||
public function user($userUrl)
|
||||
{
|
||||
// Get user
|
||||
$user = $this->Users->getUserByUrl($userUrl);
|
||||
|
||||
// Check permissions
|
||||
if(count(array_intersect(array('admin','moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0 && $user['id'] != IntermediateController::$user['id']) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Get Characters
|
||||
$characters = $this->Characters->getCharactersForUser($user['id']);
|
||||
|
||||
// Additional Character information
|
||||
foreach($characters as &$character)
|
||||
{
|
||||
// Seminary roles
|
||||
$character['characterroles'] = $this->Characterroles->getCharacterrolesForCharacterById($character['id']);
|
||||
$character['characterroles'] = array_map(function($a) { return $a['name']; }, $character['characterroles']);
|
||||
|
||||
// Level
|
||||
try {
|
||||
$character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
|
||||
}
|
||||
catch(\nre\Exceptions\IdNotFoundException $e) {
|
||||
// No XP-level
|
||||
}
|
||||
|
||||
// Avatar
|
||||
$avatar = $this->Avatars->getAvatarById($character['avatar_id']);
|
||||
if(!is_null($avatar['small_avatarpicture_id']))
|
||||
{
|
||||
//$character['seminary'] =
|
||||
$character['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized($user['username']);
|
||||
$this->addTitleLocalized('Users');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('user', $user);
|
||||
$this->set('characters', $characters);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: login.
|
||||
*
|
||||
* Log in a user.
|
||||
*/
|
||||
public function login()
|
||||
{
|
||||
$username = '';
|
||||
$referrer = null;
|
||||
|
||||
// Log the user in
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('login')))
|
||||
{
|
||||
$username = $this->request->getPostParam('username');
|
||||
$referrer = $this->request->getPostParam('referrer');
|
||||
$userId = $this->Users->login(
|
||||
$username,
|
||||
$this->request->getPostParam('password')
|
||||
);
|
||||
|
||||
if(!is_null($userId))
|
||||
{
|
||||
$this->Auth->setUserId($userId);
|
||||
$user = $this->Users->getUserById($userId);
|
||||
|
||||
if(!empty($referrer)) {
|
||||
$this->redirect($referrer);
|
||||
}
|
||||
else {
|
||||
$this->redirect($this->linker->link(array($user['url']), 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Login');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('username', $username);
|
||||
$this->set('referrer', $referrer);
|
||||
$this->set('failed', ($this->request->getRequestMethod() == 'POST'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: register.
|
||||
*
|
||||
* Register a new user.
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$username = '';
|
||||
$prename = '';
|
||||
$surname = '';
|
||||
$email = '';
|
||||
|
||||
$fields = array('username', 'prename', 'surname', 'email', 'password');
|
||||
$validation = array();
|
||||
$emailhost = \nre\configs\AppConfig::$app['registration_host'];
|
||||
|
||||
// Register a new user
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('register')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$username = $this->request->getPostParam('username');
|
||||
if($this->Users->usernameExists($username)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'username', 'exist', true);
|
||||
}
|
||||
$prename = $this->request->getPostParam('prename');
|
||||
$surname = $this->request->getPostParam('surname');
|
||||
$email = $this->request->getPostParam('email');
|
||||
if(!empty($emailhost)) {
|
||||
if(substr_compare($email, $emailhost, max(0, strlen($email)-strlen($emailhost)), strlen($emailhost)) !== 0) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'email', 'host', 'invalid');
|
||||
}
|
||||
}
|
||||
if($this->Users->emailExists($email)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'email', 'exist', true);
|
||||
}
|
||||
$password = $this->request->getPostParam('password');
|
||||
if($password != $this->request->getPostParam('passwordrepeat')) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'password', 'repeat', false);
|
||||
}
|
||||
|
||||
|
||||
// Register
|
||||
if($validation === true)
|
||||
{
|
||||
$userId = $this->Users->createUser(
|
||||
$username,
|
||||
$prename,
|
||||
$surname,
|
||||
$email,
|
||||
$password
|
||||
);
|
||||
$user = $this->Users->getUserById($userId);
|
||||
|
||||
// Send mail
|
||||
$this->sendRegistrationMail($user);
|
||||
|
||||
// Login
|
||||
$this->Auth->setUserId($userId);
|
||||
|
||||
|
||||
// Redirect to user page
|
||||
$this->redirect($this->linker->link(array($user['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Registration');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('username', $username);
|
||||
$this->set('prename', $prename);
|
||||
$this->set('surname', $surname);
|
||||
$this->set('email', $email);
|
||||
$this->set('emailhost', $emailhost);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: logout.
|
||||
*
|
||||
* Log out a user.
|
||||
*/
|
||||
public function logout()
|
||||
{
|
||||
// Unset the currently logged in user
|
||||
$this->Auth->setUserId(null);
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(array()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: manage.
|
||||
*
|
||||
* Manage users.
|
||||
*/
|
||||
public function manage()
|
||||
{
|
||||
$selectedUsers = array();
|
||||
//global $sortorder;
|
||||
$sortorder = 'username';
|
||||
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Set sortorder
|
||||
$sortorder = $this->request->getPostParam('sortorder');
|
||||
|
||||
// Do action
|
||||
$selectedUsers = $this->request->getPostParam('users');
|
||||
if(!is_array($selectedUsers)) {
|
||||
$selectedUsers = array();
|
||||
}
|
||||
if(!is_null($this->request->getPostParam('actions')) && count($this->request->getPostParam('actions')) > 0 && !is_null($this->request->getPostParam('users')) && count($this->request->getPostParam('users')) > 0)
|
||||
{
|
||||
$actions = $this->request->getPostParam('actions');
|
||||
$action = array_keys($actions)[0];
|
||||
|
||||
switch($action)
|
||||
{
|
||||
// Add/remove role to/from Characters
|
||||
case 'addrole':
|
||||
case 'removerole':
|
||||
// Determine role and check permissions
|
||||
$role = null;
|
||||
switch($actions[$action])
|
||||
{
|
||||
case _('Admin'):
|
||||
if(!in_array('admin', \hhu\z\controllers\IntermediateController::$user['roles'])) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
$role = 'admin';
|
||||
break;
|
||||
case _('Moderator'):
|
||||
if(!in_array('admin', \hhu\z\controllers\IntermediateController::$user['roles'])) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
$role = 'moderator';
|
||||
break;
|
||||
case _('User'):
|
||||
if(count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) <= 0) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
$role = 'user';
|
||||
break;
|
||||
}
|
||||
|
||||
// Add role
|
||||
if($action == 'addrole') {
|
||||
foreach($selectedUsers as &$userId) {
|
||||
$this->Userroles->addUserroleToUser($userId, $role);
|
||||
}
|
||||
}
|
||||
// Remove role
|
||||
else {
|
||||
foreach($selectedUsers as &$userId) {
|
||||
$this->Userroles->removeUserroleFromUser($userId, $role);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get registered users
|
||||
$users = $this->Users->getUsers($sortorder);
|
||||
foreach($users as &$user) {
|
||||
$user['roles'] = array_map(function($r) { return $r['name']; }, $this->Userroles->getUserrolesForUserById($user['id']));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Manage users');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('users', $users);
|
||||
$this->set('selectedUsers', $selectedUsers);
|
||||
$this->set('sortorder', $sortorder);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: create.
|
||||
*
|
||||
* Create a new user.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
// Values
|
||||
$username = '';
|
||||
$prename = '';
|
||||
$surname = '';
|
||||
$email = '';
|
||||
$fields = array('username', 'prename', 'surname', 'email', 'password');
|
||||
$validation = array();
|
||||
|
||||
// Create new user
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$username = $this->request->getPostParam('username');
|
||||
if($this->Users->usernameExists($username)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'username', 'exist', true);
|
||||
}
|
||||
$prename = $this->request->getPostParam('prename');
|
||||
$surname = $this->request->getPostParam('surname');
|
||||
$email = $this->request->getPostParam('email');
|
||||
if($this->Users->emailExists($email)) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'email', 'exist', true);
|
||||
}
|
||||
$password = $this->request->getPostParam('password');
|
||||
if($password != $this->request->getPostParam('passwordrepeat')) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'password', 'repeat', false);
|
||||
}
|
||||
|
||||
// Create
|
||||
if($validation === true)
|
||||
{
|
||||
$userId = $this->Users->createUser(
|
||||
$this->request->getPostParam('username'),
|
||||
$this->request->getPostParam('prename'),
|
||||
$this->request->getPostParam('surname'),
|
||||
$this->request->getPostParam('email'),
|
||||
$this->request->getPostParam('password')
|
||||
);
|
||||
|
||||
// Redirect to user
|
||||
$user = $this->Users->getUserById($userId);
|
||||
$this->redirect($this->linker->link(array($user['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('New user');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('username', $username);
|
||||
$this->set('prename', $prename);
|
||||
$this->set('surname', $surname);
|
||||
$this->set('email', $email);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: edit.
|
||||
*
|
||||
* Edit a user.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $userUrl URL-Username of an user
|
||||
*/
|
||||
public function edit($userUrl)
|
||||
{
|
||||
// User
|
||||
$user = $this->Users->getUserByUrl($userUrl);
|
||||
|
||||
// Check permissions
|
||||
if(count(array_intersect(array('admin','moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0 && $user['id'] != \hhu\z\controllers\IntermediateController::$user['id']) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Values
|
||||
$username = $user['username'];
|
||||
$prename = $user['prename'];
|
||||
$surname = $user['surname'];
|
||||
$email = $user['email'];
|
||||
$mailing = $user['mailing'];
|
||||
$fields = array('username', 'prename', 'surname', 'email');
|
||||
$validation = array();
|
||||
|
||||
// Edit user
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('save')))
|
||||
{
|
||||
// Get params and validate them
|
||||
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
|
||||
$username = $this->request->getPostParam('username');
|
||||
if($this->Users->usernameExists($username, $user['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'username', 'exist', true);
|
||||
}
|
||||
$password = $this->request->getPostParam('password');
|
||||
if(!empty($password))
|
||||
{
|
||||
$validation = $this->Validation->addValidationResults($validation,
|
||||
'password',
|
||||
$this->Validation->validateParam(
|
||||
$this->request->getPostParams(),
|
||||
'password'
|
||||
)
|
||||
);
|
||||
if($password != $this->request->getPostParam('passwordrepeat')) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'password', 'repeat', false);
|
||||
}
|
||||
}
|
||||
$prename = $this->request->getPostParam('prename');
|
||||
$surname = $this->request->getPostParam('surname');
|
||||
$email = $this->request->getPostParam('email');
|
||||
if($this->Users->emailExists($email, $user['id'])) {
|
||||
$validation = $this->Validation->addValidationResult($validation, 'email', 'exist', true);
|
||||
}
|
||||
$mailing = !is_null($this->request->getPostParam('mailing'));
|
||||
|
||||
// Save changes
|
||||
if($validation === true)
|
||||
{
|
||||
// Edit user
|
||||
$this->Users->editUser(
|
||||
$user['id'],
|
||||
(count(array_intersect(array('admin','moderator'),\hhu\z\controllers\IntermediateController::$user['roles'])) > 0) ? $this->request->getPostParam('username') : $user['username'],
|
||||
$prename,
|
||||
$surname,
|
||||
$email,
|
||||
$password,
|
||||
$mailing
|
||||
);
|
||||
|
||||
// Redirect to entry
|
||||
$user = $this->Users->getUserById($user['id']);
|
||||
$this->redirect($this->linker->link(array('user', $user['url']), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array();
|
||||
foreach($fields as &$field) {
|
||||
$validationSettings[$field] = \nre\configs\AppConfig::$validation[$field];
|
||||
}
|
||||
$validationSettings['password'] = \nre\configs\AppConfig::$validation['password'];
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Edit user');
|
||||
|
||||
// Pass data to view
|
||||
$this->set('username', $username);
|
||||
$this->set('prename', $prename);
|
||||
$this->set('surname', $surname);
|
||||
$this->set('email', $email);
|
||||
$this->set('mailing', $mailing);
|
||||
$this->set('validation', $validation);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: delete.
|
||||
*
|
||||
* Delete a user.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $userUrl URL-Username of an user
|
||||
*/
|
||||
public function delete($userUrl)
|
||||
{
|
||||
// User
|
||||
$user = $this->Users->getUserByUrl($userUrl);
|
||||
|
||||
// Check request method
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Check confirmation
|
||||
if(!is_null($this->request->getPostParam('delete')))
|
||||
{
|
||||
// Delete user
|
||||
$this->Users->deleteUser($user['id']);
|
||||
|
||||
// Redirect to overview
|
||||
$this->redirect($this->linker->link(null, 1));
|
||||
}
|
||||
|
||||
// Redirect to entry
|
||||
$this->redirect($this->linker->link(array('user', $user['url']), 1));
|
||||
}
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Delete user');
|
||||
|
||||
// Show confirmation
|
||||
$this->set('user', $user);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Send mail for new user registration.
|
||||
*
|
||||
* @param array $user Newly registered user
|
||||
*/
|
||||
private function sendRegistrationMail($user)
|
||||
{
|
||||
// Get system moderators
|
||||
$moderators = $this->Users->getUsersWithRole('moderator');
|
||||
|
||||
// Send notification mail
|
||||
try {
|
||||
foreach($moderators as &$moderator)
|
||||
{
|
||||
if($moderator['mailing']) {
|
||||
\hhu\z\Utils::sendMail(
|
||||
$moderator['email'],
|
||||
'userregistration',
|
||||
true,
|
||||
array(
|
||||
$moderator,
|
||||
$user
|
||||
),
|
||||
$this->linker
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(\hhu\z\exceptions\MailingException $e) {
|
||||
$this->log($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
188
controllers/XplevelsController.inc
Normal file
188
controllers/XplevelsController.inc
Normal file
|
|
@ -0,0 +1,188 @@
|
|||
<?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\controllers;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the XplevelsAgent to handle XP-levels of a
|
||||
* Seminary.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class XplevelsController extends \hhu\z\controllers\SeminaryController
|
||||
{
|
||||
/**
|
||||
* Required components
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $components = array('validation');
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('xplevels');
|
||||
/**
|
||||
* User permissions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $permissions = array(
|
||||
'manage' => array('admin', 'moderator', 'user')
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action: manage.
|
||||
*
|
||||
* Manage XP-levels.
|
||||
*
|
||||
* @throws \nre\exceptions\IdNotFoundException
|
||||
* @param string $seminaryUrl URL-Title of a Seminary
|
||||
*/
|
||||
public function manage($seminaryUrl)
|
||||
{
|
||||
// Get seminary
|
||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||
|
||||
// Check permissions
|
||||
if(
|
||||
(is_null(self::$character) && count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0) &&
|
||||
$seminary['created_user_id'] != self::$user['id']
|
||||
) {
|
||||
throw new \nre\exceptions\AccessDeniedException();
|
||||
}
|
||||
|
||||
// Get XP-levels
|
||||
$xplevels = $this->Xplevels->getXPLevelsForSeminary($seminary['id']);
|
||||
|
||||
// Values
|
||||
$xplevelsValues = array();
|
||||
foreach($xplevels as &$xplevel) {
|
||||
$xplevelsValues[$xplevel['id']] = $xplevel;
|
||||
}
|
||||
$deletes = array();
|
||||
$validations = array(
|
||||
'edit' => true,
|
||||
'create' => true
|
||||
);
|
||||
|
||||
// Edit
|
||||
$action = null;
|
||||
if($this->request->getRequestMethod() == 'POST')
|
||||
{
|
||||
// Edit and delete XP-levels
|
||||
if(!is_null($this->request->getPostParam('edit')))
|
||||
{
|
||||
$action = 'edit';
|
||||
|
||||
// Get params
|
||||
$xplevelsValues = $this->request->getPostParam('xplevels');
|
||||
$deletes = $this->request->getPostParam('deletes');
|
||||
|
||||
// Validate params
|
||||
if(!is_array($deletes)) {
|
||||
$deletes = array();
|
||||
}
|
||||
foreach($xplevels as &$xplevel)
|
||||
{
|
||||
if(array_key_exists($xplevel['id'], $deletes)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$xplevelValidation = $this->Validation->validateParams($xplevelsValues[$xplevel['id']], array('xps'));
|
||||
if($xplevelValidation !== true)
|
||||
{
|
||||
if(!is_array($validations['edit'])) {
|
||||
$validations['edit'] = array();
|
||||
}
|
||||
if(!array_key_exists($xplevel['id'], $validations['edit']) || !is_array($validations['edit'][$xplevel['id']])) {
|
||||
$validations['edit'][$xplevel['id']] = array();
|
||||
}
|
||||
$validations['edit'][$xplevel['id']] = $this->Validation->addValidationResults($validations['edit'][$xplevel['id']], 'xps', $xplevelValidation);
|
||||
}
|
||||
}
|
||||
|
||||
// Edit and delete
|
||||
if($validations['edit'] === true)
|
||||
{
|
||||
foreach($xplevels as &$xplevel)
|
||||
{
|
||||
// Delete
|
||||
if(array_key_exists($xplevel['id'], $deletes)) {
|
||||
$this->Xplevels->deleteXPLevel($xplevel);
|
||||
}
|
||||
// Edit
|
||||
elseif(array_key_exists($xplevel['id'], $xplevelsValues))
|
||||
{
|
||||
$this->Xplevels->editXPLevel(
|
||||
$xplevel['id'],
|
||||
$xplevelsValues[$xplevel['id']]['xps']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(null, 3));
|
||||
}
|
||||
}
|
||||
|
||||
// Create XP-level
|
||||
if(!is_null($this->request->getPostParam('create')))
|
||||
{
|
||||
$action = 'create';
|
||||
|
||||
// Get params and validate them
|
||||
$xplevelnew = $this->request->getPostParam('xplevelnew');
|
||||
$validations[$action] = $this->Validation->validateParams($xplevelnew, array('xps'));
|
||||
|
||||
// Create
|
||||
if($validations[$action] === true)
|
||||
{
|
||||
$this->Xplevels->createXPLevel(
|
||||
$this->Auth->getUserId(),
|
||||
$seminary['id'],
|
||||
$xplevelnew['xps']
|
||||
);
|
||||
|
||||
// Redirect
|
||||
$this->redirect($this->linker->link(null, 3));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get validation settings
|
||||
$validationSettings = array(
|
||||
'xps' => \nre\configs\AppConfig::$validation['xps']
|
||||
);
|
||||
|
||||
|
||||
// Set titile
|
||||
$this->addTitleLocalized('Manage XP-levels');
|
||||
$this->addTitle($seminary['title']);
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('xplevels', $xplevels);
|
||||
$this->set('xplevelsValues', $xplevelsValues);
|
||||
$this->set('deletes', $deletes);
|
||||
$this->set('action', $action);
|
||||
$this->set('validations', $validations);
|
||||
$this->set('validationSettings', $validationSettings);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
41
controllers/components/AchievementComponent.inc
Normal file
41
controllers/components/AchievementComponent.inc
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?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\controllers\components;
|
||||
|
||||
|
||||
/**
|
||||
* Component to handle achievements.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class AchievementComponent extends \nre\core\Component
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('achievements');
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Construct a new Achievements-component.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
79
controllers/components/AuthComponent.inc
Normal file
79
controllers/components/AuthComponent.inc
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
<?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\controllers\components;
|
||||
|
||||
|
||||
/**
|
||||
* Component to handle authentication and authorization.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class AuthComponent extends \nre\core\Component
|
||||
{
|
||||
/**
|
||||
* Key to save a user-ID as
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const KEY_USER_ID = 'user_id';
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Construct a new Auth-component.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// Start session
|
||||
if(session_id() === '') {
|
||||
session_start();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Set the ID of the user that is currently logged in.
|
||||
*
|
||||
* @param int $userId ID of the currently logged in user
|
||||
*/
|
||||
public function setUserId($userId)
|
||||
{
|
||||
if(is_null($userId)) {
|
||||
unset($_SESSION[self::KEY_USER_ID]);
|
||||
}
|
||||
else {
|
||||
$_SESSION[self::KEY_USER_ID] = $userId;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the ID of the user that is currently logged in.
|
||||
*
|
||||
* @return int ID of the currently logged in user
|
||||
*/
|
||||
public function getUserId()
|
||||
{
|
||||
if(array_key_exists(self::KEY_USER_ID, $_SESSION)) {
|
||||
return $_SESSION[self::KEY_USER_ID];
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
108
controllers/components/NotificationComponent.inc
Normal file
108
controllers/components/NotificationComponent.inc
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
<?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\controllers\components;
|
||||
|
||||
|
||||
/**
|
||||
* Component to handle user notifications
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class NotificationComponent extends \nre\core\Component
|
||||
{
|
||||
/**
|
||||
* Type: Achievement
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const TYPE_ACHIEVEMENT = 'achievement';
|
||||
/**
|
||||
* Type: Level-up
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const TYPE_LEVELUP = 'levelup';
|
||||
/**
|
||||
* Key for Session-Array to store notifications in
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const SESSION_KEY = 'notifications';
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Construct a new Notification-component.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// Start session
|
||||
if(session_id() === '') {
|
||||
session_start();
|
||||
}
|
||||
|
||||
// Prepare array
|
||||
if(!array_key_exists(self::SESSION_KEY, $_SESSION)) {
|
||||
$_SESSION[self::SESSION_KEY] = array();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Add a notification.
|
||||
*
|
||||
* @param string $type Type of notification
|
||||
* @param string $message Message to display
|
||||
* @param string $link Optional URL to link to
|
||||
* @param string $image Optional URL of image to display
|
||||
*/
|
||||
public function addNotification($type, $message, $link=null, $image=null)
|
||||
{
|
||||
$_SESSION[self::SESSION_KEY][] = array(
|
||||
'type' => $type,
|
||||
'message' => $message,
|
||||
'link' => $link,
|
||||
'image' => $image
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get all registered notifiactions and clear them.
|
||||
*
|
||||
* @return array List of existing notifications
|
||||
*/
|
||||
public function getNotifications()
|
||||
{
|
||||
$notifications = $_SESSION[self::SESSION_KEY];
|
||||
$this->clearNotifications();
|
||||
|
||||
|
||||
return $notifications;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clear all notifications currently registered
|
||||
*/
|
||||
public function clearNotifications()
|
||||
{
|
||||
unset($_SESSION[self::SESSION_KEY]);
|
||||
$_SESSION[self::SESSION_KEY] = array();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
89
controllers/components/QuesttypedataComponent.inc
Normal file
89
controllers/components/QuesttypedataComponent.inc
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
<?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\controllers\components;
|
||||
|
||||
|
||||
/**
|
||||
* Component to handle data for Questtypes between different Quest states.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class QuesttypedataComponent extends \nre\core\Component
|
||||
{
|
||||
/**
|
||||
* Session key
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const SESSION_KEY = 'questtypes';
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Construct a new QuesttypesData-component.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// Construct session place
|
||||
if(!array_key_exists(self::SESSION_KEY, $_SESSION)) {
|
||||
$_SESSION[self::SESSION_KEY] = array();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Set data with a key-value pair.
|
||||
*
|
||||
* @param int $questId ID of Quest to set data for
|
||||
* @param mixed $key Key
|
||||
* @param mixed $value Value
|
||||
*/
|
||||
public function set($questId, $key, $value)
|
||||
{
|
||||
// Construct array
|
||||
if(!array_key_exists($questId, $_SESSION[self::SESSION_KEY])) {
|
||||
$_SESSION[self::SESSION_KEY][$questId] = array();
|
||||
}
|
||||
|
||||
// Set data
|
||||
$_SESSION[self::SESSION_KEY][$questId][$key] = $value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get data by a key.
|
||||
*
|
||||
* @param int $questId ID of Quest to set data for
|
||||
* @param mixed $key Key
|
||||
* @return mixed Value
|
||||
*/
|
||||
public function get($questId, $key)
|
||||
{
|
||||
// Check array
|
||||
if(!array_key_exists($questId, $_SESSION[self::SESSION_KEY])) {
|
||||
return null;
|
||||
}
|
||||
if(!array_key_exists($key, $_SESSION[self::SESSION_KEY][$questId])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
// Return data
|
||||
return $_SESSION[self::SESSION_KEY][$questId][$key];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
183
controllers/components/ValidationComponent.inc
Normal file
183
controllers/components/ValidationComponent.inc
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
<?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\controllers\components;
|
||||
|
||||
|
||||
/**
|
||||
* Component to validate user input.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class ValidationComponent extends \nre\core\Component
|
||||
{
|
||||
/**
|
||||
* Validation settings
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $config;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Construct a new Validation-component.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// Get validation settings from configuration
|
||||
$this->config = \nre\configs\AppConfig::$validation;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Validate an user input.
|
||||
*
|
||||
* @param mixed $input User input to validate
|
||||
* @param array $settings Validation setting
|
||||
* @return mixed True or the settings the validation fails on
|
||||
*/
|
||||
public function validate($input, $settings)
|
||||
{
|
||||
$validation = array();
|
||||
|
||||
// Min string length
|
||||
if(array_key_exists('minlength', $settings) && strlen($input) < $settings['minlength']) {
|
||||
$validation['minlength'] = $settings['minlength'];
|
||||
}
|
||||
// Max string length
|
||||
if(array_key_exists('maxlength', $settings) && strlen($input) > $settings['maxlength']) {
|
||||
$validation['maxlength'] = $settings['maxlength'];
|
||||
}
|
||||
|
||||
// Regex
|
||||
if(array_key_exists('regex', $settings) && !preg_match($settings['regex'], $input)) {
|
||||
$validation['regex'] = $settings['regex'];
|
||||
}
|
||||
|
||||
|
||||
// Return true or the failed fields
|
||||
if(empty($validation)) {
|
||||
return true;
|
||||
}
|
||||
return $validation;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate an user input parameter.
|
||||
*
|
||||
* @param array $params User input parameters
|
||||
* @param array $index Names of parameter to validate and to validate against
|
||||
* @return mixed True or the parameter with settings the validation failed on
|
||||
*/
|
||||
public function validateParam($params, $index)
|
||||
{
|
||||
// Check parameter
|
||||
if(!array_key_exists($index, $params)) {
|
||||
throw new \nre\exceptions\ParamsNotValidException($index);
|
||||
}
|
||||
// Check settings
|
||||
if(!array_key_exists($index, $this->config)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Validate parameter and return result
|
||||
return $this->validate($params[$index], $this->config[$index]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate user input parameters.
|
||||
*
|
||||
* @param array $params User input parameters
|
||||
* @param array $indices Names of parameters to validate and to validate against
|
||||
* @return mixed True or the parameters with settings the validation failed on
|
||||
*/
|
||||
public function validateParams($params, $indices)
|
||||
{
|
||||
// Validate parameters
|
||||
$validation = true;
|
||||
foreach($indices as $index) {
|
||||
$validation = $this->addValidationResults($validation, $index, $this->validateParam($params, $index));
|
||||
}
|
||||
|
||||
|
||||
// Return validation results
|
||||
return $validation;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a custom determined validation result to a validation
|
||||
* array.
|
||||
*
|
||||
* @param mixed $validation Validation array to add result to
|
||||
* @param string $index Name of parameter of the custom validation result
|
||||
* @param string $setting Name of setting of the custom validation result
|
||||
* @param mixed $result Validation result
|
||||
* @return mixed The altered validation array
|
||||
*/
|
||||
public function addValidationResult($validation, $index, $setting, $result)
|
||||
{
|
||||
// Create validation array
|
||||
if(!is_array($validation)) {
|
||||
$validation = array();
|
||||
}
|
||||
|
||||
// Add validation results
|
||||
if(!array_key_exists($index, $validation)) {
|
||||
$validation[$index] = array();
|
||||
}
|
||||
$validation[$index][$setting] = $result;
|
||||
|
||||
|
||||
// Return new validation result
|
||||
return $validation;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add custom determined validation results to a validation
|
||||
* arary.
|
||||
*
|
||||
* @param mixed $validation Validation array to add result to
|
||||
* @param string $index Name of parameter of the custom validation result
|
||||
* @param mixed $result Validation result
|
||||
* @return mixed The altered validation array
|
||||
*/
|
||||
public function addValidationResults($validation, $index, $results)
|
||||
{
|
||||
// Create validation array
|
||||
if(!is_array($validation)) {
|
||||
$validation = array();
|
||||
}
|
||||
|
||||
// Add validation results
|
||||
if($results !== true) {
|
||||
$validation[$index] = $results;
|
||||
}
|
||||
|
||||
|
||||
// Return new validation result
|
||||
if(empty($validation)) {
|
||||
return true;
|
||||
}
|
||||
return $validation;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
0
controllers/components/empty
Normal file
0
controllers/components/empty
Normal file
0
controllers/empty
Normal file
0
controllers/empty
Normal file
Loading…
Add table
Add a link
Reference in a new issue