From 2b76ddf089e6dc058f125aa1a4050c4e9dce7b98 Mon Sep 17 00:00:00 2001 From: coderkun Date: Thu, 24 Apr 2014 12:01:50 +0200 Subject: [PATCH] add an optional deadline to Achievements --- controllers/AchievementsController.inc | 8 +++---- controllers/CharactersController.inc | 7 ++++++ models/AchievementsModel.inc | 32 ++++++++++++++++++++++---- models/CharactersModel.inc | 5 ++-- views/html/characters/character.tpl | 17 +++++++++----- 5 files changed, 52 insertions(+), 17 deletions(-) diff --git a/controllers/AchievementsController.inc b/controllers/AchievementsController.inc index 27341bdf..89b3f703 100644 --- a/controllers/AchievementsController.inc +++ b/controllers/AchievementsController.inc @@ -62,19 +62,19 @@ $character = SeminaryController::$character; // Get seldom Achievements - $seldomAchievements = $this->Achievements->getSeldomAchievements($seminary['id'], \nre\configs\AppConfig::$misc['achievements_range']); + $seldomAchievements = $this->Achievements->getSeldomAchievements($seminary['id'], \nre\configs\AppConfig::$misc['achievements_range'], false); foreach($seldomAchievements as &$achievement) { $achievement['achieved'] = $this->Achievements->hasCharacterAchievedAchievement($achievement['id'], $character['id']); } // Get Characters with the most Achievements - $successfulCharacters = $this->Characters->getCharactersWithMostAchievements($seminary['id'], \nre\configs\AppConfig::$misc['achievements_range']); + $successfulCharacters = $this->Characters->getCharactersWithMostAchievements($seminary['id'], \nre\configs\AppConfig::$misc['achievements_range'], false); // Get achieved Achievements - $achievedAchievements = $this->Achievements->getAchievedAchievementsForCharacter($character['id']); + $achievedAchievements = $this->Achievements->getAchievedAchievementsForCharacter($character['id'], false); // Get unachieved Achievements - $unachievedAchievements = $this->Achievements->getUnachhievedAchievementsForCharacter($seminary['id'], $character['id'], true); + $unachievedAchievements = $this->Achievements->getUnachhievedAchievementsForCharacter($seminary['id'], $character['id'], true, false); foreach($unachievedAchievements as &$achievement) { // Get Character progress diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index 70aed379..900b19a3 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -119,6 +119,12 @@ // Get Achievements $achievements = $this->Achievements->getAchievedAchievementsForCharacter($character['id']); + // Get Achievements with deadline (milestones) + $milestones = $this->Achievements->getDeadlineAchievements($seminary['id']); + foreach($milestones as &$milestone) { + $milestone['achieved'] = $this->Achievements->hasCharacterAchievedAchievement($milestone['id'], $character['id']); + } + // Get ranking $ranking = array( 'superior' => $this->Characters->getSuperiorCharacters($seminary['id'], $character['xps'], \nre\configs\AppConfig::$misc['ranking_range']), @@ -141,6 +147,7 @@ $this->set('user', $user); $this->set('groups', $groups); $this->set('achievements', $achievements); + $this->set('milestones', $milestones); $this->set('ranking', $ranking); $this->set('questtopics', $questtopics); } diff --git a/models/AchievementsModel.inc b/models/AchievementsModel.inc index c5a1d248..898a100f 100644 --- a/models/AchievementsModel.inc +++ b/models/AchievementsModel.inc @@ -70,7 +70,7 @@ public function getUnachievedOnlyOnceAchievementsForSeminary($seminaryId) { return $this->db->query( - 'SELECT achievements.id, achievementconditions.condition, title, url, description, progress, hidden, only_once, all_conditions, unachieved_achievementsmedia_id, achieved_achievementsmedia_id '. + 'SELECT achievements.id, achievementconditions.condition, title, url, description, progress, hidden, only_once, all_conditions, deadline, unachieved_achievementsmedia_id, achieved_achievementsmedia_id '. 'FROM achievements '. 'LEFT JOIN achievementconditions ON achievementconditions.id = achievements.achievementcondition_id '. 'WHERE achievements.seminary_id = ? AND only_once = 1 AND NOT EXISTS ('. @@ -84,6 +84,25 @@ } + /** + * Get all Achievements that have a deadline. + * + * @param int $seminaryId ID of Seminary + * @return array Achievements data + */ + public function getDeadlineAchievements($seminaryId) + { + return $this->db->query( + 'SELECT achievements.id, achievementconditions.condition, title, url, description, progress, hidden, only_once, all_conditions, deadline, unachieved_achievementsmedia_id, achieved_achievementsmedia_id '. + 'FROM achievements '. + 'LEFT JOIN achievementconditions ON achievementconditions.id = achievements.achievementcondition_id '. + 'WHERE achievements.seminary_id = ? AND deadline IS NOT NULL', + 'i', + $seminaryId + ); + } + + /** * Get seldom Achievements. * @@ -91,13 +110,14 @@ * @param int $count Number of Achievements to retrieve * @return array List of seldom Achievements */ - public function getSeldomAchievements($seminaryId, $count) + public function getSeldomAchievements($seminaryId, $count, $alsoWithDeadline=true) { return $this->db->query( 'SELECT id, title, url, description, progress, hidden, unachieved_achievementsmedia_id, achieved_achievementsmedia_id, count(DISTINCT character_id) AS c '. 'FROM achievements_characters '. 'LEFT JOIN achievements ON achievements.id = achievements_characters.achievement_id '. 'WHERE achievements.seminary_id = ? AND only_once = 0 '. + (!$alsoWithDeadline ? 'AND achievements.deadline IS NULL ' : null). 'GROUP BY achievement_id '. 'ORDER BY count(DISTINCT character_id) ASC '. 'LIMIT ?', @@ -114,13 +134,14 @@ * @param int $characterId ID of Character * @return array Achievements data */ - public function getAchievedAchievementsForCharacter($characterId) + public function getAchievedAchievementsForCharacter($characterId, $alsoWithDeadline=true) { return $this->db->query( 'SELECT achievements.id, achievements_characters.created, achievements.title, achievements.url, achievements.description, achievements.progress, unachieved_achievementsmedia_id, achieved_achievementsmedia_id '. 'FROM achievements '. 'INNER JOIN achievements_characters ON achievements_characters.achievement_id = achievements.id '. 'WHERE achievements_characters.character_id = ? '. + (!$alsoWithDeadline ? 'AND achievements.deadline IS NULL ' : null). 'ORDER BY achievements_characters.created DESC', 'i', $characterId @@ -135,10 +156,10 @@ * @param int $characterId ID of Character * @return array Achievements data */ - public function getUnachhievedAchievementsForCharacter($seminaryId, $characterId, $includeOnlyOnce=false) + public function getUnachhievedAchievementsForCharacter($seminaryId, $characterId, $includeOnlyOnce=false, $alsoWithDeadline=true) { return $this->db->query( - 'SELECT achievements.id, achievementconditions.condition, title, url, description, progress, hidden, only_once, all_conditions, unachieved_achievementsmedia_id, achieved_achievementsmedia_id '. + 'SELECT achievements.id, achievementconditions.condition, title, url, description, progress, hidden, only_once, all_conditions, deadline, unachieved_achievementsmedia_id, achieved_achievementsmedia_id '. 'FROM achievements '. 'LEFT JOIN achievementconditions ON achievementconditions.id = achievements.achievementcondition_id '. 'WHERE achievements.seminary_id = ? AND only_once <= ? AND NOT EXISTS ('. @@ -148,6 +169,7 @@ 'achievements_characters.achievement_id = achievements.id AND '. 'achievements_characters.character_id = ?'. ') '. + (!$alsoWithDeadline ? 'AND achievements.deadline IS NULL ' : null). 'ORDER BY achievements.pos ASC', 'iii', $seminaryId, diff --git a/models/CharactersModel.inc b/models/CharactersModel.inc index 4d2811fb..a0dd9ade 100644 --- a/models/CharactersModel.inc +++ b/models/CharactersModel.inc @@ -181,7 +181,7 @@ * @param int $conut Amount of Characters to retrieve * @return array List of Characters */ - public function getCharactersWithMostAchievements($seminaryId, $count) + public function getCharactersWithMostAchievements($seminaryId, $count, $alsoWithDeadline=true) { return $this->db->query( 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, count(DISTINCT achievement_id) AS c '. @@ -189,7 +189,8 @@ 'LEFT JOIN achievements ON achievements.id = achievements_characters.achievement_id '. 'LEFT JOIN v_characters AS characters ON characters.id = achievements_characters.character_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. - 'WHERE achievements.seminary_id = ? '. + 'WHERE achievements.seminary_id = ? AND deadline IS NULL '. + (!$alsoWithDeadline ? 'AND achievements.deadline IS NULL ' : null). 'GROUP BY character_id '. 'ORDER BY count(DISTINCT achievement_id) DESC '. 'LIMIT ?', diff --git a/views/html/characters/character.tpl b/views/html/characters/character.tpl index 9e1ba45a..45b641eb 100644 --- a/views/html/characters/character.tpl +++ b/views/html/characters/character.tpl @@ -27,13 +27,18 @@

.

-

Meilensteine

+