diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index 7d1e20a8..f0dca5c5 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -68,7 +68,7 @@ * @throws IdNotFoundException * @param string $seminaryUrl URL-Title of a Seminary */ - public function index($seminaryUrl) + public function index($seminaryUrl, $all=null) { // Get Seminary $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); @@ -76,8 +76,22 @@ // Get Seminarycharacterfields $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 - $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) { $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 $this->addTitleLocalized('Characters'); @@ -115,8 +111,12 @@ // Pass data to view $this->set('seminary', $seminary); $this->set('characters', $characters); + $this->set('charactersCount', $charactersCount); $this->set('characterfields', $characterfields); $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; - } - } ?> diff --git a/models/CharactersModel.inc b/models/CharactersModel.inc index 8af3821d..7bf578e1 100644 --- a/models/CharactersModel.inc +++ b/models/CharactersModel.inc @@ -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. * @@ -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. * diff --git a/views/ajax/characters/index.tpl b/views/ajax/characters/index.tpl new file mode 100644 index 00000000..dfeafd07 --- /dev/null +++ b/views/ajax/characters/index.tpl @@ -0,0 +1,25 @@ + + $seminary, + 'characters' => $characters, + 'more' => (($page*$limit) < $charactersCount) +))?> diff --git a/views/html/characters/index.tpl b/views/html/characters/index.tpl index 6e547654..e808c221 100644 --- a/views/html/characters/index.tpl +++ b/views/html/characters/index.tpl @@ -18,10 +18,10 @@

Sortierung: