From b15bbae037ff9207294ff990b07179eb4b1fc067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Sat, 24 Sep 2016 01:53:43 +0200 Subject: [PATCH] FEATURE: add base support for displaying multiple pages on one-page template --- app/Helpers/PageRenderer.php | 39 +++++++++++++++ app/Http/Controllers/Visitor/ContentPage.php | 18 +------ app/Http/Controllers/Visitor/Homepage.php | 8 ++-- templates/Base/OnePage/Handlers/OnePage.php | 47 +++++++++++++++++++ .../Http/Controllers/Admin/SetHomepage.php | 7 +++ .../OnePage/Listeners/HomepageChanged.php | 37 +++++++++++++++ .../Base/OnePage/Providers/EventProvider.php | 13 +++++ .../OnePage/Providers/OnePageTemplate.php | 3 ++ .../Resources/lang/en/admin/setHomepage.php | 21 +++++---- .../modules/article/visitor/test.blade.php | 1 - .../staticpages/visitor/homepage.blade.php | 13 +++++ .../staticpages/visitor/normalPage.blade.php | 5 ++ .../staticpages/visitor/test.blade.php | 0 13 files changed, 181 insertions(+), 31 deletions(-) create mode 100644 app/Helpers/PageRenderer.php create mode 100644 templates/Base/OnePage/Listeners/HomepageChanged.php create mode 100644 templates/Base/OnePage/Providers/EventProvider.php delete mode 100644 templates/Jednostrankovka/Resources/views/modules/article/visitor/test.blade.php create mode 100644 templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/homepage.blade.php create mode 100644 templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/normalPage.blade.php delete mode 100644 templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/test.blade.php diff --git a/app/Helpers/PageRenderer.php b/app/Helpers/PageRenderer.php new file mode 100644 index 00000000..06e31ab9 --- /dev/null +++ b/app/Helpers/PageRenderer.php @@ -0,0 +1,39 @@ +module_settings = json_decode($page->module_settings); + + // do something template-specific + $parameters = call_user_func_array([CurrentTemplate::handler(), 'beforeRender'], [&$page]); + + /** + * @var $handler AppHandler + */ + // get handler + $handler = new $page->module_handler; + // render page + return $handler->render($page, $parameters); + } +} diff --git a/app/Http/Controllers/Visitor/ContentPage.php b/app/Http/Controllers/Visitor/ContentPage.php index 8158537d..f7596c0a 100644 --- a/app/Http/Controllers/Visitor/ContentPage.php +++ b/app/Http/Controllers/Visitor/ContentPage.php @@ -2,8 +2,7 @@ namespace App\Http\Controllers\Visitor; -use App\Handlers\Contracts\AppHandler; -use App\Helpers\CurrentTemplate; +use App\Helpers\PageRenderer; use App\Http\Controllers\Controller; use App\Models\Content; use Illuminate\Support\Facades\Auth; @@ -54,19 +53,6 @@ class ContentPage extends Controller // add one new "view" for page $page->view(); - // decode module settings - $page->module_settings = json_decode($page->module_settings); - - // get handler - /** - * @var $handler AppHandler - */ - $handler = new $page->module_handler; - - // do something template-specific - $parameters = call_user_func_array([CurrentTemplate::handler(), 'beforeRender'], [&$page]); - - // render page - return $handler->render($page, $parameters); + return PageRenderer::render($page); } } diff --git a/app/Http/Controllers/Visitor/Homepage.php b/app/Http/Controllers/Visitor/Homepage.php index 00c0264d..a40ba1da 100644 --- a/app/Http/Controllers/Visitor/Homepage.php +++ b/app/Http/Controllers/Visitor/Homepage.php @@ -17,10 +17,10 @@ class Homepage extends ContentPage } // render page - try { +// try { return $this->renderPage($page); - } catch (\Exception $e) { - return view('errors.homepageNotAvailable', ['exception' => $e, 'reason' => 'exception']); - } +// } catch (\Exception $e) { +// return view('errors.homepageNotAvailable', ['exception' => $e, 'reason' => 'exception']); +// } } } diff --git a/templates/Base/OnePage/Handlers/OnePage.php b/templates/Base/OnePage/Handlers/OnePage.php index 8a43c241..d68b2181 100644 --- a/templates/Base/OnePage/Handlers/OnePage.php +++ b/templates/Base/OnePage/Handlers/OnePage.php @@ -2,9 +2,12 @@ namespace Templates\Base\OnePage\Handlers; use App\Handlers\Contracts\TemplateHandler; +use App\Helpers\PageRenderer; +use App\Helpers\Settings; use App\Models\Content; use App\Models\Module; use App\Models\User; +use Illuminate\Support\Facades\Auth; abstract class OnePage implements TemplateHandler { @@ -23,6 +26,50 @@ abstract class OnePage implements TemplateHandler */ public static function registerAdminMenu(User $user) { + $menu = \Menu::instance('mainMenu'); + $menu->route('template.setHomepage', trans('template::admin/mainMenu.setHomepage'), [], 1, ['icon' => 'fa fa-fw fa-home']); + } + + /** + * Prepare Content object to be rendered using Blade template + * + * @param Content $content + */ + public static function beforeRender(Content & $content) + { + if ($content->is_homepage) { + $pageIds = (array)json_decode(Settings::get(self::HOMEPAGE_PAGES_SETTINGS_KEY, '[]')); + + if (empty($pageIds)) { + return []; + } + + // get all available pages + $pages = Content::whereIn('id', $pageIds); + + if (Auth::user()) { + $pages = $pages->where('status', '!=', Content::STATUS_DRAFT); + } else { + $pages = $pages->where('status', Content::STATUS_PUBLIC); + } + + $pages = $pages->get(); + + // create real content from pages + $pagesRaw = $pagesInTemplates = []; + foreach ($pages as $page) { + $pagesRaw[$page->url] = $page; + $pagesInTemplates[$page->url] = PageRenderer::render($page) + ->render(); + } + + // dd($pagesRaw); + + // return pages into template + return ['pagesHtml' => $pagesInTemplates, 'pagesRaw' => $pagesRaw]; + } + + return []; } /** diff --git a/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php b/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php index f100e7af..026e4a1f 100644 --- a/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php +++ b/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php @@ -77,6 +77,13 @@ class SetHomepage extends Controller */ public function addPage($id) { + $page = Content::findOrFail($id); + + if ($page->is_template) { + return redirect() + ->back() + ->with('error', trans('template::admin/setHomepage.cannotSetHomepageAsPartOfHomepage')); + } // try to get page config $settingsEntry = \App\Models\Settings::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) diff --git a/templates/Base/OnePage/Listeners/HomepageChanged.php b/templates/Base/OnePage/Listeners/HomepageChanged.php new file mode 100644 index 00000000..d213272f --- /dev/null +++ b/templates/Base/OnePage/Listeners/HomepageChanged.php @@ -0,0 +1,37 @@ +page->id, $pagesOnHomepage)) { + $position = array_search($event->page->id, $pagesOnHomepage); + + unset($pagesOnHomepage[$position]); + + $pages = array_values($pagesOnHomepage); + + $settings = SettingsModel::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) + ->where('language', \LaravelLocalization::getCurrentLocale()); + + // update in database + if (!empty($pages)) { + $settings->update(['value' => json_encode($pages)]); + } else { + $settings->delete(); + } + } + } +} \ No newline at end of file diff --git a/templates/Base/OnePage/Providers/EventProvider.php b/templates/Base/OnePage/Providers/EventProvider.php new file mode 100644 index 00000000..801b4b16 --- /dev/null +++ b/templates/Base/OnePage/Providers/EventProvider.php @@ -0,0 +1,13 @@ + [HomepageChanged::class] + ]; +} \ No newline at end of file diff --git a/templates/Base/OnePage/Providers/OnePageTemplate.php b/templates/Base/OnePage/Providers/OnePageTemplate.php index 5adc4e77..642466d1 100644 --- a/templates/Base/OnePage/Providers/OnePageTemplate.php +++ b/templates/Base/OnePage/Providers/OnePageTemplate.php @@ -23,5 +23,8 @@ class OnePageTemplate extends ServiceProvider $this->loadViewsFrom(array_merge(array_map(function ($path) { return $path; }, \Config::get('view.paths')), [__DIR__ . '/../Resources/views']), 'template'); + + // register event service provider for this template + $this->app->register(EventProvider::class); } } \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php b/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php index 9065c5db..7da9432c 100644 --- a/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php +++ b/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php @@ -1,14 +1,15 @@ 'Homepage setup', - 'pageDescription' => 'On this page you can setup all pages which should appear on homepage. Use drag\'n\'drop feature and organize your pages into your presentation.', - 'noPagesSelected' => 'No pages selected for homepage. Yet...', - 'noPagesAvailable' => 'There are no pages you could set up for homepage.', - 'successfullyAdded' => 'Page successfully added to homepage.', - 'successfullyRemoved' => 'Page successfully removed from homepage.', - 'invalidPageId' => 'Cannot remove page from homepage, because given ID does not exist.', - 'usedPages' => 'Used pages', - 'notUsedPages' => 'Not used pages', - 'reallyRemovePage' => 'Do you really want to remove this page from homepage?', + 'title' => 'Homepage setup', + 'pageDescription' => 'On this page you can setup all pages which should appear on homepage. Use drag\'n\'drop feature and organize your pages into your presentation.', + 'noPagesSelected' => 'No pages selected for homepage. Yet...', + 'noPagesAvailable' => 'There are no pages you could set up for homepage.', + 'successfullyAdded' => 'Page successfully added to homepage.', + 'successfullyRemoved' => 'Page successfully removed from homepage.', + 'invalidPageId' => 'Cannot remove page from homepage, because given ID does not exist.', + 'usedPages' => 'Used pages', + 'notUsedPages' => 'Not used pages', + 'reallyRemovePage' => 'Do you really want to remove this page from homepage?', + 'cannotSetHomepageAsPartOfHomepage' => 'Cannot set currently set homepage as one of homepage pages.' ]; \ No newline at end of file diff --git a/templates/Jednostrankovka/Resources/views/modules/article/visitor/test.blade.php b/templates/Jednostrankovka/Resources/views/modules/article/visitor/test.blade.php deleted file mode 100644 index ac278af2..00000000 --- a/templates/Jednostrankovka/Resources/views/modules/article/visitor/test.blade.php +++ /dev/null @@ -1 +0,0 @@ -{{dd($page)}} \ No newline at end of file diff --git a/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/homepage.blade.php b/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/homepage.blade.php new file mode 100644 index 00000000..02361ecb --- /dev/null +++ b/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/homepage.blade.php @@ -0,0 +1,13 @@ +

{{$page->title}}

+ +
+ {!! $page->content !!} +
+ +
+ +@if(isset($extra['pagesHtml'])) + @foreach($extra['pagesHtml'] as $subpage) + {!! $subpage !!} + @endforeach +@endif \ No newline at end of file diff --git a/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/normalPage.blade.php b/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/normalPage.blade.php new file mode 100644 index 00000000..54295eed --- /dev/null +++ b/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/normalPage.blade.php @@ -0,0 +1,5 @@ +

{{$page->title}}

+ +
+ {!! $page->content !!} +
\ No newline at end of file diff --git a/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/test.blade.php b/templates/Jednostrankovka/Resources/views/modules/staticpages/visitor/test.blade.php deleted file mode 100644 index e69de29b..00000000