use AJAX to dynamicall load list of all Quests for a Seminary (Issue #287)

This commit is contained in:
coderkun 2014-05-25 00:47:29 +02:00
commit f655749be3
4 changed files with 130 additions and 7 deletions

View file

@ -84,17 +84,22 @@
// Set filters
$selectedQuestgroup = null;
$selectedQuesttype = null;
$page = 1;
if($this->request->getRequestMethod() == 'GET')
{
$selectedQuestgroup = $this->request->getGetParam('questgroup');
$selectedQuestgroup = !empty($selectedQuestgroup) ? $selectedQuestgroup : null;
$selectedQuesttype = $this->request->getGetParam('questtype');
$selectedQuesttype = !empty($selectedQuesttype) ? $selectedQuesttype : null;
$page = $this->request->getGetParam('page');
$page = !empty($page) ? intval($page) : 1;
}
// Get Quests
$limit = (is_null($all) && is_null($selectedQuestgroup) && is_null($selectedQuesttype)) ? \nre\configs\AppConfig::$misc['questlist_limit'] : null;
$quests = $this->Quests->getQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit);
$limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['questlist_limit'] : null;
$offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0;
$questsCount = $this->Quests->getCountForQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype);
$quests = $this->Quests->getQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit, $offset);
foreach($quests as &$quest)
{
// Get Questtype
@ -117,6 +122,9 @@
$this->set('selectedQuestgroup', $selectedQuestgroup);
$this->set('selectedQuesttype', $selectedQuesttype);
$this->set('quests', $quests);
$this->set('questsCount', $questsCount);
$this->set('all', $all);
$this->set('page', $page);
$this->set('limit', $limit);
}

View file

@ -368,6 +368,35 @@
}
/**
* Get count of all Quests for a Seminary.
*
* @param int $seminaryId ID of Seminary
* @param int $questgroupId ID of Questgroup (optional)
* @param int $questtypeId ID of Questtype (optional)
* @return int Count of Quests for this Seminary
*/
public function getCountForQuestsForSeminaryByOpenSubmissions($seminaryId, $questgroupId=null, $questtypeId=null)
{
$data = $this->db->query(
'SELECT count(DISTINCT quests.id) AS c '.
'FROM questgroups '.
'INNER JOIN quests ON quests.questgroup_id = questgroups.id '.
'WHERE questgroups.seminary_id = ? '.
(!empty($questgroupId) ? sprintf('AND questgroups.id = %d ', $questgroupId) : null).
(!empty($questtypeId) ? sprintf('AND quests.questtype_id = %d ', $questtypeId) : null),
'i',
$seminaryId
);
if(!empty($data)) {
return $data[0]['c'];
}
return 0;
}
/**
* Get all Quests for a Seminary order by their count of open
* submissions.

View file

@ -0,0 +1,37 @@
<?php
foreach($quests as &$quest)
{
// Questtype translation
$questtype = $quest['questtype']['title'];
switch($quest['questtype']['classname'])
{
case null: $questtype = _('Questtype Empty');
break;
case 'bossfight': $questtype = _('Questtype bossfight');
break;
case 'choiceinput': $questtype = _('Questtype choiceinput');
break;
case 'crossword': $questtype = _('Questtype crossword');
break;
case 'dragndrop': $questtype = _('Questtype dragndrop');
break;
case 'multiplechoice': $questtype = _('Questtype multiplechoice');
break;
case 'submit': $questtype = _('Questtype submit');
break;
case 'textinput': $questtype = _('Questtype textinput');
break;
}
$quest['questtype']['title'] = $questtype;
// XPs translation
$quest['xps'] = sprintf(_('%dXPs'), $quest['xps']);
}
?>
<?=json_encode(array(
'seminary' => $seminary,
'quests' => $quests,
'more' => (($page*$limit) < $questsCount)
))?>

View file

@ -48,7 +48,7 @@
<input type="submit" value="<?=_('Apply filters')?>" />
</form>
<ul class="admnql">
<ul id="questlist" 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>
@ -75,10 +75,59 @@
</li>
<?php endforeach ?>
</ul>
<?php if(!is_null($limit)) : ?>
<?php if(is_null($all) && ($page*$limit) < $questsCount) : ?>
<nav class="admin">
<li>
<a href="<?=$linker->link('all',3)?>"><?=_('Show all')?></a>
</li>
<li><a id="show-more" href="<?=$linker->link(null,3,true,array('page'=>$page+1,'questgroup'=>$selectedQuestgroup,'questtype'=>$selectedQuesttype))?>"><?=_('Show more')?></a></li>
<li><a id="show-all" href="<?=$linker->link('all',3,true,array('questgroup'=>$selectedQuestgroup,'questtype'=>$selectedQuesttype))?>"><?=_('Show all')?></a></li>
</nav>
<?php endif ?>
<script>
var page = 1;
var request;
var linkSubmissions = "<?=$linker->link(array('submissions','SEMINARY','QUESTGROUP','QUEST'),1)?>";
var linkQuestgroup = "<?=$linker->link(array('questgroups','questgroup','SEMINARY','QUESTGROUP'))?>";
var linkQuest = "<?=$linker->link(array('quest','SEMINARY','QUESTGROUP','QUEST'),1)?>";
var linkPage = "<?=$linker->link(null,3,true,array('page'=>'PAGE','questgroup'=>$selectedQuestgroup,'questtype'=>$selectedQuesttype))?>";
$("#show-more").click(function(event) {
if(request) {
request.abort();
}
page++;
request = $.getJSON(linkPage.replace('PAGE', page), function(data) {
linkSubmissions = linkSubmissions.replace('SEMINARY', data['seminary']['url']);
linkQuestgroup = linkQuestgroup.replace('SEMINARY', data['seminary']['url']);
linkQuest = linkQuest.replace('SEMINARY', data['seminary']['url']);
$.each(data['quests'], function(key, val) {
var urlSubmissions = linkSubmissions.replace('QUESTGROUP', val['questgroup_url']).replace('QUEST', val['url']);
var urlQuestgroup = linkQuestgroup.replace('QUESTGROUP', val['questgroup_url']);
var urlQuest = linkQuest.replace('QUESTGROUP', val['questgroup_url']).replace('QUEST', val['url']);
$("#questlist").append(
"<li>" +
"<p class=\"fwb\"><a href=\"" + urlQuest + "\">" + val['title'] + "</a><span><a href=\"" + urlSubmissions + "\">" + val['opensubmissionscount'] + " <?=_('open submissions')?></a></span></p>" +
"<p><small>" + val['questtype']['title'] + ", " + val['xps'] + "</small></p>" +
"<p><small><a href=\"" + urlQuestgroup + "\">" + val['questgroup_title'] + "</a></small></p>" +
"</li>"
);
});
if(data['more']) {
$("#show-more").attr('href', linkPage.replace('PAGE', page+1));
}
else {
$("#show-more").remove();
$("#show-all").remove();
}
});
request.fail(function (jqXHR, textStatus, errorThrown) {
alert("fail: " + textStatus + ": " +errorThrown);
});
event.preventDefault();
return false;
});
</script>