use own method to get list of Quests for a Seminary ordered by open Character submissions

This commit is contained in:
coderkun 2014-05-16 16:04:56 +02:00
commit 294731e8e2
3 changed files with 44 additions and 23 deletions

View file

@ -92,27 +92,13 @@
// Get Quests
$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);
$quests = $this->Quests->getQuestsForSeminaryByOpenSubmissions($seminary['id'], $selectedQuestgroup, $selectedQuesttype, $limit);
foreach($quests as &$quest)
{
// Get Questgroup
$quest['questgroup'] = $this->Questgroups->getQuestgroupById($quest['questgroup_id']);
// Get Questtype
$quest['questtype'] = $this->Questtypes->getQuesttypeById($quest['questtype_id']);
// Add open submissions count
$quest['opensubmissionscount'] = count($this->Characters->getCharactersSubmittedQuest($quest['id']));
}
// 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();

View file

@ -354,22 +354,57 @@
* @param int $seminaryId ID of Seminary
* @return array Quests for this Seminary
*/
public function getQuestsForSeminary($seminaryId, $questgroupId=null, $questtypeId=null, $limit=null)
public function getQuestsForSeminary($seminaryId)
{
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, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url '.
'FROM questgroups '.
'INNER JOIN quests ON quests.questgroup_id = questgroups.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),
'WHERE questgroups.seminary_id = ? '.
'ORDER BY quests.title ASC',
'i',
$seminaryId
);
}
/**
* Get all Quests for a Seminary order by their count of open
* submissions.
*
* @param int $seminaryId ID of Seminary
* @param int $questgroupId ID of Questgroup (optional)
* @param int $questtypeId ID of Questtype (optional)
* @param int $limit Limit amount of Quests (optional)
* @param int $offset Offset (optional)
* @return array Quests for this Seminary
*/
public function getQuestsForSeminaryByOpenSubmissions($seminaryId, $questgroupId=null, $questtypeId=null, $limit=null, $offset=0)
{
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, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url, ('.
'SELECT count(DISTINCT quests_characters.character_id) '.
'FROM quests_characters '.
'WHERE quests_characters.quest_id = quests.id AND quests_characters.status = ? AND NOT EXISTS ('.
'SELECT id '.
'FROM quests_characters AS qc '.
'WHERE qc.quest_id = quests_characters.quest_id AND qc.character_id = quests_characters.character_id AND qc.created > quests_characters.created'.
')'.
') AS opensubmissionscount '.
'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).
'ORDER BY opensubmissionscount DESC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
'ii',
self::QUEST_STATUS_SUBMITTED,
$seminaryId
);
}
/**
* Get all Quests that are linked to a Questtopic.
*

View file

@ -51,7 +51,7 @@
<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 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');
@ -71,7 +71,7 @@
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>
<p><small><a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$quest['questgroup_url']))?>"><?=$quest['questgroup_title']?></a></small></p>
</li>
<?php endforeach ?>
</ul>