diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 8128f4d2..841903c6 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -69,6 +69,24 @@ ); + /** + * Media sizes + * + * @static + * @var array + */ + public static $media = array( + 'questgroup' => array( + 'width' => 480, + 'height' => 5000 + ), + 'avatar' => array( + 'width' => 500, + 'height' => 500 + ) + ); + + /** * Miscellaneous settings * diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index 8f7e02cf..1adab0d3 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -75,12 +75,6 @@ { // Level $character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); - - // Avatar - $avatar = $this->Avatars->getAvatarById($character['avatar_id']); - if(!is_null($avatar['small_avatarpicture_id'])) { - $character['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']); - } } @@ -128,26 +122,6 @@ 'superior' => $this->Characters->getSuperiorCharacters($seminary['id'], $character['xps'], \nre\configs\AppConfig::$misc['ranking_range']), 'inferior' => $this->Characters->getInferiorCharacters($seminary['id'], $character['xps'], \nre\configs\AppConfig::$misc['ranking_range']) ); - foreach($ranking['superior'] as &$rankCharacter) - { - if(!is_null($rankCharacter['avatar_id'])) - { - $avatar = $this->Avatars->getAvatarById($rankCharacter['avatar_id']); - if(!is_null($avatar['small_avatarpicture_id'])) { - $rankCharacter['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']); - } - } - } - foreach($ranking['inferior'] as &$rankCharacter) - { - if(!is_null($rankCharacter['avatar_id'])) - { - $avatar = $this->Avatars->getAvatarById($rankCharacter['avatar_id']); - if(!is_null($avatar['small_avatarpicture_id'])) { - $rankCharacter['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']); - } - } - } // Get Quest topics $questtopics = $this->Questtopics->getQuesttopicsForSeminary($seminary['id']); diff --git a/controllers/MediaController.inc b/controllers/MediaController.inc index 16e01cbb..e6bb69d2 100644 --- a/controllers/MediaController.inc +++ b/controllers/MediaController.inc @@ -26,9 +26,10 @@ */ public $permissions = array( 'index' => array('admin', 'moderator', 'user', 'guest'), - 'seminaryheader' => array('admin', 'moderator', 'user', 'guest'), - 'seminary' => array('admin', 'moderator', 'user', 'guest'), - 'achievement' => array('admin', 'moderator', 'user', 'guest') + 'seminaryheader' => array('admin', 'moderator', 'user'), + 'seminary' => array('admin', 'moderator', 'user'), + 'avatar' => array('admin', 'moderator', 'user'), + 'achievement' => array('admin', 'moderator', 'user') ); /** * User seminary permissions @@ -44,7 +45,7 @@ * * @var array */ - public $models = array('seminaries', 'achievements', 'media'); + public $models = array('seminaries', 'achievements', 'media', 'avatars'); @@ -143,7 +144,56 @@ // Get file $file = $this->getMediaFile($media, $action); - if(is_null($media)) { + if(is_null($file)) { + return; + } + + + // Pass data to view + $this->set('media', $media); + $this->set('file', $file); + } + + + /** + * Action: avatar. + * + * Display an Avatar as full size or portrait. + * + * @throws ParamsNotValidException + * @throws IdNotFoundException + * @param string $seminaryUrl URL-title of the Seminary + * @param string $charactertypeUrl URL-title of Character type + * @param int $xplevel XP-level + * @param string $action Size to show (avatar or portrait) + */ + public function avatar($seminaryUrl, $charactertypeUrl, $xplevel, $action='avatar') + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Avatar + $avatar = $this->Avatars->getAvatarByTypeAndLevel($seminary['id'], $charactertypeUrl, $xplevel); + + // Get media + switch($action) + { + case null: + case 'avatar': + $media = $this->Media->getSeminaryMediaById($avatar['avatarpicture_id']); + $file = $this->getMediaFile($media, 'avatar'); + break; + case 'portrait': + $media = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']); + $file = $this->getMediaFile($media); + break; + default: + throw new \nre\exceptions\ParamsNotValidException($action); + break; + } + + // Get file + if(is_null($file)) { return; } @@ -287,10 +337,19 @@ $file = self::resizeImage( $media['filename'], $format, - 480 + \nre\configs\AppConfig::$media['questgroup']['width'], + \nre\configs\AppConfig::$media['questgroup']['height'] ); } break; + case 'avatar': + $file = self::resizeImage( + $media['filename'], + $format, + \nre\configs\AppConfig::$media['avatar']['width'], + \nre\configs\AppConfig::$media['avatar']['height'] + ); + break; default: throw new ParamsNotValidException($action); break; @@ -321,12 +380,14 @@ * * @param string $fileName Absolute pathname of image to resize * @param string $mimeType Mimetype of target image - * @param int $size New size to resize to + * @param int $width Max. width to resize to + * @param int $height Max. height to resize to + * @return mixed Resized image */ - private static function resizeImage($fileName, $mimeType, $size) + private static function resizeImage($fileName, $mimeType, $width, $height) { // Read image from cache - $tempFileName = ROOT.DS.\nre\configs\AppConfig::$dirs['temporary'].DS.'media-'.basename($fileName).'-'.$size; + $tempFileName = ROOT.DS.\nre\configs\AppConfig::$dirs['temporary'].DS.'media-'.basename($fileName).'-'.$width.'x'.$height; if(file_exists($tempFileName)) { // Check age of file @@ -346,12 +407,15 @@ // Calculate new size $geometry = $im->getImageGeometry(); - if($geometry['width'] < $size) { - $size = $geometry['width']; + if($geometry['width'] < $width) { + $width = $geometry['width']; + } + if($geometry['height'] < $height) { + $height = $geometry['width']; } // Process - $im->thumbnailImage($size, 5000, true); + $im->thumbnailImage($width, $height, true); $im->contrastImage(1); $im->setImageFormat($mimeType); diff --git a/controllers/SeminarybarController.inc b/controllers/SeminarybarController.inc index 5ab1567b..88c1037e 100644 --- a/controllers/SeminarybarController.inc +++ b/controllers/SeminarybarController.inc @@ -68,16 +68,6 @@ if($groupsgroup['preferred']) { $group['members'] = $this->Characters->getCharactersForGroup($group['id']); - foreach($group['members'] as &$member) - { - if(!is_null($member['avatar_id'])) - { - $avatar = $this->Avatars->getAvatarById($member['avatar_id']); - if(!is_null($avatar['small_avatarpicture_id'])) { - $member['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']); - } - } - } $characterGroups[] = $group; } } diff --git a/models/AvatarsModel.inc b/models/AvatarsModel.inc index 115d1fb2..9c3d3701 100644 --- a/models/AvatarsModel.inc +++ b/models/AvatarsModel.inc @@ -57,6 +57,36 @@ return null; } + + /** + * Get an Avatar by its Character type and XP-level. + * + * @param int $seminaryId ID of Seminary + * @param string $charactertypeUrl URL-title of Character type + * @param int $xplevel XP-level + * @return array Avatar data + */ + public function getAvatarByTypeAndLevel($seminaryId, $charactertypeUrl, $xplevel) + { + $data = $this->db->query( + 'SELECT avatars.id, charactertype_id, xplevel_id, avatarpicture_id, small_avatarpicture_id '. + 'FROM avatars '. + 'INNER JOIN charactertypes ON charactertypes.id = avatars.charactertype_id '. + 'INNER JOIN xplevels ON xplevels.id = avatars.xplevel_id AND xplevels.seminary_id = charactertypes.seminary_id '. + 'WHERE charactertypes.seminary_id = ? AND charactertypes.url = ? AND xplevels.level = ?', + 'isi', + $seminaryId, + $charactertypeUrl, + $xplevel + ); + if(empty($data)) { + throw new \nre\exceptions\IdNotFoundException($charactertypeUrl); + } + + + return $data[0]; + } + } ?> diff --git a/models/CharactersModel.inc b/models/CharactersModel.inc index 7b27da8d..25dc6a76 100644 --- a/models/CharactersModel.inc +++ b/models/CharactersModel.inc @@ -43,7 +43,7 @@ public function getCharactersForUser($userId) { return $this->db->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. @@ -63,7 +63,7 @@ public function getCharactersForSeminary($seminaryId) { 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 charactertypes_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. + '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, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. @@ -83,7 +83,7 @@ public function getCharactersForGroup($groupId) { 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 charactertypes_url '. + '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 '. 'FROM v_characters AS characters '. 'LEFT JOIN characters_charactergroups ON characters_charactergroups.character_id = characters.id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. @@ -105,12 +105,9 @@ public function getCharacterForUserAndSeminary($userId, $seminaryId) { $data = $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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. + '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 '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. - 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. - 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. - 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. 'WHERE characters.user_id = ? AND charactertypes.seminary_id = ?', 'ii', $userId, $seminaryId @@ -135,14 +132,9 @@ public function getCharacterByUrl($seminaryId, $characterUrl) { $data = $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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description, small_seminarymedia.url AS small_avatar_url, small_seminarymedia.description AS small_avatar_description '. + '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 '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. - 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. - 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. - 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. - 'LEFT JOIN avatarpictures AS small_avatarpictures ON small_avatarpictures.seminarymedia_id = avatars.small_avatarpicture_id '. - 'LEFT JOIN seminarymedia AS small_seminarymedia ON small_seminarymedia.id = small_avatarpictures.seminarymedia_id '. 'WHERE charactertypes.seminary_id = ? AND characters.url = ?', 'is', $seminaryId, $characterUrl @@ -166,14 +158,9 @@ public function getCharacterById($characterId) { $data = $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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description, small_seminarymedia.url AS small_avatar_url, small_seminarymedia.description AS small_avatar_description '. + '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 '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. - 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. - 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. - 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. - 'LEFT JOIN avatarpictures AS small_avatarpictures ON small_avatarpictures.seminarymedia_id = avatars.small_avatarpicture_id '. - 'LEFT JOIN seminarymedia AS small_seminarymedia ON small_seminarymedia.id = small_avatarpictures.seminarymedia_id '. 'WHERE characters.id = ?', 'i', $characterId @@ -273,7 +260,7 @@ public function getSuperiorCharacters($seminaryId, $xps, $count) { 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 charactertypes_url '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'FROM v_characters AS characters '. 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'WHERE charactertypes.seminary_id = ? AND characters.xps > ? '. @@ -296,7 +283,7 @@ public function getInferiorCharacters($seminaryId, $xps, $count) { 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 charactertypes_url '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'FROM v_characters AS characters '. 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'WHERE charactertypes.seminary_id = ? AND characters.xps < ? '. @@ -317,12 +304,9 @@ public function getCharactersSolvedQuest($questId) { return $data = $this->db->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. - 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. - 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. - 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. 'WHERE EXISTS ('. 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. ')', @@ -342,12 +326,9 @@ public function getCharactersUnsolvedQuest($questId) { return $data = $this->db->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. - 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. - 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. - 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. 'WHERE EXISTS ('. 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. ') AND NOT EXISTS ('. @@ -369,12 +350,9 @@ public function getCharactersSubmittedQuest($questId) { return $data = $this->db->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. - 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. - 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. - 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. 'WHERE EXISTS ('. 'SELECT character_id FROM quests_characters WHERE character_id = characters.id AND quest_id = ? AND status = ?'. ') AND NOT EXISTS ('. diff --git a/questtypes/bossfight/html/quest.tpl b/questtypes/bossfight/html/quest.tpl index f1bba542..58fd27c6 100644 --- a/questtypes/bossfight/html/quest.tpl +++ b/questtypes/bossfight/html/quest.tpl @@ -1,7 +1,7 @@
=$character['name']?>
-0) : ?> diff --git a/questtypes/bossfight/html/submission.tpl b/questtypes/bossfight/html/submission.tpl index 260d28b0..433a619e 100644 --- a/questtypes/bossfight/html/submission.tpl +++ b/questtypes/bossfight/html/submission.tpl @@ -1,6 +1,6 @@
=$character['rank']-count($ranking['superior'])+$index?>. =$rankCharacter['name']?>
=_('Level')?> =$rankCharacter['xplevel']?> (=$rankCharacter['xps']?> XPs)
=$character['rank']?>. =$character['name']?>
=_('Level')?> =$character['xplevel']['level']?> (=$character['xps']?> XPs)
=$character['rank']+$index+1?>. =$rankCharacter['name']?>
=_('Level')?> =$rankCharacter['xplevel']?> (=$rankCharacter['xps']?> XPs)
=$character['xps']?> XP