1) implement basic CharactersAgent

2) use view for Character groups
This commit is contained in:
coderkun 2014-02-16 15:31:08 +01:00
commit 2f65a89ef4
15 changed files with 311 additions and 11 deletions

View file

@ -0,0 +1,43 @@
<?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\agents\intermediate;
/**
* Agent to list registered Characters and their data.
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
*/
class CharactersAgent extends \nre\agents\IntermediateAgent
{
/**
* Action: index.
*/
public function index(\nre\core\Request $request, \nre\core\Response $response)
{
}
/**
* Action: character.
*/
public function character(\nre\core\Request $request, \nre\core\Response $response)
{
}
}
?>

View file

@ -24,13 +24,23 @@
*
* @var array
*/
public $models = array('users', 'userroles');
public $models = array('users', 'userroles', 'seminaries', 'characters');
/**
* Current user
*
* @var array
*/
public static $user = null;
/**
*
*/
public static $seminary = null;
/**
* Character of current user and Seminary
*
* @var array
*/
public static $character = null;
@ -67,6 +77,15 @@
// Get userdata
try {
static::$user = $this->Users->getUserById($this->Auth->getUserId());
// Character
$controller = $this->agent->getIntermediateAgent()->controller;
if(in_array(\hhu\z\controllers\SeminaryRoleController::class, class_parents($controller)))
{
$seminaryUrl = $this->request->getParam(3);
static::$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
static::$character = $this->Characters->getCharacterForUserAndSeminary(static::$user['id'], static::$seminary['id']);
}
}
catch(\nre\exceptions\IdNotFoundException $e) {
}
@ -76,6 +95,8 @@
// Set userdata
$this->set('loggedUser', static::$user);
$this->set('loggedSeminary', static::$seminary);
$this->set('loggedCharacter', static::$character);
}

View file

@ -82,6 +82,7 @@
array('^([^/]+)/([^/]+)/?$', 'questgropus/questgroup/$1/$2', true),
// z/<Seminary>/<Questgroup>/<Quest> ⇒ z/quests/quest/<Seminary>/<Questgroup>/<Quest>
array('^([^/]+)/([^/]+)/([^/]+)/?$', 'quests/quest/$1/$2/3', true)*/
array('characters/(?!(index|character))', 'characters/index/$1', true),
array('charactergroups/(?!(index|groupsgroup|group))', 'charactergroups/index/$1', true),
array('charactergroupsquests/(?!(quest))', 'charactergroupsquests/quest/$1', true),
array('media/(.*)', 'media/$1?layout=binary', false),
@ -100,6 +101,7 @@
array('users/([^/]+)/(.*)', 'users/$2/$1', true),
array('seminaries/seminary/(.*)', 'seminaries/$1', false),
//array('seminaries/seminary/(.*)', '$1', false)
array('characters/index/(.*)', 'characters/$1', true),
array('charactergroup/index/(.*)', 'charactergroup/$1', true),
array('charactergroupsquests/quest/(.*)', 'charactergroupsquests/$1', true),
array('media/index/(.*)', 'media/$1', true)

View file

@ -123,6 +123,9 @@
// Get Character group
$group = $this->Charactergroups->getGroupByUrl($groupsgroup['id'], $groupUrl);
// Get Characters
$characters = $this->Characters->getCharactersForGroup($group['id']);
// Get Character groups Quests
$quests = $this->Charactergroupsquests->getQuestsForGroup($group['id']);
@ -131,6 +134,7 @@
$this->set('seminary', $seminary);
$this->set('groupsgroup', $groupsgroup);
$this->set('group', $group);
$this->set('characters', $characters);
$this->set('quests', $quests);
}

View file

