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:
parent
9f321bd695
commit
f0dd34e762
6 changed files with 142 additions and 56 deletions
|
|
@ -132,7 +132,8 @@
|
||||||
public static $misc = array(
|
public static $misc = array(
|
||||||
'ranking_range' => 2,
|
'ranking_range' => 2,
|
||||||
'achievements_range' => 3,
|
'achievements_range' => 3,
|
||||||
'title_delimiter' => ' – '
|
'title_delimiter' => ' – ',
|
||||||
|
'questlist_limit' => 10
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -212,6 +213,7 @@
|
||||||
array('^questgroups/([^/]+)/(create)/?$', 'questgroups/$2/$1', true),
|
array('^questgroups/([^/]+)/(create)/?$', 'questgroups/$2/$1', true),
|
||||||
array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true),
|
array('^questgroups/([^/]+)/([^/]+)/?$', 'questgroups/questgroup/$1/$2', true),
|
||||||
array('^quests/([^/]+)/?$', 'quests/index/$1', 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/([^/]+)/(create|createmedia)/?$', 'quests/$2/$1' , true),
|
||||||
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions)/?$', 'quests/$4/$1/$2/$3', true),
|
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submissions)/?$', 'quests/$4/$1/$2/$3', true),
|
||||||
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submission)/([^/]+)/?$', 'quests/$4/$1/$2/$3/$5', true),
|
array('^quests/([^/]+)/([^/]+)/([^/]+)/(submission)/([^/]+)/?$', 'quests/$4/$1/$2/$3/$5', true),
|
||||||
|
|
@ -250,7 +252,7 @@
|
||||||
array('^seminaries/seminary/(.*)$', 'seminaries/$1', false),
|
array('^seminaries/seminary/(.*)$', 'seminaries/$1', false),
|
||||||
array('^questgroups/create/(.*)$', 'questgroups/$2/$1', true),
|
array('^questgroups/create/(.*)$', 'questgroups/$2/$1', true),
|
||||||
array('^questgroups/questgroup/(.*)$', 'questgroups/$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/quest/(.*)$', 'quests/$1', true),
|
||||||
array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true),
|
array('^quests/(create|createmedia)/(.*)$', 'quests/$2/$1' , true),
|
||||||
array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true),
|
array('^quests/(submissions)/(.*)$', 'quests/$2/$1', true),
|
||||||
|
|
|
||||||
|
|
@ -74,53 +74,49 @@
|
||||||
* List all Quests for a Seminary.
|
* List all Quests for a Seminary.
|
||||||
*
|
*
|
||||||
* @param string $seminaryUrl URL-Title of 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
|
// Get seminary
|
||||||
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
$seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl);
|
||||||
|
|
||||||
// Prepare filters
|
// Set filters
|
||||||
$filters = array(
|
$selectedQuestgroup = null;
|
||||||
'questgroups' => array(),
|
$selectedQuesttype = null;
|
||||||
'questtypes' => array()
|
if($this->request->getRequestMethod() == 'GET')
|
||||||
);
|
{
|
||||||
|
$selectedQuestgroup = !empty($this->request->getGetParam('questgroup')) ? $this->request->getGetParam('questgroup') : null;
|
||||||
// Get selected filters
|
$selectedQuesttype = !empty($this->request->getGetParam('questtype')) ? $this->request->getGetParam('questtype') : null;
|
||||||
$selectedFilters = array(
|
|
||||||
'questgroup' => "0",
|
|
||||||
'questtype' => ""
|
|
||||||
);
|
|
||||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('filters'))) {
|
|
||||||
$selectedFilters = $this->request->getPostParam('filters');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get Quests
|
// Get Quests
|
||||||
$quests = array();
|
$limit = (is_null($all) && is_null($selectedQuestgroup) && is_null($selectedQuesttype)) ? \nre\configs\AppConfig::$misc['questlist_limit'] : null;
|
||||||
foreach($this->Quests->getQuestsForSeminary($seminary['id']) as $quest)
|
$quests = $this->Quests->getQuestsForSeminary($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit);
|
||||||
|
foreach($quests as &$quest)
|
||||||
{
|
{
|
||||||
// Get Questgroup
|
// Get Questgroup
|
||||||
$quest['questgroup'] = $this->Questgroups->getQuestgroupById($quest['questgroup_id']);
|
$quest['questgroup'] = $this->Questgroups->getQuestgroupById($quest['questgroup_id']);
|
||||||
if($selectedFilters['questgroup'] != "0" && $selectedFilters['questgroup'] != $quest['questgroup']['id']) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get Questtype
|
// Get Questtype
|
||||||
$quest['questtype'] = $this->Questtypes->getQuesttypeById($quest['questtype_id']);
|
$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
|
// Add open submissions count
|
||||||
$quest['opensubmissionscount'] = count($this->Characters->getCharactersSubmittedQuest($quest['id']));
|
$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
|
// Set titile
|
||||||
$this->addTitleLocalized('Quests');
|
$this->addTitleLocalized('Quests');
|
||||||
|
|
@ -128,9 +124,12 @@
|
||||||
|
|
||||||
// Pass data to view
|
// Pass data to view
|
||||||
$this->set('seminary', $seminary);
|
$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('quests', $quests);
|
||||||
$this->set('filters', $filters);
|
$this->set('limit', $limit);
|
||||||
$this->set('selectedFilters', $selectedFilters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -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-05-15 18:15+0100\n"
|
"POT-Creation-Date: 2014-05-15 23:32+0100\n"
|
||||||
"PO-Revision-Date: 2014-05-15 18:15+0100\n"
|
"PO-Revision-Date: 2014-05-15 23:33+0100\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: de_DE\n"
|
"Language: de_DE\n"
|
||||||
|
|
@ -427,7 +427,7 @@ msgstr "%s-Gruppe verwalten"
|
||||||
#: views/html/characters/character.tpl:77
|
#: views/html/characters/character.tpl:77
|
||||||
#: views/html/characters/character.tpl:83
|
#: views/html/characters/character.tpl:83
|
||||||
#: views/html/characters/character.tpl:89
|
#: 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/seminaries/index.tpl:29 views/html/seminarybar/index.tpl:7
|
||||||
#: views/html/seminarybar/index.tpl:43
|
#: views/html/seminarybar/index.tpl:43
|
||||||
#, php-format
|
#, php-format
|
||||||
|
|
@ -908,17 +908,57 @@ msgstr "Text für falsche Antwort"
|
||||||
msgid "Task"
|
msgid "Task"
|
||||||
msgstr "Aufgabe"
|
msgstr "Aufgabe"
|
||||||
|
|
||||||
|
#: views/html/quests/index.tpl:16 views/html/quests/index.tpl:23
|
||||||
|
msgid "all"
|
||||||
|
msgstr "alle"
|
||||||
|
|
||||||
#: views/html/quests/index.tpl:21
|
#: views/html/quests/index.tpl:21
|
||||||
msgid "Questtype"
|
msgid "Questtype"
|
||||||
msgstr "Questtyp"
|
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"
|
msgid "Apply filters"
|
||||||
msgstr "Filter anwenden"
|
msgstr "Filter anwenden"
|
||||||
|
|
||||||
#: views/html/quests/index.tpl:30
|
#: views/html/quests/index.tpl:54
|
||||||
msgid "Reset filters"
|
msgid "open submissions"
|
||||||
msgstr "Filter zurücksetzen"
|
msgstr "offene Lösungsvorschläge"
|
||||||
|
|
||||||
|
#: views/html/quests/index.tpl:79
|
||||||
|
msgid "Show all"
|
||||||
|
msgstr "Alle anzeigen"
|
||||||
|
|
||||||
#: views/html/quests/quest.tpl:11
|
#: views/html/quests/quest.tpl:11
|
||||||
msgid "Prolog"
|
msgid "Prolog"
|
||||||
|
|
@ -1193,6 +1233,9 @@ msgstr "Registrieren"
|
||||||
msgid "Roles"
|
msgid "Roles"
|
||||||
msgstr "Rollen"
|
msgstr "Rollen"
|
||||||
|
|
||||||
|
#~ msgid "Reset filters"
|
||||||
|
#~ msgstr "Filter zurücksetzen"
|
||||||
|
|
||||||
#~ msgid "Create"
|
#~ msgid "Create"
|
||||||
#~ msgstr "Erstellen"
|
#~ msgstr "Erstellen"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -354,13 +354,16 @@
|
||||||
* @param int $seminaryId ID of Seminary
|
* @param int $seminaryId ID of Seminary
|
||||||
* @return array Quests for this 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(
|
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 '.
|
'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 '.
|
'FROM questgroups '.
|
||||||
'INNER JOIN quests ON quests.questgroup_id = questgroups.id '.
|
'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',
|
'i',
|
||||||
$seminaryId
|
$seminaryId
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -8,34 +8,73 @@
|
||||||
</ul>
|
</ul>
|
||||||
<h1><?=_('Quests')?></h1>
|
<h1><?=_('Quests')?></h1>
|
||||||
|
|
||||||
<form method="post" class="logreg admnqf">
|
<form method="get" class="logreg admnqf">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Filter</legend>
|
<legend>Filter</legend>
|
||||||
<label for="filters[questgroup]"><?=_('Questgroup')?>:</label>
|
<label for="questgroup"><?=_('Questgroup')?>:</label>
|
||||||
<select name="filters[questgroup]">
|
<select id="questgroup" name="questgroup">
|
||||||
<option value="0">alle</option>
|
<option value=""><?=_('all')?></option>
|
||||||
<?php foreach($filters['questgroups'] as &$filter) : ?>
|
<?php foreach($questgroups as &$questgroup) : ?>
|
||||||
<option value="<?=$filter['id']?>" <?php if($filter['id'] == $selectedFilters['questgroup']) : ?>selected="selected"<?php endif ?>><?=$filter['title']?></option>
|
<option value="<?=$questgroup['id']?>" <?php if($questgroup['id'] == $selectedQuestgroup) : ?>selected="selected"<?php endif ?>><?=$questgroup['title']?></option>
|
||||||
<?php endforeach ?>
|
<?php endforeach ?>
|
||||||
</select><br />
|
</select><br />
|
||||||
<label for="filters[questtype]"><?=_('Questtype')?>:</label>
|
<label for="questtype"><?=_('Questtype')?>:</label>
|
||||||
<select name="filters[questtype]">
|
<select id="questtype" name="questtype">
|
||||||
<option value="">alle</option>
|
<option value=""><?=_('all')?></option>
|
||||||
<?php foreach($filters['questtypes'] as &$filter) : ?>
|
<?php foreach($questtypes as &$questtype) : ?>
|
||||||
<option value="<?=$filter['classname']?>" <?php if($filter['classname'] == $selectedFilters['questtype']) : ?>selected="selected"<?php endif ?>><?=$filter['title']?></option>
|
<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 ?>
|
<?php endforeach ?>
|
||||||
</select>
|
</select>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<input type="submit" name="filter" value="<?=_('Apply filters')?>" />
|
<input type="submit" value="<?=_('Apply filters')?>" />
|
||||||
<input type="submit" name="reset" value="<?=_('Reset filters')?>" />
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<ul class="admnql">
|
<ul class="admnql">
|
||||||
<?php foreach($quests as &$quest) : ?>
|
<?php foreach($quests as &$quest) : ?>
|
||||||
<li>
|
<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 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(_('%d XPs'), $quest['xps'])?></small></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(_('%d XPs'), $quest['xps'])?></small></p>
|
||||||
<p><small><a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$quest['questgroup']['url']))?>"><?=$quest['questgroup']['title']?></a></small></p>
|
<p><small><a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$quest['questgroup']['url']))?>"><?=$quest['questgroup']['title']?></a></small></p>
|
||||||
</li>
|
</li>
|
||||||
<?php endforeach ?>
|
<?php endforeach ?>
|
||||||
</ul>
|
</ul>
|
||||||
|
<?php if(!is_null($limit)) : ?>
|
||||||
|
<p><a href="<?=$linker->link('all',3)?>"><?=_('Show all')?></a></p>
|
||||||
|
<?php endif ?>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue