diff --git a/app/CMS/Contracts/Content/DisplayPipeline/Pipeline.php b/app/CMS/Contracts/Content/DisplayPipeline/Pipeline.php new file mode 100644 index 00000000..ee867d53 --- /dev/null +++ b/app/CMS/Contracts/Content/DisplayPipeline/Pipeline.php @@ -0,0 +1,17 @@ +template, ['page' => $content, 'extra' => $parameters]); + } public static function getExtendedFormSections() diff --git a/app/CMS/Helpers/PageRenderer.php b/app/CMS/Helpers/PageRenderer.php index 8a164872..bab9d042 100644 --- a/app/CMS/Helpers/PageRenderer.php +++ b/app/CMS/Helpers/PageRenderer.php @@ -29,11 +29,8 @@ class PageRenderer /** * @var $handler AppHandler */ - // get handler $handler = new $page->moduleHandler; - $page->content = Shortcode::compile($page->content); - // render page return $handler->render($page, $parameters); } diff --git a/app/CMS/Pipeline/DisplayPipeline.php b/app/CMS/Pipeline/DisplayPipeline.php new file mode 100644 index 00000000..91f2bb5d --- /dev/null +++ b/app/CMS/Pipeline/DisplayPipeline.php @@ -0,0 +1,112 @@ +checkValidProcess($process); + + $this->processes[] = $process; + } + + /** + * check if given classname implements Process interface + * + * @param $classname + * + * @throws InvalidProcessType + */ + protected function checkValidProcess($classname) + { + if (!in_array(Process::class, class_implements($classname))) { + throw new InvalidProcessType($classname); + } + } + + /** + * @param null $beforeStart + */ + public function setBeforeStart($beforeStart) + { + $this->checkValidProcess($beforeStart); + + if (!is_null($this->beforeStart)) { + array_unshift($this->processes, $this->beforeStart); + } + + $this->beforeStart = $beforeStart; + } + + /** + * @param null $beforeRender + */ + public function setBeforeRender($beforeRender) + { + $this->checkValidProcess($beforeRender); + + if (!is_null($this->beforeRender)) { + array_push($this->processes, $this->beforeRender); + } + + $this->beforeRender = $beforeRender; + } + + /** + * Run pipeline + * + * @param Content $page + * + * @return Content + */ + function run(Content $page) + { + $this->runBeforeStart($page); + + foreach ($this->processes as $process) { + /** + * @var $run Process + */ + $run = new $process; + $run->handle($page); + } + + $this->runBeforeRender($page); + + return $page; + } + + private function runBeforeStart($page) + { + if (!is_null($this->beforeStart)) { + $process = new $this->beforeStart; + $process->handle($page); + } + } + + private function runBeforeRender($page) + { + if (!is_null($this->beforeRender)) { + $process = new $this->beforeRender; + $process->handle($page); + } + } +} \ No newline at end of file diff --git a/app/CMS/Pipeline/Exceptions/InvalidProcessType.php b/app/CMS/Pipeline/Exceptions/InvalidProcessType.php new file mode 100644 index 00000000..85acf59f --- /dev/null +++ b/app/CMS/Pipeline/Exceptions/InvalidProcessType.php @@ -0,0 +1,6 @@ +view(); + } +} \ No newline at end of file diff --git a/app/CMS/Pipeline/Process/CompileShortcodes.php b/app/CMS/Pipeline/Process/CompileShortcodes.php new file mode 100644 index 00000000..b67e27a2 --- /dev/null +++ b/app/CMS/Pipeline/Process/CompileShortcodes.php @@ -0,0 +1,19 @@ +content = $content; } + /** + * Load page by URL + * + * This method also caches content + * + * @param $url + * + * @return mixed + */ public function getPage($url) { - $contentModel = $this->content; - $page = Cache::remember('content-' . $url, setting('contentCacheLifetime', 5), function () use ($contentModel, $url) { - return $contentModel->getByURL($url); + $contentRepository = $this->content; + $page = Cache::remember('content-' . $url, setting('contentCacheLifetime', 5), function () use ($contentRepository, $url) { + return $contentRepository->getByURL($url); }); // no page available @@ -54,9 +62,10 @@ class ContentPage extends Controller abort(404); } - // add one new "view" for page - $page->view(); + $displayPipeline = app('displayPipeline'); + $page = $displayPipeline->run($page); + + return Controller::VisitorsView($page->template, ['page' => $page]); - return PageRenderer::render($page); } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index d48a6a6f..0dc3d2e5 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -13,6 +13,9 @@ use App\CMS\Handlers\Search\Content; use App\CMS\Handlers\Search\Files; use App\CMS\Handlers\Search\Presenters\AdminContent as AdminContentPresenter; use App\CMS\Handlers\Search\Presenters\AdminFiles; +use App\CMS\Pipeline\DisplayPipeline; +use App\CMS\Pipeline\Process\AddViewedToPage; +use App\CMS\Pipeline\Process\CompileShortcodes; use App\CMS\Repositories\Content\Content as ContentRepository; use App\CMS\Repositories\Module as ModuleRepository; use App\CMS\Repositories\Templates\Template as TemplateRepository; @@ -41,6 +44,7 @@ class AppServiceProvider extends ServiceProvider $this->registerWidgets(); $this->registerSettings(); $this->registerSearch(); + $this->registerDisplayPipeline(); } } @@ -64,6 +68,11 @@ class AppServiceProvider extends ServiceProvider return new WidgetRegistrator($app); }); + // create singleton for display pipeline - pipeline used for displaying visitor pages + $this->app->singleton('displayPipeline', function ($app) { + return new DisplayPipeline(); + }); + // create registrator for template directories $this->app->singleton('registerTemplateDir', function ($app) { return new TemplateRegistrator($app); @@ -115,4 +124,12 @@ class AppServiceProvider extends ServiceProvider $registrator->register(new Content(), new AdminContentPresenter(), SearchEngineRegistrator::ADMIN); $registrator->register(new Files(), new AdminFiles(), SearchEngineRegistrator::ADMIN); } + + private function registerDisplayPipeline() + { + $registrator = $this->app->make('displayPipeline'); + + $registrator->add(AddViewedToPage::class); + $registrator->add(CompileShortcodes::class); + } }