listing of all Quests of a Seminary: improve filtering, sort Quests and do not load all at once (Issue #71)

This commit is contained in:
coderkun 2014-05-15 23:37:26 +02:00
commit f863ff9678
6 changed files with 142 additions and 56 deletions

View file

@ -132,7 +132,8 @@
public static $misc = array(
'ranking_range' => 2,
'achievements_range' => 3,
'title_delimiter' => ' '
'title_delimiter' => ' ',
'questlist_limit' => 10
);
@ -212,6 +213,7 @@
array('^questgroups/([^/]+)/(create)/?$', 'questgroups/$2/$1', true),
array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true),
array('^quests/([^/]+)/?$', 'quests/index/$1', true),
array('^quests/([^/]+)/all/?$', 'quests/index/$1/all', true),
array('^quests/([^/]+)/(create|createmedia)/?$', 'quests/$2/$1' , true),
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions)/?$', 'quests/$4/$1/$2/$3', true),
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submission)/([^/]+)/?$', 'quests/$4/$1/$2/$3/$5', true),
@ -250,7 +252,7 @@
array('^seminaries/seminary/(.*)$', 'seminaries/$1', false),
array('^questgroups/create/(.*)$', 'questgroups/$2/$1', true),
array('^questgroups/questgroup/(.*)$', 'questgroups/$1', true),
array('^quests/index/([^/]+)$', 'quests/$1', true),
array('^quests/index/(.+)$', 'quests/$1', true),
array('^quests/quest/(.*)$', 'quests/$1', true),
array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true),
array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true),

View file

@ -74,53 +74,49 @@
* List all Quests for a Seminary.
*
* @param string $seminaryUrl URL-Title of Seminary
* @param string $all Show all Quests
*/
public function index($seminaryUrl)
public function index($seminaryUrl, $all=null)
{
// Get seminary
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
// Prepare filters
$filters = array(
'questgroups' => array(),
'questtypes' => array()
);
// Get selected filters
$selectedFilters = array(
'questgroup' => "0",
'questtype' => ""
);
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('filters'))) {
$selectedFilters = $this->request->getPostParam('filters');
// Set filters
$selectedQuestgroup = null;
$selectedQuesttype = null;
if($this->request->getRequestMethod() == 'GET')
{
$selectedQuestgroup = !empty($this->request->getGetParam('questgroup')) ? $this->request->getGetParam('questgroup') : null;
$selectedQuesttype = !empty($this->request->getGetParam('questtype')) ? $this->request->getGetParam('questtype') : null;
}
// Get Quests
$quests = array();
foreach($this->Quests->getQuestsForSeminary($seminary['id']) as $quest)
$limit = (is_null($all) && is_null($selectedQuestgroup) && is_null($selectedQuesttype)) ? \nre\configs\AppConfig::$misc['questlist_limit'] : null;
$quests = $this->Quests->getQuestsForSeminary($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit);
foreach($quests as &$quest)
{
// Get Questgroup
$quest['questgroup'] = $this->Questgroups->getQuestgroupById($quest['questgroup_id']);
if($selectedFilters['questgroup'] != "0" && $selectedFilters['questgroup'] != $quest['questgroup']['id']) {
continue;
}
// Get Questtype
$quest['questtype'] = $this->Questtypes->getQuesttypeById($quest['questtype_id']);
if($selectedFilters['questtype'] != "" && $selectedFilters['questtype'] != $quest['questtype']['classname']) {
continue;
}
// Add filter values
$filters['questgroups'][$quest['questgroup']['id']] = $quest['questgroup'];
$filters['questtypes'][$quest['questtype']['classname']] = $quest['questtype'];
// Add open submissions count
$quest['opensubmissionscount'] = count($this->Characters->getCharactersSubmittedQuest($quest['id']));
$quests[] = $quest;
}
// Sort Quests
usort($quests, function($a, $b) {
if($a['opensubmissionscount'] == $b['opensubmissionscount']) {
return 0;
}
return ($a['opensubmissionscount'] < $b['opensubmissionscount']) ? 1 : -1;
});
// Get filter values
$questgroups = $this->Questgroups->getQuestgroupsForSeminary($seminary['id']);
$questtypes = $this->Questtypes->getQuesttypes();
// Set titile
$this->addTitleLocalized('Quests');
@ -128,9 +124,12 @@
// Pass data to view
$this->set('seminary', $seminary);
$this->set('questgroups', $questgroups);
$this->set('questtypes', $questtypes);
$this->set('selectedQuestgroup', $selectedQuestgroup);
$this->set('selectedQuesttype', $selectedQuesttype);
$this->set('quests', $quests);
$this->set('filters', $filters);
$this->set('selectedFilters', $selectedFilters);
$this->set('limit', $limit);
}

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: The Legend of Z\n"
"POT-Creation-Date: 2014-05-15 18:15+0100\n"
"PO-Revision-Date: 2014-05-15 18:15+0100\n"
"POT-Creation-Date: 2014-05-15 23:32+0100\n"
"PO-Revision-Date: 2014-05-15 23:33+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
@ -427,7 +427,7 @@ msgstr "%s-Gruppe verwalten"
#: views/html/characters/character.tpl:77
#: views/html/characters/character.tpl:83
#: views/html/characters/character.tpl:89
#: views/html/characters/character.tpl:103 views/html/quests/index.tpl:37
#: views/html/characters/character.tpl:103 views/html/quests/index.tpl:73
#: views/html/seminaries/index.tpl:29 views/html/seminarybar/index.tpl:7
#: views/html/seminarybar/index.tpl:43
#, php-format
@ -908,17 +908,57 @@ msgstr "Text für falsche Antwort"
msgid "Task"
msgstr "Aufgabe"
#: views/html/quests/index.tpl:16 views/html/quests/index.tpl:23
msgid "all"
msgstr "alle"
#: views/html/quests/index.tpl:21
msgid "Questtype"
msgstr "Questtyp"
#: views/html/quests/index.tpl:29
#: views/html/quests/index.tpl:27 views/html/quests/index.tpl:57
msgid "Questtype Empty"
msgstr "Leere Aufgabe"
#: views/html/quests/index.tpl:29 views/html/quests/index.tpl:59
msgid "Questtype bossfight"
msgstr "Boss-Fight"
#: views/html/quests/index.tpl:31 views/html/quests/index.tpl:61
msgid "Questtype choiceinput"
msgstr "Auswahleingabe"
#: views/html/quests/index.tpl:33 views/html/quests/index.tpl:63
msgid "Questtype crossword"
msgstr "Kreuzworträtsel"
#: views/html/quests/index.tpl:35 views/html/quests/index.tpl:65
msgid "Questtype dragndrop"
msgstr "Drag&Drop"
#: views/html/quests/index.tpl:37 views/html/quests/index.tpl:67
msgid "Questtype multiplechoice"
msgstr "Multiple Choice"
#: views/html/quests/index.tpl:39 views/html/quests/index.tpl:69
msgid "Questtype submit"
msgstr "Abgabeaufgabe"
#: views/html/quests/index.tpl:41 views/html/quests/index.tpl:71
msgid "Questtype textinput"
msgstr "Texteingabe"
#: views/html/quests/index.tpl:48
msgid "Apply filters"
msgstr "Filter anwenden"
#: views/html/quests/index.tpl:30
msgid "Reset filters"
msgstr "Filter zurücksetzen"
#: views/html/quests/index.tpl:54
msgid "open submissions"
msgstr "offene Lösungsvorschläge"
#: views/html/quests/index.tpl:79
msgid "Show all"
msgstr "Alle anzeigen"
#: views/html/quests/quest.tpl:11
msgid "Prolog"
@ -1193,6 +1233,9 @@ msgstr "Registrieren"
msgid "Roles"
msgstr "Rollen"
#~ msgid "Reset filters"
#~ msgstr "Filter zurücksetzen"
#~ msgid "Create"
#~ msgstr "Erstellen"

View file

@ -354,13 +354,16 @@
* @param int $seminaryId ID of Seminary
* @return array Quests for this Seminary
*/
public function getQuestsForSeminary($seminaryId)
public function getQuestsForSeminary($seminaryId, $questgroupId=null, $questtypeId=null, $limit=null)
{
return $this->db->query(
'SELECT DISTINCT quests.id, quests.questgroup_id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.wrong_text, quests.questsmedia_id '.
'FROM questgroups '.
'INNER JOIN quests ON quests.questgroup_id = questgroups.id '.
'WHERE questgroups.seminary_id = ?',
'WHERE questgroups.seminary_id = ?'.
(!empty($questgroupId) ? ' AND questgroups.id = '.intval($questgroupId) : null).
(!empty($questtypeId) ? ' AND quests.questtype_id = '.intval($questtypeId) : null).
(!empty($limit) ? ' LIMIT '.intval($limit) : null),
'i',
$seminaryId
);

View file

@ -8,34 +8,73 @@
</ul>
<h1><?=_('Quests')?></h1>
<form method="post" class="logreg admnqf">
<form method="get" class="logreg admnqf">
<fieldset>
<legend>Filter</legend>
<label for="filters[questgroup]"><?=_('Questgroup')?>:</label>
<select name="filters[questgroup]">
<option value="0">alle</option>
<?php foreach($filters['questgroups'] as &$filter) : ?>
<option value="<?=$filter['id']?>" <?php if($filter['id'] == $selectedFilters['questgroup']) : ?>selected="selected"<?php endif ?>><?=$filter['title']?></option>
<label for="questgroup"><?=_('Questgroup')?>:</label>
<select id="questgroup" name="questgroup">
<option value=""><?=_('all')?></option>
<?php foreach($questgroups as &$questgroup) : ?>
<option value="<?=$questgroup['id']?>" <?php if($questgroup['id'] == $selectedQuestgroup) : ?>selected="selected"<?php endif ?>><?=$questgroup['title']?></option>
<?php endforeach ?>
</select><br />
<label for="filters[questtype]"><?=_('Questtype')?>:</label>
<select name="filters[questtype]">
<option value="">alle</option>
<?php foreach($filters['questtypes'] as &$filter) : ?>
<option value="<?=$filter['classname']?>" <?php if($filter['classname'] == $selectedFilters['questtype']) : ?>selected="selected"<?php endif ?>><?=$filter['title']?></option>
<label for="questtype"><?=_('Questtype')?>:</label>
<select id="questtype" name="questtype">
<option value=""><?=_('all')?></option>
<?php foreach($questtypes as &$questtype) : ?>
<option value="<?=$questtype['id']?>" <?php if($questtype['id'] == $selectedQuesttype) : ?>selected="selected"<?php endif ?>>
<?php switch($questtype['classname']) {
case null: echo _('Questtype Empty');
break;
case 'bossfight': echo _('Questtype bossfight');
break;
case 'choiceinput': echo _('Questtype choiceinput');
break;
case 'crossword': echo _('Questtype crossword');
break;
case 'dragndrop': echo _('Questtype dragndrop');
break;
case 'multiplechoice': echo _('Questtype multiplechoice');
break;
case 'submit': echo _('Questtype submit');
break;
case 'textinput': echo _('Questtype textinput');
break;
} ?>
</option>
<?php endforeach ?>
</select>
</fieldset>
<input type="submit" name="filter" value="<?=_('Apply filters')?>" />
<input type="submit" name="reset" value="<?=_('Reset filters')?>" />
<input type="submit" value="<?=_('Apply filters')?>" />
</form>
<ul class="admnql">
<?php foreach($quests as &$quest) : ?>
<li>
<p class="fwb"><a href="<?=$linker->link(array('quest',$seminary['url'],$quest['questgroup']['url'],$quest['url']),1)?>"><?=$quest['title']?></a><span><a href="<?=$linker->link(array('submissions',$seminary['url'],$quest['questgroup']['url'],$quest['url']),1)?>"><?=$quest['opensubmissionscount']?> open submissions</a></span></p>
<p><small><?=$quest['questtype']['title']?>, <?=sprintf(_('%dXPs'), $quest['xps'])?></small></p>
<p class="fwb"><a href="<?=$linker->link(array('quest',$seminary['url'],$quest['questgroup']['url'],$quest['url']),1)?>"><?=$quest['title']?></a><span><a href="<?=$linker->link(array('submissions',$seminary['url'],$quest['questgroup']['url'],$quest['url']),1)?>"><?=$quest['opensubmissionscount']?> <?=_('open submissions')?></a></span></p>
<p><small>
<?php switch($quest['questtype']['classname']) {
case null: echo _('Questtype Empty');
break;
case 'bossfight': echo _('Questtype bossfight');
break;
case 'choiceinput': echo _('Questtype choiceinput');
break;
case 'crossword': echo _('Questtype crossword');
break;
case 'dragndrop': echo _('Questtype dragndrop');
break;
case 'multiplechoice': echo _('Questtype multiplechoice');
break;
case 'submit': echo _('Questtype submit');
break;
case 'textinput': echo _('Questtype textinput');
break;
} ?>, <?=sprintf(_('%dXPs'), $quest['xps'])?></small></p>
<p><small><a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$quest['questgroup']['url']))?>"><?=$quest['questgroup']['title']?></a></small></p>
</li>
<?php endforeach ?>
</ul>
<?php if(!is_null($limit)) : ?>
<p><a href="<?=$linker->link('all',3)?>"><?=_('Show all')?></a></p>
<?php endif ?>