add AJAX to Character listing
This commit is contained in:
parent
dcdd274a55
commit
688d6d6382
4 changed files with 207 additions and 148 deletions
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
25
views/ajax/characters/index.tpl
Normal file
25
views/ajax/characters/index.tpl
Normal 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)
|
||||||
|
))?>
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue