add AJAX to Character listing

This commit is contained in:
coderkun 2014-05-26 17:46:30 +02:00
commit 688d6d6382
4 changed files with 207 additions and 148 deletions

View file

@ -68,7 +68,7 @@
* @throws IdNotFoundException * @throws IdNotFoundException
* @param string $seminaryUrl URL-Title of a Seminary * @param string $seminaryUrl URL-Title of a Seminary
*/ */
public function index($seminaryUrl) public function index($seminaryUrl, $all=null)
{ {
// Get Seminary // Get Seminary
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
@ -76,8 +76,22 @@
// Get Seminarycharacterfields // Get Seminarycharacterfields
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']); $characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
// Set sort order and page
$sortorder = 'name';
$page = 1;
if($this->request->getRequestMethod() == 'GET')
{
$sortorder = $this->request->getGetParam('sortorder');
$sortorder = !empty($sortorder) ? $sortorder : 'name';
$page = $this->request->getGetParam('page');
$page = !empty($page) ? intval($page) : 1;
}
// Get registered Characters // Get registered Characters
$characters = $this->Characters->getCharactersForSeminary($seminary['id']); $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']);
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $limit, $offset);
foreach($characters as &$character) foreach($characters as &$character)
{ {
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); $character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']);
@ -89,24 +103,6 @@
} }
} }
// Sort Characters
global $sortorder;
$sortorder = ($this->request->getRequestMethod() == 'GET') ? $this->request->getGetParam('sortorder') : null;
$sortorder = (!is_null($sortorder)) ? $sortorder : 'xps';
$sortMethod = 'sortCharactersBy'.ucfirst(strtolower($sortorder));
if(method_exists($this, $sortMethod)) {
usort($characters, array($this, $sortMethod));
}
elseif(in_array($sortorder, array_map(function($f) { return $f['title']; }, $characterfields))) {
usort($characters, function($a, $b) {
global $sortorder;
return $this->sortCharactersByField($a, $b, $sortorder);
});
}
else {
throw new \nre\exceptions\ParamsNotValidException($sortorder);
}
// Set titile // Set titile
$this->addTitleLocalized('Characters'); $this->addTitleLocalized('Characters');
@ -115,8 +111,12 @@
// Pass data to view // Pass data to view
$this->set('seminary', $seminary); $this->set('seminary', $seminary);
$this->set('characters', $characters); $this->set('characters', $characters);
$this->set('charactersCount', $charactersCount);
$this->set('characterfields', $characterfields); $this->set('characterfields', $characterfields);
$this->set('sortorder', $sortorder); $this->set('sortorder', $sortorder);
$this->set('all', $all);
$this->set('page', $page);
$this->set('limit', $limit);
} }
@ -665,131 +665,6 @@
} }
} }
/**
* Compare two Characters by their name.
*
* @param array $a Character a
* @param array $b Character b
* @return int Result of comparison
*/
private function sortCharactersByCharactername($a, $b)
{
if($a['name'] == $b['name']) {
return 0;
}
return ($a['name'] < $b['name']) ? -1 : 1;
}
/**
* Compare two Characters by their XPs.
*
* @param array $a Character a
* @param array $b Character b
* @return int Result of comparison
*/
private function sortCharactersByXps($a, $b)
{
if($a['xps'] == $b['xps']) {
return 0;
}
return ($a['xps'] > $b['xps']) ? -1 : 1;
}
/**
* Compare two Characters by their Character roles.
*
* @param array $a Character a
* @param array $b Character b
* @return int Result of comparison
*/
private function sortCharactersByRole($a, $b)
{
if(in_array('admin', $a['characterroles']))
{
if(in_array('admin', $b['characterroles'])) {
return 0;
}
return -1;
}
if(in_array('moderator', $a['characterroles']))
{
if(in_array('admin', $b['characterroles'])) {
return 1;
}
if(in_array('moderator', $b['characterroles'])) {
return 0;
}
return -1;
}
if(in_array('user', $a['characterroles']))
{
if(in_array('admin', $b['characterroles']) || in_array('moderator', $b['characterroles'])) {
return 1;
}
if(in_array('user', $b['characterroles'])) {
return 0;
}
return -1;
}
if(in_array('guest', $a['characterroles']))
{
if(in_array('admin', $b['characterroles']) || in_array('moderator', $b['characterroles']) || in_array('user', $b['characterroles'])) {
return 1;
}
if(in_array('guest', $b['characterroles'])) {
return 0;
}
return -1;
}
return 1;
}
/**
* Compare two Characters by their registration date.
*
* @param array $a Character a
* @param array $b Character b
* @return int Result of comparison
*/
private function sortCharactersByDate($a, $b)
{
if($a['created'] == $b['created']) {
return 0;
}
return ($a['created'] > $b['created']) ? -1 : 1;
}
/**
* Compare two Characters by one of their Seminary fields.
*
* @param array $a Character a
* @param array $b Character b
* @param string $field Field to compare
* @return int Result of comparison
*/
private function sortCharactersByField($a, $b, $field)
{
if($a['characterfields'][$field] == $b['characterfields'][$field]) {
return 0;
}
return ($a['characterfields'][$field] < $b['characterfields'][$field]) ? -1 : 1;
}
} }
?> ?>

