diff --git a/system/src/Grav/Common/Media/Traits/MediaTrait.php b/system/src/Grav/Common/Media/Traits/MediaTrait.php index 121470ac1..7b764bdd0 100644 --- a/system/src/Grav/Common/Media/Traits/MediaTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaTrait.php @@ -55,9 +55,9 @@ trait MediaTrait */ public function getMedia() { - $cache = $this->getMediaCache(); - if ($this->media === null) { + $cache = $this->getMediaCache(); + // Use cached media if possible. $cacheKey = md5('media' . $this->getCacheKey()); if (!$media = $cache->fetch($cacheKey)) { diff --git a/system/src/Grav/Common/Page/Medium/AbstractMedia.php b/system/src/Grav/Common/Page/Medium/AbstractMedia.php index 58f988610..84d9870cc 100644 --- a/system/src/Grav/Common/Page/Medium/AbstractMedia.php +++ b/system/src/Grav/Common/Page/Medium/AbstractMedia.php @@ -122,7 +122,7 @@ abstract class AbstractMedia extends Getters implements MediaCollectionInterface * @param string $name * @param MediaObjectInterface $file */ - protected function add($name, $file) + public function add($name, $file) { $this->instances[$name] = $file; switch ($file->type) { diff --git a/system/src/Grav/Common/Page/Medium/MediumFactory.php b/system/src/Grav/Common/Page/Medium/MediumFactory.php index b5b197e5b..1c1c28a83 100644 --- a/system/src/Grav/Common/Page/Medium/MediumFactory.php +++ b/system/src/Grav/Common/Page/Medium/MediumFactory.php @@ -10,6 +10,7 @@ namespace Grav\Common\Page\Medium; use Grav\Common\Grav; use Grav\Common\Data\Blueprint; +use Grav\Framework\Form\FormFlashFile; class MediumFactory { @@ -34,7 +35,57 @@ class MediumFactory $config = Grav::instance()['config']; - $media_params = $config->get("media.types." . strtolower($ext)); + $media_params = $config->get('media.types.' . strtolower($ext)); + if (!$media_params) { + return null; + } + + $params += $media_params; + + // Add default settings for undefined variables. + $params += $config->get('media.types.defaults'); + $params += [ + 'type' => 'file', + 'thumb' => 'media/thumb.png', + 'mime' => 'application/octet-stream', + 'filepath' => $file, + 'filename' => $filename, + 'basename' => $basename, + 'extension' => $ext, + 'path' => $path, + 'modified' => filemtime($file), + 'thumbnails' => [] + ]; + + $locator = Grav::instance()['locator']; + + $file = $locator->findResource("image://{$params['thumb']}"); + if ($file) { + $params['thumbnails']['default'] = $file; + } + + return static::fromArray($params); + } + + /** + * Create Medium from an uploaded file + * + * @param FormFlashFile $uploadedFile + * @param array $params + * @return Medium + */ + public static function fromUploadedFile(FormFlashFile $uploadedFile, array $params = []) + { + $parts = pathinfo($uploadedFile->getClientFilename()); + $filename = $parts['basename']; + $ext = $parts['extension']; + $basename = $parts['filename']; + $file = $uploadedFile->getTmpFile(); + $path = dirname($file); + + $config = Grav::instance()['config']; + + $media_params = $config->get('media.types.' . strtolower($ext)); if (!$media_params) { return null; } @@ -75,7 +126,7 @@ class MediumFactory */ public static function fromArray(array $items = [], Blueprint $blueprint = null) { - $type = isset($items['type']) ? $items['type'] : null; + $type = $items['type'] ?? null; switch ($type) { case 'image': diff --git a/system/src/Grav/Framework/Form/FormFlashFile.php b/system/src/Grav/Framework/Form/FormFlashFile.php index 2cb78d016..1f0ae59d8 100644 --- a/system/src/Grav/Framework/Form/FormFlashFile.php +++ b/system/src/Grav/Framework/Form/FormFlashFile.php @@ -108,6 +108,11 @@ class FormFlashFile implements UploadedFileInterface, \JsonSerializable return $this->upload; } + public function getTmpFile() : string + { + return $this->flash->getTmpDir() . '/' . $this->upload['tmp_name']; + } + public function __debugInfo() { return [ @@ -138,9 +143,4 @@ class FormFlashFile implements UploadedFileInterface, \JsonSerializable { return \UPLOAD_ERR_OK === $this->getError(); } - - private function getTmpFile() : string - { - return $this->flash->getTmpDir() . '/' . $this->upload['tmp_name']; - } }