use AJAX to dynamicall load list of all Quests for a Seminary (Issue #287)
This commit is contained in:
parent
fa9842d964
commit
f655749be3
4 changed files with 130 additions and 7 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
37
views/ajax/quests/index.tpl
Normal file
37
views/ajax/quests/index.tpl
Normal 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(_('%d XPs'), $quest['xps']);
|
||||
}
|
||||
|
||||
?>
|
||||
<?=json_encode(array(
|
||||
'seminary' => $seminary,
|
||||
'quests' => $quests,
|
||||
'more' => (($page*$limit) < $questsCount)
|
||||
))?>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue