add Character name filter for Character listing (issue #316)

This commit is contained in:
coderkun 2014-06-24 21:54:23 +02:00
commit ebb624fb73
3 changed files with 33 additions and 21 deletions

View file

@ -78,11 +78,13 @@
// 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;
}
@ -90,8 +92,8 @@
// 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']);
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $limit, $offset);
$charactersCount = $this->Characters->getCharactersForSeminaryCount($seminary['id'], $charactername);
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $charactername, $limit, $offset);
foreach($characters as &$character)
{
$character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
@ -114,6 +116,7 @@
$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);

View file

@ -64,16 +64,18 @@
* Get count of Characters for a Seminary.
*
* @param int $seminaryId ID of the Seminary
* @param string $charactername Only get Characters with the given name (optional)
* @return int Count of Characters
*/
public function getCharactersForSeminaryCount($seminaryId)
public function getCharactersForSeminaryCount($seminaryId, $charactername=null)
{
$data = $this->db->query(
'SELECT count(DISTINCT characters.id) AS c '.
'FROM characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ?',
'WHERE seminaries.id = ? '.
(!is_null($charactername) ? sprintf('AND characters.name LIKE \'%%%s%%\'', $charactername) : null),
'i',
$seminaryId
);
@ -118,11 +120,12 @@
*
* @param int $seminaryId ID of the Seminary
* @param string $sort Field to sort by
* @param string $charactername Only get Characters with the given name (optional)
* @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)
public function getCharactersForSeminarySorted($seminaryId, $sort, $charactername, $limit=null, $offset=0)
{
switch($sort)
{
@ -136,24 +139,25 @@
);
return $this->db->query(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ? '.
(!is_null($charactername) ? sprintf(' AND characters.name LIKE \'%%%s%%\' ', $charactername) : null).
sprintf(
'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ? '.
'ORDER BY %s.%s %s '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'ORDER BY %s.%s %s ',
($sort == 'xps' ? 'cache_characters' : 'characters'),
$sort,
$orders[$sort]
),
).
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'i',
$seminaryId
);
@ -173,6 +177,7 @@
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.
'WHERE seminaries.id = ? '.
(!is_null($charactername) ? sprintf(' AND characters.name LIKE \'%%%s%%\' ', $charactername) : null).
'ORDER BY characterroles.id IS NULL, characterroles.id ASC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'i',
@ -194,6 +199,7 @@
'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 = ? '.
(!is_null($charactername) ? sprintf(' AND characters.name LIKE \'%%%s%%\' ', $charactername) : null).
'ORDER BY characters_seminarycharacterfields.value ASC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'si',

View file

@ -16,7 +16,8 @@
<form method="get">
<fieldset class="filter">
<p><small>Sortierung:</small></p>
<legend><?=_('Filters')?></legend>
<p><small><?=_('Sortorder')?>:</small></p>
<select name="sortorder" onchange="this.form.submit();">
<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>
@ -26,8 +27,10 @@
<option value="<?=$characterfield['url']?>" <?php if($sortorder == $characterfield['url']) : ?>selected="selected"<?php endif ?>><?=$characterfield['title']?></option>
<?php endforeach ?>
</select>
<noscript><input type="submit" value="<?=_('Sort list')?>" /></noscript>
<label for="charactername"><?=_('Character name')?></label>:
<input id="charactername" type="text" name="charactername" placeholder="<?=_('Character name')?>" value="<?=$charactername?>" />
</fieldset>
<input type="submit" value="<?=_('Apply filters')?>" />
</form>
<ul id="characterlist" class="admnql">