View file

@ -54,6 +54,32 @@
} }
/**
* Get count of Characters for a Seminary.
*
* @param int $seminaryId ID of the Seminary
* @return int Count of Characters
*/
public function getCharactersForSeminaryCount($seminaryId)
{
$data = $this->db->query(
'SELECT count(DISTINCT characters.id) AS c '.
'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
);
if(!empty($data)) {
return $data[0]['c'];
}
return 0;
}
/** /**
* Get Characters for a Seminary. * Get Characters for a Seminary.
* *
@ -75,6 +101,79 @@
} }
/**
* Get Characters for a Seminary sorted and optionally limited.
*
* @param int $seminaryId ID of the Seminary
* @param string $sort Field to sort by
* @param int $limit Limit amount of Characters (optional)
* @param int $offset Offset (optional)
* @return array Characters
*/
public function getCharactersForSeminarySorted($seminaryId, $sort, $limit=null, $offset=0)
{
switch($sort)
{
case 'name':
case 'created':
case 'xps':
$orders = array(
'name' => 'ASC',
'created' => 'DESC',
'xps' => 'DESC'
);
return $this->db->query(
sprintf(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_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 = ? '.
'ORDER BY characters.%s %s '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
$sort,
$orders[$sort]
),
'i',
$seminaryId
);
break;
case 'role':
return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_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 '.
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.
'WHERE seminaries.id = ? '.
'ORDER BY characterroles.id IS NULL, characterroles.id ASC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'i',
$seminaryId
);
break;
default:
return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_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 '.
'LEFT JOIN characters_seminarycharacterfields ON characters_seminarycharacterfields.character_id = characters.id '.
'LEFT JOIN seminarycharacterfields ON seminarycharacterfields.id = characters_seminarycharacterfields.seminarycharacterfield_id AND seminarycharacterfields.url = ? '.
'WHERE seminaries.id = ? '.
'ORDER BY characters_seminarycharacterfields.value ASC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'si',
$sort,
$seminaryId
);
break;
}
}
/** /**
* Get Characters for a Character group. * Get Characters for a Character group.
* *

View file

@ -0,0 +1,25 @@
<?php
foreach($characters as &$character)
{
// Role translation
foreach($character['characterroles'] as &$role)
{
switch($role)
{
case 'admin': $role = _('Admin');
break;
case 'moderator': $role = _('Moderator');
break;
case 'user': $role = _('User');
break;
}
}
}
?>
<?=json_encode(array(
'seminary' => $seminary,
'characters' => $characters,
'more' => (($page*$limit) < $charactersCount)
))?>

View file

@ -18,10 +18,10 @@
<fieldset class="filter"> <fieldset class="filter">
<p><small>Sortierung:</small></p> <p><small>Sortierung:</small></p>
<select name="sortorder" onchange="this.form.submit();"> <select name="sortorder" onchange="this.form.submit();">
<option value="charactername" <?php if($sortorder == 'charactername') : ?>selected="selected"<?php endif ?>><?=_('Character name')?></option> <option value="name" <?php if($sortorder == 'name') : ?>selected="selected"<?php endif ?>><?=_('Character name')?></option>
<option value="xps" <?php if($sortorder == 'xps') : ?>selected="selected"<?php endif ?>><?=_('XPs')?></option> <option value="xps" <?php if($sortorder == 'xps') : ?>selected="selected"<?php endif ?>><?=_('XPs')?></option>
<option value="role" <?php if($sortorder == 'role') : ?>selected="selected"<?php endif ?>><?=_('Role')?></option> <option value="role" <?php if($sortorder == 'role') : ?>selected="selected"<?php endif ?>><?=_('Role')?></option>
<option value="date" <?php if($sortorder == 'date') : ?>selected="selected"<?php endif ?>><?=_('Date of registration')?></option> <option value="created" <?php if($sortorder == 'created') : ?>selected="selected"<?php endif ?>><?=_('Date of registration')?></option>
<?php foreach($characterfields as &$characterfield) : ?> <?php foreach($characterfields as &$characterfield) : ?>
<option value="<?=$characterfield['url']?>" <?php if($sortorder == $characterfield['url']) : ?>selected="selected"<?php endif ?>><?=$characterfield['title']?></option> <option value="<?=$characterfield['url']?>" <?php if($sortorder == $characterfield['url']) : ?>selected="selected"<?php endif ?>><?=$characterfield['title']?></option>
<?php endforeach ?> <?php endforeach ?>
@ -30,7 +30,7 @@
</fieldset> </fieldset>
</form> </form>
<ul class="admnql"> <ul id="characterlist" class="admnql">
<?php foreach($characters as &$character) : ?> <?php foreach($characters as &$character) : ?>
<li class="cf"> <li class="cf">
<img src="<?=$linker->link(array('media','avatar',$seminary['url'],$character['charactertype_url'],$character['xplevel']['level'],'portrait'))?>"> <img src="<?=$linker->link(array('media','avatar',$seminary['url'],$character['charactertype_url'],$character['xplevel']['level'],'portrait'))?>">
@ -46,3 +46,63 @@
</li> </li>
<?php endforeach ?> <?php endforeach ?>
</ul> </ul>
<?php if(is_null($all) && ($page*$limit) < $charactersCount) : ?>
<nav class="admin">
<li><a id="show-more" href="<?=$linker->link(null,3,true,array('page'=>$page+1,'sortorder'=>$sortorder))?>"><?=_('Show more')?></a></li>
<li><a id="show-all" href="<?=$linker->link('all',3,true,array('sortorder'=>$sortorder))?>"><?=_('Show all')?></a></li>
</nav>
<?php endif ?>
<script>
var page = 1;
var request;
var linkAvatar = "<?=$linker->link(array('media','avatar','SEMINARY','CHARACTERTYPE','XPLEVEL','portrait'))?>";
var linkCharacter = "<?=$linker->link(array('character','SEMINARY','CHARACTER'),1)?>";
var linkUser = "<?=$linker->link(array('users','user','USER'))?>";
var linkPage = "<?=$linker->link(null,3,true,array('page'=>'PAGE','sortorder'=>$sortorder))?>";
$("#show-more").click(function(event) {
if(request) {
request.abort();
}
page++;
request = $.getJSON(linkPage.replace('PAGE', page), function(data) {
linkAvatar = linkAvatar.replace('SEMINARY', data['seminary']['url']);
linkCharacter = linkCharacter.replace('SEMINARY', data['seminary']['url']);
$.each(data['characters'], function(key, character) {
var urlAvatar = linkAvatar.replace('CHARACTERTYPE', character['charactertype_url']).replace('XPLEVEL', character['xplevel']['level']);
var urlCharacter = linkCharacter.replace('CHARACTER', character['url']);
var urlUser = linkUser.replace('USER', character['user']['url']);
$("#characterlist").append(
"<li class=\"cf\">" +
"<img src=\"" + urlAvatar + "\" />" +
"<p><a href=\"" + urlCharacter + "\">" + character['name'] + "</a><span>" + character['xps'] + " <?=_('XPs')?></span></p>" +
"<p>" +
"<small><a href=\"" + urlUser + "\">" + character['user']['username'] + "</a></small>\n" +
(character['characterroles'].length > 0 ? "<small>(" + character['characterroles'].join(', ') + ")</small>" : '') +
"</p>" +
"<p class=\"chrflds\">" + $.map(character['characterfields'], function(val, i) {
return val['value'];
}).join('</p>\n<p class="chrflds">') + "</p>" +
"</li>"
);
});
if(data['more']) {
$("#show-more").attr('href', linkPage.replace('PAGE', page+1));
}
else {
$("#show-more").remove();
$("#show-all").remove();
}
});
request.fail(function (jqXHR, textStatus, errorThrown) {
window.location.href = linkPage.replace('PAGE', page);
});
event.preventDefault();
return false;
});
</script>