diff --git a/system/pages/notfound.md b/system/pages/notfound.md new file mode 100644 index 000000000..ca7d3ded7 --- /dev/null +++ b/system/pages/notfound.md @@ -0,0 +1,5 @@ +--- +title: Not Found +routable: false +notfound: true +--- diff --git a/system/src/Grav/Common/Processors/PagesProcessor.php b/system/src/Grav/Common/Processors/PagesProcessor.php index e4c663455..5ea2c53c2 100644 --- a/system/src/Grav/Common/Processors/PagesProcessor.php +++ b/system/src/Grav/Common/Processors/PagesProcessor.php @@ -8,6 +8,8 @@ namespace Grav\Common\Processors; +use Grav\Common\Page\Page; + class PagesProcessor extends ProcessorBase implements ProcessorInterface { public $id = 'pages'; @@ -17,6 +19,22 @@ class PagesProcessor extends ProcessorBase implements ProcessorInterface { $this->container['pages']->init(); $this->container->fireEvent('onPagesInitialized'); $this->container->fireEvent('onPageInitialized'); + + /** @var Page $page */ + $page = $this->container['page']; + + if (!$page->routable()) { + // If no page found, fire event + $event = $this->container->fireEvent('onPageNotFound'); + + if (isset($event->page)) { + unset ($this->container['page']); + $this->container['page'] = $event->page; + } else { + throw new \RuntimeException('Page Not Found', 404); + } + } + } } diff --git a/system/src/Grav/Common/Service/PageServiceProvider.php b/system/src/Grav/Common/Service/PageServiceProvider.php index a8b005678..9e0f7b7dd 100644 --- a/system/src/Grav/Common/Service/PageServiceProvider.php +++ b/system/src/Grav/Common/Service/PageServiceProvider.php @@ -8,6 +8,7 @@ namespace Grav\Common\Service; +use Grav\Common\Page\Page; use Pimple\Container; use Pimple\ServiceProviderInterface; @@ -77,14 +78,13 @@ class PageServiceProvider implements ServiceProviderInterface // Try fallback URL stuff... $c->fallbackUrl($path); - // If no page found, fire event - $event = $c->fireEvent('onPageNotFound'); - - if (isset($event->page)) { - $page = $event->page; - } else { - throw new \RuntimeException('Page Not Found', 404); + if (!$page) { + $path = $c['locator']->findResource('system://pages/notfound.md'); + $page = new Page(); + $page->init(new \SplFileInfo($path)); + $page->routable(false); } + } return $page;