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 // Get Seminary
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
// Set default properties to show // Get Seminarycharacterfields
$properties = array( $characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']);
'username',
'xps'
);
// Select proprties to show
if($this->request->getRequestMethod() == 'POST')
{
$properties = $this->request->getPostParam('properties');
if(!is_array($properties)) {
$properties = array();
}
}
// Get registered Characters // Get registered Characters
$characters = $this->Characters->getCharactersForSeminary($seminary['id']); $characters = $this->Characters->getCharactersForSeminary($seminary['id']);
foreach($characters as &$character) foreach($characters as &$character)
{ {
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); $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['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 // Sort Characters
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']); 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 // Pass data to view
$this->set('seminary', $seminary); $this->set('seminary', $seminary);
$this->set('characters', $characters); $this->set('characters', $characters);
$this->set('characterfields', $characterfields); $this->set('characterfields', $characterfields);
$this->set('properties', $properties); $this->set('sortorder', $sortorder);
} }
@ -316,14 +322,18 @@
); );
$selectedCharacters = array(); $selectedCharacters = array();
global $sortorder;
if($this->request->getRequestMethod() == 'POST') if($this->request->getRequestMethod() == 'POST')
{ {
// Set sortorder
$sortorder = $this->request->getPostParam('sortorder');
// Do action // 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) 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'); $actions = $this->request->getPostParam('actions');
$action = array_keys($actions)[0]; $action = array_keys($actions)[0];
$selectedCharacters = $this->request->getPostParam('characters');
switch($action) switch($action)
{ {
@ -369,34 +379,47 @@
break; 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 // Get registered Characters
$characters = $this->Characters->getCharactersForSeminary($seminary['id']); $characters = $this->Characters->getCharactersForSeminary($seminary['id']);
foreach($characters as &$character) foreach($characters as &$character)
{ {
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); $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['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 // Sort Characters
$characterfields = $this->Seminarycharacterfields->getFieldsForSeminary($seminary['id']); $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 // Pass data to view
$this->set('seminary', $seminary); $this->set('seminary', $seminary);
$this->set('characters', $characters); $this->set('characters', $characters);
$this->set('characterfields', $characterfields); $this->set('characterfields', $characterfields);
$this->set('properties', $properties);
$this->set('selectedCharacters', $selectedCharacters); $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 "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: The Legend of Z\n" "Project-Id-Version: The Legend of Z\n"
"POT-Creation-Date: 2014-04-29 13:33+0100\n" "POT-Creation-Date: 2014-04-29 21:29+0100\n"
"PO-Revision-Date: 2014-04-29 13:33+0100\n" "PO-Revision-Date: 2014-04-29 21:29+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: de_DE\n" "Language: de_DE\n"
@ -162,8 +162,8 @@ msgid "Own progress: %d%%"
msgstr "Persönlicher Fortschritt: %d%%" msgstr "Persönlicher Fortschritt: %d%%"
#: views/html/achievements/index.tpl:52 #: views/html/achievements/index.tpl:52
#: views/html/charactergroups/group.tpl:26 #: views/html/charactergroups/group.tpl:30
#: views/html/charactergroups/managegroup.tpl:19 #: views/html/charactergroups/managegroup.tpl:23
#: views/html/characters/character.tpl:36 views/html/seminarybar/index.tpl:7 #: views/html/characters/character.tpl:36 views/html/seminarybar/index.tpl:7
msgid "Rank" msgid "Rank"
msgstr "Platz" msgstr "Platz"
@ -337,18 +337,18 @@ msgstr "Gruppengruppe bearbeiten"
msgid "Manage Character group" msgid "Manage Character group"
msgstr "Gruppe verwalten" msgstr "Gruppe verwalten"
#: views/html/charactergroups/group.tpl:28 #: views/html/charactergroups/group.tpl:32
#: views/html/charactergroups/managegroup.tpl:21 #: views/html/charactergroups/managegroup.tpl:25
msgid "Members" msgid "Members"
msgstr "Mitglieder" msgstr "Mitglieder"
#: views/html/charactergroups/group.tpl:28 #: views/html/charactergroups/group.tpl:32
#: views/html/charactergroups/managegroup.tpl:21 #: views/html/charactergroups/managegroup.tpl:25
msgid "Member" msgid "Member"
msgstr "Mitglied" msgstr "Mitglied"
#: views/html/charactergroups/group.tpl:32 #: views/html/charactergroups/group.tpl:36
#: views/html/charactergroups/managegroup.tpl:25 #: views/html/charactergroups/managegroup.tpl:29
#: views/html/characters/character.tpl:11 #: views/html/characters/character.tpl:11
#: views/html/characters/character.tpl:13 views/html/characters/index.tpl:9 #: views/html/characters/character.tpl:13 views/html/characters/index.tpl:9
#: views/html/characters/manage.tpl:8 views/html/seminarymenu/index.tpl:2 #: views/html/characters/manage.tpl:8 views/html/seminarymenu/index.tpl:2
@ -356,7 +356,7 @@ msgstr "Mitglied"
msgid "Characters" msgid "Characters"
msgstr "Charaktere" msgstr "Charaktere"
#: views/html/charactergroups/group.tpl:47 #: views/html/charactergroups/group.tpl:51
#: views/html/charactergroups/groupsgroup.tpl:27 #: views/html/charactergroups/groupsgroup.tpl:27
#, php-format #, php-format
msgid "%s-Quests" msgid "%s-Quests"
@ -370,19 +370,19 @@ msgstr "Neue Gruppe"
msgid "Create new Character groups-group" msgid "Create new Character groups-group"
msgstr "Neue Gruppengruppe" msgstr "Neue Gruppengruppe"
#: views/html/charactergroups/managegroup.tpl:42 #: views/html/charactergroups/managegroup.tpl:46
msgid "Remove Characters" msgid "Remove Characters"
msgstr "Entferne Charaktere" msgstr "Entferne Charaktere"
#: views/html/charactergroups/managegroup.tpl:46 #: views/html/charactergroups/managegroup.tpl:50
msgid "Filter Characters" msgid "Filter Characters"
msgstr "Filtere Charaktere" msgstr "Filtere Charaktere"
#: views/html/charactergroups/managegroup.tpl:52 #: views/html/charactergroups/managegroup.tpl:56
msgid "Add Characters" msgid "Add Characters"
msgstr "Füge Charaktere hinzu" 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/questgroups/questgroup.tpl:57 views/html/quests/create.tpl:9
#: views/html/quests/index.tpl:9 #: views/html/quests/index.tpl:9
msgid "Quests" msgid "Quests"
@ -427,18 +427,18 @@ msgstr "Ranking"
#: views/html/characters/character.tpl:67 #: views/html/characters/character.tpl:67
#: views/html/characters/character.tpl:73 #: views/html/characters/character.tpl:73
#: views/html/characters/character.tpl:79 #: 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/seminaries/index.tpl:29 views/html/seminarybar/index.tpl:6
#: views/html/seminarybar/index.tpl:42 #: views/html/seminarybar/index.tpl:42
#, php-format #, php-format
msgid "%dXPs" msgid "%dXPs"
msgstr "%dXP" 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" msgid "Last Quest"
msgstr "Letzter Speicherpunkt" msgstr "Letzter Speicherpunkt"
#: views/html/characters/character.tpl:106 #: views/html/characters/character.tpl:112
msgid "Topic progress" msgid "Topic progress"
msgstr "Thematischer Fortschritt" msgstr "Thematischer Fortschritt"
@ -446,54 +446,44 @@ msgstr "Thematischer Fortschritt"
msgid "Manage" msgid "Manage"
msgstr "Verwalten" msgstr "Verwalten"
#: views/html/characters/index.tpl:20 views/html/characters/manage.tpl:15 #: views/html/characters/index.tpl:20 views/html/characters/register.tpl:42
#: views/html/error/index.tpl:8 views/html/error/index.tpl:9 #: views/html/characters/register.tpl:43
#: views/html/introduction/index.tpl:7 views/html/users/create.tpl:9 msgid "Character name"
#: views/html/users/create.tpl:10 views/html/users/edit.tpl:9 msgstr "Charaktername"
#: 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:21 views/html/characters/manage.tpl:16 #: views/html/characters/index.tpl:21 views/html/quests/create.tpl:29
#: views/html/quests/create.tpl:29 views/html/quests/create.tpl:30 #: views/html/quests/create.tpl:30
msgid "XPs" msgid "XPs"
msgstr "XP" msgstr "XP"
#: views/html/characters/index.tpl:22 views/html/characters/manage.tpl:17 #: views/html/characters/index.tpl:22
#: views/html/users/user.tpl:37 msgid "Role"
msgid "Roles" msgstr "Rolle"
msgstr "Rollen"
#: views/html/characters/index.tpl:27 views/html/characters/manage.tpl:22 #: views/html/characters/index.tpl:27
msgid "Set properties" msgid "Sort list"
msgstr "Setze Eigenschaften" msgstr "Liste sortieren"
#: views/html/characters/index.tpl:39 views/html/characters/manage.tpl:36 #: views/html/characters/index.tpl:37 views/html/characters/manage.tpl:32
#: views/html/characters/manage.tpl:53 views/html/characters/manage.tpl:61 #: views/html/characters/manage.tpl:47 views/html/characters/manage.tpl:55
msgid "Admin" msgid "Admin"
msgstr "Administrator" msgstr "Administrator"
#: views/html/characters/index.tpl:40 views/html/characters/manage.tpl:37 #: views/html/characters/index.tpl:38 views/html/characters/manage.tpl:33
#: views/html/characters/manage.tpl:54 views/html/characters/manage.tpl:62 #: views/html/characters/manage.tpl:48 views/html/characters/manage.tpl:56
msgid "Moderator" msgid "Moderator"
msgstr "Moderator" msgstr "Moderator"
#: views/html/characters/index.tpl:41 views/html/characters/manage.tpl:38 #: views/html/characters/index.tpl:39 views/html/characters/manage.tpl:34
#: views/html/characters/manage.tpl:56 views/html/characters/manage.tpl:64 #: views/html/characters/manage.tpl:50 views/html/characters/manage.tpl:58
msgid "User" msgid "User"
msgstr "Benutzer" msgstr "Benutzer"
#: views/html/characters/manage.tpl:25 #: views/html/characters/manage.tpl:45
msgid "Selection"
msgstr "Auswahl"
#: views/html/characters/manage.tpl:51
msgid "Add role" msgid "Add role"
msgstr "Füge Rolle hinzu" msgstr "Füge Rolle hinzu"
#: views/html/characters/manage.tpl:59 #: views/html/characters/manage.tpl:53
msgid "Remove role" msgid "Remove role"
msgstr "Entferne Rolle" msgstr "Entferne Rolle"
@ -527,10 +517,6 @@ msgstr "Der Charaktername ist ungültig"
msgid "Character properties" msgid "Character properties"
msgstr "Charaktereigenschaften" 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 #: views/html/characters/register.tpl:60
#, php-format #, php-format
msgid "The Seminary field “%s” is invalid" msgid "The Seminary field “%s” is invalid"
@ -546,6 +532,15 @@ msgstr "Kursfelder"
msgid "Login" msgid "Login"
msgstr "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/error/index.tpl:10 views/html/error/index.tpl:11
#: views/html/introduction/index.tpl:8 views/html/users/create.tpl:17 #: views/html/introduction/index.tpl:8 views/html/users/create.tpl:17
#: views/html/users/create.tpl:18 views/html/users/edit.tpl:16 #: views/html/users/create.tpl:18 views/html/users/edit.tpl:16
@ -737,7 +732,7 @@ msgstr "speichern"
msgid "Create new seminary" msgid "Create new seminary"
msgstr "Neuen Kurs erstellen" msgstr "Neuen Kurs erstellen"
#: views/html/seminaries/index.tpl:32 #: views/html/seminaries/index.tpl:33
#, php-format #, php-format
msgid "created by %s on %s" msgid "created by %s on %s"
msgstr "erstellt von %s am %s" msgstr "erstellt von %s am %s"
@ -903,6 +898,16 @@ msgstr "Das Passwort ist ungültig"
msgid "Register" msgid "Register"
msgstr "Registrieren" msgstr "Registrieren"
#: views/html/users/user.tpl:37
msgid "Roles"
msgstr "Rollen"
#~ msgid "Set properties"
#~ msgstr "Setze Eigenschaften"
#~ msgid "Selection"
#~ msgstr "Auswahl"
#, fuzzy #, fuzzy
#~ msgid "%d XPs" #~ msgid "%d XPs"
#~ msgstr "%dXP" #~ msgstr "%dXP"

View file

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

View file

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