@ -0,0 +1,97 @@
<?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\Controller
{
/**
* User permissions
*
* @var array
*/
public $permissions = array(
'index' => array('admin', 'moderator'),
'character' => array('admin', 'moderator', 'user')
);
/**
* Required models
*
* @var array
*/
public $models = array('seminaries', 'characters', 'users', 'charactergroups');
/**
* Action: index.
*
* List registered Characters for a Seminary
*
* @throws IdNotFoundException
* @param string $seminaryUrl URL-Title of a Seminary
*/
public function index($seminaryUrl)
{
// Get Seminary
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
// Get registered Characters
$characters = $this->Characters->getCharactersForSeminary($seminary['id']);
// Pass data to view
$this->set('seminary', $seminary);
$this->set('characters', $characters);
}
/**
* Action: character.
*
* Show a Charater and its details.
*
* @throws 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);
// Get Character
$character = $this->Characters->getCharacterByUrl($seminary['id'], $characterUrl);
// Get User
$user = $this->Users->getUserById($character['user_id']);
// Get Character groups
$groups = $this->Charactergroups->getGroupsForCharacter($character['id']);
// Pass data to view
$this->set('seminary', $seminary);
$this->set('character', $character);
$this->set('user', $user);
$this->set('groups', $groups);
}
}
?>

View file

@ -50,6 +50,8 @@
// Set userdata
$this->set('loggedUser', static::$user);
$this->set('loggedSeminary', static::$seminary);
$this->set('loggedCharacter', static::$character);
}
}

View file

@ -88,8 +88,8 @@
public function getGroupsForGroupsgroup($groupsgroupId)
{
return $this->db->query(
'SELECT id, name, url '.
'FROM charactergroups '.
'SELECT id, name, url, xps '.
'FROM v_charactergroups '.
'WHERE charactergroupsgroup_id = ?',
'i',
$groupsgroupId
@ -97,6 +97,26 @@
}
/**
* Get Character groups for a Character.
*
* @param int $characterId ID of the Character
* @return array Character groups
*/
public function getGroupsForCharacter($characterId)
{
return $this->db->query(
'SELECT charactergroups.id, charactergroups.charactergroupsgroup_id, charactergroups.name, charactergroups.url, charactergroups.xps, charactergroupsgroups.id AS charactergroupsgroup_id, charactergroupsgroups.name AS charactergroupsgroup_name, charactergroupsgroups.url AS charactergroupsgroup_url '.
'FROM characters_charactergroups '.
'LEFT JOIN v_charactergroups AS charactergroups ON charactergroups.id = characters_charactergroups.charactergroup_id '.
'LEFT JOIN charactergroupsgroups ON charactergroupsgroups.id = charactergroups.charactergroupsgroup_id '.
'WHERE characters_charactergroups.character_id = ?',
'i',
$characterId
);
}
/**
* Get a Character group by its URL.
*
@ -108,8 +128,8 @@
public function getGroupByUrl($groupsgroupId, $groupUrl)
{
$data = $this->db->query(
'SELECT id, name, url '.
'FROM charactergroups '.
'SELECT id, name, url, xps '.
'FROM v_charactergroups '.
'WHERE charactergroupsgroup_id = ? AND url = ?',
'is',
$groupsgroupId, $groupUrl

View file

@ -43,8 +43,8 @@
public function getCharactersForUser($userId)
{
return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM v_characters AS characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE user_id = ?',
@ -54,6 +54,46 @@
}
/**
* Get Characters for a Seminary.
*
* @param int $seminaryId ID of the Seminary
* @return array Characters
*/
public function getCharactersForSeminary($seminaryId)
{
return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM v_characters AS characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ?',
'i',
$seminaryId
);
}
/**
* Get Characters for a Character group.
*
* @param int $groupId ID of the Character group
* @return array Characters
*/
public function getCharactersForGroup($groupId)
{
return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '.
'FROM v_characters AS characters '.
'LEFT JOIN characters_charactergroups ON characters_charactergroups.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'WHERE characters_charactergroups.charactergroup_id = ?',
'i',
$groupId
);
}
/**
* Get the character of a user for a Seminary.
*
@ -65,8 +105,8 @@
public function getCharacterForUserAndSeminary($userId, $seminaryId)
{
$data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '.
'FROM characters '.
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '.
'FROM v_characters AS characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'WHERE characters.user_id = ? AND charactertypes.seminary_id = ?',
'ii',
@ -80,6 +120,33 @@
return $data[0];
}
/**
* Get a Character by its Url.
*
* @throws IdNotFoundException
* @param int $seminaryId ID of the Seminary
* @param string $characterUrl URL-name of the Character
* @return array Character data
*/
public function getCharacterByUrl($seminaryId, $characterUrl)
{
$data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '.
'FROM v_characters AS characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'WHERE charactertypes.seminary_id = ? AND characters.url = ?',
'is',
$seminaryId, $characterUrl
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($characterUrl);
}
return $data[0];
}
}
?>

