questlab/controllers/AchievementsController.inc

981 lines
44 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Questlab
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
* @copyright 2014 2016 Heinrich-Heine-Universität Düsseldorf
* @license http://www.gnu.org/licenses/gpl.html
* @link https://github.com/coderkun/questlab
*/
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'),
'manage' => 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'),
'manage' => 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['icons'];
// 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['icons'];
// 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'])
{
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;
// QR-Code conditions
case 'qrcode':
$conditions = $this->Achievements->getAchievementConditionsQrcode($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;
// QR-Code conditions
case 'qrcode':
if(array_key_exists($condition['id'], $deletes)) {
$this->Achievements->deleteAchievementConditionQrcode($condition['id']);
}
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;
// QR-code conditions
case 'qrcode':
if(array_key_exists('qrcode', $condition))
{
$this->Achievements->addAchievementConditionQrcode(
$this->Auth->getUserId(),
$achievement['id']
);
}
break;
}
}
// Redirect to overview
$this->redirect($this->linker->link(array(), 4));
}
// 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);
}
}
?>