From ebb624fb73992784a9299e9d5b7b48fcce0e8d91 Mon Sep 17 00:00:00 2001 From: coderkun Date: Tue, 24 Jun 2014 21:54:23 +0200 Subject: [PATCH] add Character name filter for Character listing (issue #316) --- controllers/CharactersController.inc | 7 +++-- models/CharactersModel.inc | 40 ++++++++++++++++------------ views/html/characters/index.tpl | 7 +++-- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index 1ba51fde..63b9e344 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -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); diff --git a/models/CharactersModel.inc b/models/CharactersModel.inc index 4b861a27..d6c02e92 100644 --- a/models/CharactersModel.inc +++ b/models/CharactersModel.inc @@ -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', diff --git a/views/html/characters/index.tpl b/views/html/characters/index.tpl index e808c221..e79f1dd0 100644 --- a/views/html/characters/index.tpl +++ b/views/html/characters/index.tpl @@ -16,7 +16,8 @@
-

Sortierung:

+ +

:

- + : +
+