View file

@ -4,6 +4,19 @@
<h4><a href="<?=$linker->link(array('groupsgroup',$seminary['url'],$groupsgroup['url']),1)?>"><?=$groupsgroup['name']?></a></h4>
<h5><?=$group['name']?></h5>
<section>
XPs: <?=$group['xps']?>
</section>
<section>
<h1><?=_('Characters')?></h1>
<ul>
<?php foreach($characters as &$character) : ?>
<li><a href="<?=$linker->link(array('characters','character',$seminary['url'],$character['url']))?>"><?=$character['name']?></a> (<?=$character['xps']?> XPs)</li>
<?php endforeach ?>
</ul>
</section>
<section>
<h1><?=_('Quests')?></h1>
<table>

View file

@ -5,7 +5,7 @@
<ul>
<?php foreach($groups as &$group) : ?>
<li><a href="<?=$linker->link(array('group',$seminary['url'],$groupsgroup['url'],$group['url']),1)?>"><?=$group['name']?></a></li>
<li><a href="<?=$linker->link(array('group',$seminary['url'],$groupsgroup['url'],$group['url']),1)?>"><?=$group['name']?> (<?=$group['xps']?> XPs)</a></li>
<?php endforeach ?>
</ul>

View file

@ -0,0 +1,19 @@
<h1><?=$seminary['title']?></h1>
<h2><?=_('Characters')?></h2>
<h3><?=$character['name']?></h3>
<section>
<p>
XPs: <?=$character['xps']?><br />
<?=_('User')?>: <a href="<?=$linker->link(array('users','user',$user['url']))?>"><?=$user['username']?></a><br />
</p>
</section>
<section>
<h1><?=_('Character Groups')?></h1>
<ul>
<?php foreach($groups as &$group) : ?>
<li><a href="<?=$linker->link(array('charactergroups','group',$seminary['url'],$group['charactergroupsgroup_url'],$group['url']))?>"><?=$group['name']?></a> (<?=$group['xps']?> XPs)</li>
<?php endforeach ?>
</ul>
</section>

View file

@ -0,0 +1,8 @@
<h1><?=$seminary['title']?></h1>
<h2><?=_('Characters')?></h2>
<ul>
<?php foreach($characters as &$character) : ?>
<li><a href="<?=$linker->link(array('character',$seminary['url'],$character['url']),1)?>"><?=$character['name']?></a> (<?=$character['xps']?> XPs)</li>
<?php endforeach ?>
</ul>

View file

@ -17,6 +17,9 @@
<?php if(!is_null($loggedUser)) : ?>
<div id="user">
<a href="<?=$linker->link(array('users',$loggedUser['url']))?>"><?=$loggedUser['username']?></a>
<?php if(!is_null($loggedCharacter)) : ?>
<?=_('as')?> <a href="<?=$linker->link(array('characters','character',$loggedSeminary['url'],$loggedCharacter['url']))?>"><?=$loggedCharacter['name']?></a> (<?=$loggedCharacter['xps']?> XPs)
<?php endif ?>
</div>
<?php endif ?>
</header>

View file

@ -5,6 +5,7 @@
<li><a href="<?=$linker->link('delete', 3)?>"><?=_('Delete seminary')?></a></li>
</nav>
<nav>
<li><a href="<?=$linker->link(array('characters',$seminary['url']))?>"><?=_('Characters')?></a></li>
<li><a href="<?=$linker->link(array('charactergroups',$seminary['url']))?>"><?=_('Character Groups')?></a></li>
</nav>
<p>

View file

@ -11,7 +11,7 @@
<h3><?=_('Characters')?></h3>
<ul>
<?php foreach($characters as &$character) : ?>
<li><?=$character['name']?> (<a href="<?=$linker->link(array('seminaries',$character['seminary_url']))?>"><?=$character['seminary_title']?></a>)</li>
<li><a href="<?=$linker->link(array('characters','character',$character['seminary_url'],$character['url']))?>"><?=$character['name']?></a> (<?=$character['xps']?> XPs) (<a href="<?=$linker->link(array('seminaries',$character['seminary_url']))?>"><?=$character['seminary_title']?></a>)</li>
<?php endforeach ?>
</ul>