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 // Set sort order and page
$sortorder = 'name'; $sortorder = 'name';
$charactername = null;
$page = 1; $page = 1;
if($this->request->getRequestMethod() == 'GET') if($this->request->getRequestMethod() == 'GET')
{ {
$sortorder = $this->request->getGetParam('sortorder'); $sortorder = $this->request->getGetParam('sortorder');
$sortorder = !empty($sortorder) ? $sortorder : 'name'; $sortorder = !empty($sortorder) ? $sortorder : 'name';
$charactername = (!is_null($this->request->getGetParam('charactername'))) ? $this->request->getGetParam('charactername') : $charactername;
$page = $this->request->getGetParam('page'); $page = $this->request->getGetParam('page');
$page = !empty($page) ? intval($page) : 1; $page = !empty($page) ? intval($page) : 1;
} }
@ -90,8 +92,8 @@
// Get registered Characters // Get registered Characters
$limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['lists_limit'] : null; $limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['lists_limit'] : null;
$offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0; $offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0;
$charactersCount = $this->Characters->getCharactersForSeminaryCount($seminary['id']); $charactersCount = $this->Characters->getCharactersForSeminaryCount($seminary['id'], $charactername);
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $limit, $offset); $characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $charactername, $limit, $offset);
foreach($characters as &$character) foreach($characters as &$character)
{ {
$character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']); $character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
@ -114,6 +116,7 @@
$this->set('charactersCount', $charactersCount); $this->set('charactersCount', $charactersCount);
$this->set('characterfields', $characterfields); $this->set('characterfields', $characterfields);
$this->set('sortorder', $sortorder); $this->set('sortorder', $sortorder);
$this->set('charactername', $charactername);
$this->set('all', $all); $this->set('all', $all);
$this->set('page', $page); $this->set('page', $page);
$this->set('limit', $limit); $this->set('limit', $limit);

View file

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

View file

@ -16,7 +16,8 @@
<form method="get"> <form method="get">
<fieldset class="filter"> <fieldset class="filter">
<p><small>Sortierung:</small></p> <legend><?=_('Filters')?></legend>
<p><small><?=_('Sortorder')?>:</small></p>
<select name="sortorder" onchange="this.form.submit();"> <select name="sortorder" onchange="this.form.submit();">
<option value="name" <?php if($sortorder == 'name') : ?>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>
@ -26,8 +27,10 @@
<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 ?>
</select> </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> </fieldset>
<input type="submit" value="<?=_('Apply filters')?>" />
</form> </form>
<ul id="characterlist" class="admnql"> <ul id="characterlist" class="admnql">