diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index eade2271..f33044de 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -59,11 +59,12 @@ * @var array */ public static $dirs = array( - 'locale' => 'locale', - 'media' => 'media', - 'questtypes' => 'questtypes', - 'temporary' => 'tmp', - 'uploads' => 'uploads' + 'locale' => 'locale', + 'media' => 'media', + 'seminarymedia' => 'seminarymedia', + 'questtypes' => 'questtypes', + 'temporary' => 'tmp', + 'uploads' => 'uploads' ); diff --git a/controllers/CharactergroupsquestsController.inc b/controllers/CharactergroupsquestsController.inc index 52dc3435..fb9d18c8 100644 --- a/controllers/CharactergroupsquestsController.inc +++ b/controllers/CharactergroupsquestsController.inc @@ -74,7 +74,7 @@ // Media $questmedia = null; if(!is_null($quest['questsmedia_id'])) { - $questmedia = $this->Media->getMediaById($quest['questsmedia_id']); + $questmedia = $this->Media->getSeminaryMediaById($quest['questsmedia_id']); } diff --git a/controllers/MediaController.inc b/controllers/MediaController.inc index 897f2701..3c70a832 100644 --- a/controllers/MediaController.inc +++ b/controllers/MediaController.inc @@ -25,7 +25,8 @@ * @var array */ public $permissions = array( - 'index' => array('admin', 'moderator', 'user') + 'index' => array('admin', 'moderator', 'user', 'guest'), + 'seminary' => array('admin', 'moderator', 'user', 'guest') ); /** * User seminary permissions @@ -33,7 +34,7 @@ * @var array */ public $seminaryPermissions = array( - 'index' => array('admin', 'moderator', 'user') + 'seminary' => array('admin', 'moderator', 'user', 'guest') ); /** * Required models @@ -64,21 +65,16 @@ /** - * Action: index. + * Action: index * - * Display a medium without processing. + * Display a medium. * - * @throws IdNotFoundException - * @param string $seminaryUrl URL-title of the Seminary * @param string $mediaUrl URL-name of the medium */ - public function index($seminaryUrl, $mediaUrl, $action=null) + public function index($mediaUrl, $action=null) { - // Get Seminary - $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); - // Get Media - $media = $this->Media->getMediaByUrl($seminary['id'], $mediaUrl); + $media = $this->Media->getMediaByUrl($mediaUrl); // Get format $format = explode('/', $media['mimetype']); @@ -98,6 +94,63 @@ return; } + // Load and process file + $file = null; + switch($action) + { + // No action + case null: + // Do not process the file + $file = file_get_contents($media['filename']); + break; + default: + throw new ParamsNotValidException($action); + break; + } + + + + // Pass data to view + $this->set('media', $media); + $this->set('file', $file); + } + + + /** + * Action: seminary. + * + * Display a Seminary medium. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-title of the Seminary + * @param string $mediaUrl URL-name of the medium + */ + public function seminary($seminaryUrl, $mediaUrl, $action=null) + { + // Get Seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Get Media + $media = $this->Media->getSeminaryMediaByUrl($seminary['id'], $mediaUrl); + + // Get format + $format = explode('/', $media['mimetype']); + $format = $format[1]; + + // Set content-type + $this->response->addHeader("Content-type: ".$media['mimetype'].""); + + // Set filename + $media['filename'] = ROOT.DS.\nre\configs\AppConfig::$dirs['seminarymedia'].DS.$media['id']; + if(!file_exists($media['filename'])) { + throw new \nre\exceptions\IdNotFoundException($mediaUrl); + } + + // Cache + if($this->setCacheHeaders($media['filename'])) { + return; + } + // Load and process file $file = null; switch($action) diff --git a/controllers/QuestgroupsController.inc b/controllers/QuestgroupsController.inc index 92c86be2..d7b8acf1 100644 --- a/controllers/QuestgroupsController.inc +++ b/controllers/QuestgroupsController.inc @@ -115,7 +115,7 @@ $picture = null; if(!is_null($questgroup['questgroupspicture_id'])) { - $picture = $this->Media->getMediaById($questgroup['questgroupspicture_id']); + $picture = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']); } diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index e755fe01..e930cbd6 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -70,7 +70,7 @@ $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); $questgroup['picture'] = null; if(!is_null($questgroup['questgroupspicture_id'])) { - $questgroup['picture'] = $this->Media->getMediaById($questgroup['questgroupspicture_id']); + $questgroup['picture'] = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']); } @@ -151,7 +151,7 @@ { // Questtext media if(!is_null($questtext['questsmedia_id'])) { - $questtext['media'] = $this->Media->getMediaById($questtext['questsmedia_id']); + $questtext['media'] = $this->Media->getSeminaryMediaById($questtext['questsmedia_id']); } // Related Questgroups @@ -177,7 +177,7 @@ // Quest media $questmedia = null; if(!is_null($quest['questsmedia_id'])) { - $questmedia = $this->Media->getMediaById($quest['questsmedia_id']); + $questmedia = $this->Media->getSeminaryMediaById($quest['questsmedia_id']); } // Task diff --git a/controllers/SeminariesController.inc b/controllers/SeminariesController.inc index 61b83a67..21a781ff 100644 --- a/controllers/SeminariesController.inc +++ b/controllers/SeminariesController.inc @@ -127,7 +127,7 @@ // Get Media $questgroup['picture'] = null; try { - $questgroup['picture'] = $this->Media->getMediaById($questgroup['questgroupspicture_id']); + $questgroup['picture'] = $this->Media->getSeminaryMediaById($questgroup['questgroupspicture_id']); } catch(\nre\exceptions\IdNotFoundException $e) { } diff --git a/models/CharactersModel.inc b/models/CharactersModel.inc index 1f0c1f5e..43406b0a 100644 --- a/models/CharactersModel.inc +++ b/models/CharactersModel.inc @@ -132,12 +132,12 @@ 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, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. '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.media_id = avatars.avatarpicture_id '. - 'LEFT JOIN media ON media.id = avatarpictures.media_id '. + 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. + 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. 'WHERE charactertypes.seminary_id = ? AND characters.url = ?', 'is', $seminaryId, $characterUrl @@ -161,12 +161,12 @@ 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, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, media.url AS avatar_url, media.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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. '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.media_id = avatars.avatarpicture_id '. - 'LEFT JOIN media ON media.id = avatarpictures.media_id '. + 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. + 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. 'WHERE characters.id = ?', 'i', $characterId @@ -264,12 +264,12 @@ 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, media.url AS avatar_url, media.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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. '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.media_id = avatars.avatarpicture_id '. - 'LEFT JOIN media ON media.id = avatarpictures.media_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 = ?'. ')', @@ -289,12 +289,12 @@ 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, media.url AS avatar_url, media.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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. '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.media_id = avatars.avatarpicture_id '. - 'LEFT JOIN media ON media.id = avatarpictures.media_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 ('. @@ -316,12 +316,12 @@ 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, media.url AS avatar_url, media.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 charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. '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.media_id = avatars.avatarpicture_id '. - 'LEFT JOIN media ON media.id = avatarpictures.media_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/models/MediaModel.inc b/models/MediaModel.inc index 6165f7df..34e0c0e8 100644 --- a/models/MediaModel.inc +++ b/models/MediaModel.inc @@ -35,19 +35,18 @@ /** - * Get a Medium by its URL. + * Get a medium by its URL. * * @throws IdNotFoundException - * @param int $seminaryId ID of the seminary * @param string $mediaURL URL-name of the Medium * @return array Medium data */ - public function getMediaByUrl($seminaryId, $mediaUrl) + public function getMediaByUrl($mediaUrl) { $data = $this->db->query( 'SELECT id, name, url, description, mimetype '. 'FROM media '. - 'WHERE media.url = ?', + 'WHERE url = ?', 's', $mediaUrl ); @@ -61,10 +60,9 @@ /** - * Get a Medium by its ID. + * Get a medium by its ID. * * @throws IdNotFoundException - * @param int $seminaryId ID of the seminary * @param int $mediaId ID of the Medium * @return array Medium data */ @@ -73,7 +71,59 @@ $data = $this->db->query( 'SELECT id, name, url, description, mimetype '. 'FROM media '. - 'WHERE media.id = ?', + 'WHERE id = ?', + 'i', + $mediaId + ); + if(empty($data)) { + throw new \nre\exceptions\IdNotFoundException($mediaId); + } + + + return $data[0]; + } + + + /** + * Get a Seminary medium by its URL. + * + * @throws IdNotFoundException + * @param int $seminaryId ID of the seminary + * @param string $mediaURL URL-name of the Medium + * @return array Medium data + */ + public function getSeminaryMediaByUrl($seminaryId, $mediaUrl) + { + $data = $this->db->query( + 'SELECT id, name, url, description, mimetype '. + 'FROM seminarymedia '. + 'WHERE url = ?', + 's', + $mediaUrl + ); + if(empty($data)) { + throw new \nre\exceptions\IdNotFoundException($mediaUrl); + } + + + return $data[0]; + } + + + /** + * Get a Seminary medium by its ID. + * + * @throws IdNotFoundException + * @param int $seminaryId ID of the seminary + * @param int $mediaId ID of the Medium + * @return array Medium data + */ + public function getSeminaryMediaById($mediaId) + { + $data = $this->db->query( + 'SELECT id, name, url, description, mimetype '. + 'FROM seminarymedia '. + 'WHERE id = ?', 'i', $mediaId ); diff --git a/questtypes/dragndrop/DragndropQuesttypeController.inc b/questtypes/dragndrop/DragndropQuesttypeController.inc index 2fc0b2b2..90843218 100644 --- a/questtypes/dragndrop/DragndropQuesttypeController.inc +++ b/questtypes/dragndrop/DragndropQuesttypeController.inc @@ -112,13 +112,13 @@ { // Get Drag&Drop field $dndField = $this->Dragndrop->getDragndrop($quest['id']); - $dndField['media'] = $this->Media->getMediaById($dndField['questmedia_id']); + $dndField['media'] = $this->Media->getSeminaryMediaById($dndField['questmedia_id']); // Get Drags $drags = array(); $dragsByIndex = $this->Dragndrop->getDrags($dndField['quest_id']); foreach($dragsByIndex as &$drag) { - $drag['media'] = $this->Media->getMediaById($drag['questmedia_id']); + $drag['media'] = $this->Media->getSeminaryMediaById($drag['questmedia_id']); $drags[$drag['id']] = $drag; } @@ -162,13 +162,13 @@ { // Get Drag&Drop field $dndField = $this->Dragndrop->getDragndrop($quest['id']); - $dndField['media'] = $this->Media->getMediaById($dndField['questmedia_id']); + $dndField['media'] = $this->Media->getSeminaryMediaById($dndField['questmedia_id']); // Get Drags $drags = array(); $dragsByIndex = $this->Dragndrop->getDrags($dndField['quest_id']); foreach($dragsByIndex as &$drag) { - $drag['media'] = $this->Media->getMediaById($drag['questmedia_id']); + $drag['media'] = $this->Media->getSeminaryMediaById($drag['questmedia_id']); $drags[$drag['id']] = $drag; } diff --git a/questtypes/dragndrop/html/quest.tpl b/questtypes/dragndrop/html/quest.tpl index bf8dcfe2..1af4dd6a 100644 --- a/questtypes/dragndrop/html/quest.tpl +++ b/questtypes/dragndrop/html/quest.tpl @@ -1,5 +1,5 @@