diff --git a/CHANGELOG.md b/CHANGELOG.md index 217f6341e..6cea4dc23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ 1. [](#improved) * Improved `Utils::download()` method to allow overrides on download name, mime and expires header + * Improved `onPageFallBackUrl` event 3. [](#bugfix) * Fixed CLI `--env` and `--lang` options having no effect if they aren't added before all the other options diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index ca6112548..5519175e2 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -729,18 +729,36 @@ class Grav extends Container */ public function fallbackUrl($path) { - $this->fireEvent('onPageFallBackUrl'); - /** @var Uri $uri */ $uri = $this['uri']; /** @var Config $config */ $config = $this['config']; + $path_parts = pathinfo($path); + + /** @var Pages $pages */ + $pages = $this['pages']; + $page = $pages->find($path_parts['dirname'], true); + $uri_extension = strtolower($uri->extension() ?? ''); - $fallback_types = $config->get('system.media.allowed_fallback_types', null); + $fallback_types = $config->get('system.media.allowed_fallback_types'); $supported_types = $config->get('media.types'); + $parsed_url = parse_url(rawurldecode($uri->basename())); + $media_file = $parsed_url['path']; + + $event = new Event([ + 'uri' => $uri, + 'page' => &$page, + 'filename' => &$media_file, + 'extension' => $uri_extension, + 'allowed_fallback_types' => &$fallback_types, + 'media_types' => &$supported_types + ]); + + $this->fireEvent('onPageFallBackUrl', $event); + // Check whitelist first, then ensure extension is a valid media type if (!empty($fallback_types) && !in_array($uri_extension, $fallback_types, true)) { return false; @@ -749,16 +767,8 @@ class Grav extends Container return false; } - $path_parts = pathinfo($path); - - /** @var Pages $pages */ - $pages = $this['pages']; - $page = $pages->find($path_parts['dirname'], true); - if ($page) { $media = $page->media()->all(); - $parsed_url = parse_url(rawurldecode($uri->basename())); - $media_file = $parsed_url['path']; // if this is a media object, try actions first if (isset($media[$media_file])) {