implement sort functionality for listing and managing Characters (Issue #177)

This commit is contained in:
coderkun 2014-04-29 21:40:12 +02:00
commit c17ad8a4ac
5 changed files with 238 additions and 99 deletions

View file

@ -69,40 +69,46 @@
// Get Seminary
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
// Set default properties to show
$properties = array(
'username',
'xps'
);
// Select proprties to show
if($this->request->getRequestMethod() == 'POST')
{
$properties = $this->request->getPostParam('properties');
if(!is_array($properties)) {
$properties = array();
}
}
// Get Seminarycharacterfields
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
// Get registered Characters
$characters = $this->Characters->getCharactersForSeminary($seminary['id']);
foreach($characters as &$character)
{
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']);
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
$character['user'] = $this->Users->getUserById($character['user_id']);
$character['characterfields'] = $this->Seminarycharacterfields->getFieldsForCharacter($character['id']);
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
$character['characterfields'] = array();
foreach($this->Seminarycharacterfields->getFieldsForCharacter($character['id']) as &$value) {
$character['characterfields'][$value['url']] = $value;
}
}
// Get Seminarycharacterfields
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
// 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);
}
// Pass data to view
$this->set('seminary', $seminary);
$this->set('characters', $characters);
$this->set('characterfields', $characterfields);
$this->set('properties', $properties);
$this->set('sortorder', $sortorder);
}
@ -316,14 +322,18 @@
);
$selectedCharacters = array();
global $sortorder;
if($this->request->getRequestMethod() == 'POST')
{
// Set sortorder
$sortorder = $this->request->getPostParam('sortorder');
// Do action
$selectedCharacters = $this->request->getPostParam('characters');
if(!is_null($this->request->getPostParam('actions')) && count($this->request->getPostParam('actions')) > 0 && !is_null($this->request->getPostParam('characters')) && count($this->request->getPostParam('characters')) > 0)
{
$actions = $this->request->getPostParam('actions');
$action = array_keys($actions)[0];
$selectedCharacters = $this->request->getPostParam('characters');
switch($action)
{
@ -369,34 +379,47 @@
break;
}
}
// Properties to show
$properties = $this->request->getPostParam('properties');
if(!is_array($properties)) {
$properties = array();
}
}
// Get Seminarycharacterfields
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
// Get registered Characters
$characters = $this->Characters->getCharactersForSeminary($seminary['id']);
foreach($characters as &$character)
{
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']);
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
$character['user'] = $this->Users->getUserById($character['user_id']);
$character['characterfields'] = $this->Seminarycharacterfields->getFieldsForCharacter($character['id']);
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
$character['characterfields'] = array();
foreach($this->Seminarycharacterfields->getFieldsForCharacter($character['id']) as &$value) {
$character['characterfields'][$value['url']] = $value;
}
}
// Get Seminarycharacterfields
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
// Sort Characters
$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);
}
// Pass data to view
$this->set('seminary', $seminary);
$this->set('characters', $characters);
$this->set('characterfields', $characterfields);
$this->set('properties', $properties);
$this->set('selectedCharacters', $selectedCharacters);
$this->set('sortorder', $sortorder);
}
@ -425,6 +448,115 @@
}
}
/**
* 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)
{
$roles = array('admin', 'moderator', 'user', 'guest');
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 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;
}
}
?>

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: The Legend of Z\n"
"POT-Creation-Date: 2014-04-29 13:33+0100\n"
"PO-Revision-Date: 2014-04-29 13:33+0100\n"
"POT-Creation-Date: 2014-04-29 21:29+0100\n"
"PO-Revision-Date: 2014-04-29 21:29+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
@ -162,8 +162,8 @@ msgid "Own progress: %d%%"
msgstr "Persönlicher Fortschritt: %d%%"
#: views/html/achievements/index.tpl:52
#: views/html/charactergroups/group.tpl:26
#: views/html/charactergroups/managegroup.tpl:19
#: views/html/charactergroups/group.tpl:30
#: views/html/charactergroups/managegroup.tpl:23
#: views/html/characters/character.tpl:36 views/html/seminarybar/index.tpl:7
msgid "Rank"
msgstr "Platz"
@ -337,18 +337,18 @@ msgstr "Gruppengruppe bearbeiten"
msgid "Manage Character group"
msgstr "Gruppe verwalten"
#: views/html/charactergroups/group.tpl:28
#: views/html/charactergroups/managegroup.tpl:21
#: views/html/charactergroups/group.tpl:32
#: views/html/charactergroups/managegroup.tpl:25
msgid "Members"
msgstr "Mitglieder"
#: views/html/charactergroups/group.tpl:28
#: views/html/charactergroups/managegroup.tpl:21
#: views/html/charactergroups/group.tpl:32
#: views/html/charactergroups/managegroup.tpl:25
msgid "Member"
msgstr "Mitglied"
#: views/html/charactergroups/group.tpl:32
#: views/html/charactergroups/managegroup.tpl:25
#: views/html/charactergroups/group.tpl:36
#: views/html/charactergroups/managegroup.tpl:29
#: views/html/characters/character.tpl:11
#: views/html/characters/character.tpl:13 views/html/characters/index.tpl:9
#: views/html/characters/manage.tpl:8 views/html/seminarymenu/index.tpl:2
@ -356,7 +356,7 @@ msgstr "Mitglied"
msgid "Characters"
msgstr "Charaktere"
#: views/html/charactergroups/group.tpl:47
#: views/html/charactergroups/group.tpl:51
#: views/html/charactergroups/groupsgroup.tpl:27
#, php-format
msgid "%s-Quests"
@ -370,19 +370,19 @@ msgstr "Neue Gruppe"
msgid "Create new Character groups-group"
msgstr "Neue Gruppengruppe"
#: views/html/charactergroups/managegroup.tpl:42
#: views/html/charactergroups/managegroup.tpl:46
msgid "Remove Characters"
msgstr "Entferne Charaktere"
#: views/html/charactergroups/managegroup.tpl:46
#: views/html/charactergroups/managegroup.tpl:50
msgid "Filter Characters"
msgstr "Filtere Charaktere"
#: views/html/charactergroups/managegroup.tpl:52
#: views/html/charactergroups/managegroup.tpl:56
msgid "Add Characters"
msgstr "Füge Charaktere hinzu"
#: views/html/charactergroups/managegroup.tpl:58
#: views/html/charactergroups/managegroup.tpl:62
#: views/html/questgroups/questgroup.tpl:57 views/html/quests/create.tpl:9
#: views/html/quests/index.tpl:9
msgid "Quests"
@ -427,18 +427,18 @@ msgstr "Ranking"
#: views/html/characters/character.tpl:67
#: views/html/characters/character.tpl:73
#: views/html/characters/character.tpl:79
#: views/html/characters/character.tpl:91 views/html/quests/index.tpl:37
#: views/html/characters/character.tpl:97 views/html/quests/index.tpl:37
#: views/html/seminaries/index.tpl:29 views/html/seminarybar/index.tpl:6
#: views/html/seminarybar/index.tpl:42
#, php-format
msgid "%dXPs"
msgstr "%dXP"
#: views/html/characters/character.tpl:100 views/html/seminarybar/index.tpl:14
#: views/html/characters/character.tpl:106 views/html/seminarybar/index.tpl:14
msgid "Last Quest"
msgstr "Letzter Speicherpunkt"
#: views/html/characters/character.tpl:106
#: views/html/characters/character.tpl:112
msgid "Topic progress"
msgstr "Thematischer Fortschritt"
@ -446,54 +446,44 @@ msgstr "Thematischer Fortschritt"
msgid "Manage"
msgstr "Verwalten"
#: views/html/characters/index.tpl:20 views/html/characters/manage.tpl:15
#: views/html/error/index.tpl:8 views/html/error/index.tpl:9
#: views/html/introduction/index.tpl:7 views/html/users/create.tpl:9
#: views/html/users/create.tpl:10 views/html/users/edit.tpl:9
#: views/html/users/edit.tpl:10 views/html/users/login.tpl:12
#: views/html/users/login.tpl:13 views/html/users/register.tpl:81
#: views/html/users/register.tpl:82
msgid "Username"
msgstr "Benutzername"
#: views/html/characters/index.tpl:20 views/html/characters/register.tpl:42
#: views/html/characters/register.tpl:43
msgid "Character name"
msgstr "Charaktername"
#: views/html/characters/index.tpl:21 views/html/characters/manage.tpl:16
#: views/html/quests/create.tpl:29 views/html/quests/create.tpl:30
#: views/html/characters/index.tpl:21 views/html/quests/create.tpl:29
#: views/html/quests/create.tpl:30
msgid "XPs"
msgstr "XP"
#: views/html/characters/index.tpl:22 views/html/characters/manage.tpl:17
#: views/html/users/user.tpl:37
msgid "Roles"
msgstr "Rollen"
#: views/html/characters/index.tpl:22
msgid "Role"
msgstr "Rolle"
#: views/html/characters/index.tpl:27 views/html/characters/manage.tpl:22
msgid "Set properties"
msgstr "Setze Eigenschaften"
#: views/html/characters/index.tpl:27
msgid "Sort list"
msgstr "Liste sortieren"
#: views/html/characters/index.tpl:39 views/html/characters/manage.tpl:36
#: views/html/characters/manage.tpl:53 views/html/characters/manage.tpl:61
#: views/html/characters/index.tpl:37 views/html/characters/manage.tpl:32
#: views/html/characters/manage.tpl:47 views/html/characters/manage.tpl:55
msgid "Admin"
msgstr "Administrator"
#: views/html/characters/index.tpl:40 views/html/characters/manage.tpl:37
#: views/html/characters/manage.tpl:54 views/html/characters/manage.tpl:62
#: views/html/characters/index.tpl:38 views/html/characters/manage.tpl:33
#: views/html/characters/manage.tpl:48 views/html/characters/manage.tpl:56
msgid "Moderator"
msgstr "Moderator"
#: views/html/characters/index.tpl:41 views/html/characters/manage.tpl:38
#: views/html/characters/manage.tpl:56 views/html/characters/manage.tpl:64
#: views/html/characters/index.tpl:39 views/html/characters/manage.tpl:34
#: views/html/characters/manage.tpl:50 views/html/characters/manage.tpl:58
msgid "User"
msgstr "Benutzer"
#: views/html/characters/manage.tpl:25
msgid "Selection"
msgstr "Auswahl"
#: views/html/characters/manage.tpl:51
#: views/html/characters/manage.tpl:45
msgid "Add role"
msgstr "Füge Rolle hinzu"
#: views/html/characters/manage.tpl:59
#: views/html/characters/manage.tpl:53
msgid "Remove role"
msgstr "Entferne Rolle"
@ -527,10 +517,6 @@ msgstr "Der Charaktername ist ungültig"
msgid "Character properties"
msgstr "Charaktereigenschaften"
#: views/html/characters/register.tpl:42 views/html/characters/register.tpl:43
msgid "Character name"
msgstr "Charaktername"
#: views/html/characters/register.tpl:60
#, php-format
msgid "The Seminary field “%s” is invalid"
@ -546,6 +532,15 @@ msgstr "Kursfelder"
msgid "Login"
msgstr "Login"
#: views/html/error/index.tpl:8 views/html/error/index.tpl:9
#: views/html/introduction/index.tpl:7 views/html/users/create.tpl:9
#: views/html/users/create.tpl:10 views/html/users/edit.tpl:9
#: views/html/users/edit.tpl:10 views/html/users/login.tpl:12
#: views/html/users/login.tpl:13 views/html/users/register.tpl:81
#: views/html/users/register.tpl:82
msgid "Username"
msgstr "Benutzername"
#: views/html/error/index.tpl:10 views/html/error/index.tpl:11
#: views/html/introduction/index.tpl:8 views/html/users/create.tpl:17
#: views/html/users/create.tpl:18 views/html/users/edit.tpl:16
@ -737,7 +732,7 @@ msgstr "speichern"
msgid "Create new seminary"
msgstr "Neuen Kurs erstellen"
#: views/html/seminaries/index.tpl:32
#: views/html/seminaries/index.tpl:33
#, php-format
msgid "created by %s on %s"
msgstr "erstellt von %s am %s"
@ -903,6 +898,16 @@ msgstr "Das Passwort ist ungültig"
msgid "Register"
msgstr "Registrieren"
#: views/html/users/user.tpl:37
msgid "Roles"
msgstr "Rollen"
#~ msgid "Set properties"
#~ msgstr "Setze Eigenschaften"
#~ msgid "Selection"
#~ msgstr "Auswahl"
#, fuzzy
#~ msgid "%d XPs"
#~ msgstr "%dXP"

View file

@ -14,16 +14,17 @@
</nav>
<?php endif ?>
<form method="post">
<form method="get">
<fieldset class="filter">
<select name="">
<option value="">Charaktername</option>
<option value="">XP</option>
<option value="">Rolle</option>
<option value="">Matrikelnummer</option>
<option value="">Studiengang</option>
<select name="sortorder">
<option value="charactername" <?php if($sortorder == 'charactername') : ?>selected="selected"<?php endif ?>><?=_('Character name')?></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>
<?php foreach($characterfields as &$characterfield) : ?>
<option value="<?=$characterfield['url']?>" <?php if($sortorder == $characterfield['url']) : ?>selected="selected"<?php endif ?>><?=$characterfield['title']?></option>
<?php endforeach ?>
</select>
<input type="submit" name="" value="Liste sortieren" />
<input type="submit" value="<?=_('Sort list')?>" />
</fieldset>
</form>

View file

@ -11,14 +11,15 @@
<form method="post">
<fieldset class="filter">
<select name="">
<option value="">Charaktername</option>
<option value="">XP</option>
<option value="">Rolle</option>
<option value="">Matrikelnummer</option>
<option value="">Studiengang</option>
<select name="sortorder">
<option value="charactername" <?php if($sortorder == 'charactername') : ?>selected="selected"<?php endif ?>><?=_('Character name')?></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>
<?php foreach($characterfields as &$characterfield) : ?>
<option value="<?=$characterfield['url']?>" <?php if($sortorder == $characterfield['url']) : ?>selected="selected"<?php endif ?>><?=$characterfield['title']?></option>
<?php endforeach ?>
</select>
<input type="submit" name="" value="Liste sortieren" />
<input type="submit" value="<?=_('Sort list')?>" />
</fieldset>
<fieldset>
<ul class="admnql">