FEATURE: add base support for displaying multiple pages on one-page template
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\Helpers;
|
||||||
|
|
||||||
|
use App\Handlers\Contracts\AppHandler;
|
||||||
|
use App\Models\Content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PageRenderer
|
||||||
|
*
|
||||||
|
* Simple class for rendering page for visitor
|
||||||
|
*
|
||||||
|
* @package App\Helpers
|
||||||
|
*/
|
||||||
|
class PageRenderer
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Render page
|
||||||
|
*
|
||||||
|
* @param Content $page
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function render(Content $page)
|
||||||
|
{
|
||||||
|
// decode module settings
|
||||||
|
$page->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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers\Visitor;
|
namespace App\Http\Controllers\Visitor;
|
||||||
|
|
||||||
use App\Handlers\Contracts\AppHandler;
|
use App\Helpers\PageRenderer;
|
||||||
use App\Helpers\CurrentTemplate;
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Models\Content;
|
use App\Models\Content;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
@@ -54,19 +53,6 @@ class ContentPage extends Controller
|
|||||||
// add one new "view" for page
|
// add one new "view" for page
|
||||||
$page->view();
|
$page->view();
|
||||||
|
|
||||||
// decode module settings
|
return PageRenderer::render($page);
|
||||||
$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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ class Homepage extends ContentPage
|
|||||||
}
|
}
|
||||||
|
|
||||||
// render page
|
// render page
|
||||||
try {
|
// try {
|
||||||
return $this->renderPage($page);
|
return $this->renderPage($page);
|
||||||
} catch (\Exception $e) {
|
// } catch (\Exception $e) {
|
||||||
return view('errors.homepageNotAvailable', ['exception' => $e, 'reason' => 'exception']);
|
// return view('errors.homepageNotAvailable', ['exception' => $e, 'reason' => 'exception']);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
namespace Templates\Base\OnePage\Handlers;
|
namespace Templates\Base\OnePage\Handlers;
|
||||||
|
|
||||||
use App\Handlers\Contracts\TemplateHandler;
|
use App\Handlers\Contracts\TemplateHandler;
|
||||||
|
use App\Helpers\PageRenderer;
|
||||||
|
use App\Helpers\Settings;
|
||||||
use App\Models\Content;
|
use App\Models\Content;
|
||||||
use App\Models\Module;
|
use App\Models\Module;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
abstract class OnePage implements TemplateHandler
|
abstract class OnePage implements TemplateHandler
|
||||||
{
|
{
|
||||||
@@ -23,6 +26,50 @@ abstract class OnePage implements TemplateHandler
|
|||||||
*/
|
*/
|
||||||
public static function registerAdminMenu(User $user)
|
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 [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -77,6 +77,13 @@ class SetHomepage extends Controller
|
|||||||
*/
|
*/
|
||||||
public function addPage($id)
|
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
|
// try to get page config
|
||||||
$settingsEntry = \App\Models\Settings::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY)
|
$settingsEntry = \App\Models\Settings::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY)
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
namespace Templates\Base\OnePage\Listeners;
|
||||||
|
|
||||||
|
use App\Events\SetHomepage;
|
||||||
|
use App\Helpers\Settings;
|
||||||
|
use App\Models\Settings as SettingsModel;
|
||||||
|
use Templates\Base\OnePage\Handlers\OnePage;
|
||||||
|
|
||||||
|
class HomepageChanged
|
||||||
|
{
|
||||||
|
public function handle(SetHomepage $event)
|
||||||
|
{
|
||||||
|
$pagesOnHomepage = (array)json_decode(Settings::get(OnePage::HOMEPAGE_PAGES_SETTINGS_KEY, '[]'));
|
||||||
|
|
||||||
|
if (empty($pagesOnHomepage)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array($event->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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
namespace Templates\Base\OnePage\Providers;
|
||||||
|
|
||||||
|
use App\Events\SetHomepage;
|
||||||
|
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
|
||||||
|
use Templates\Base\OnePage\Listeners\HomepageChanged;
|
||||||
|
|
||||||
|
class EventProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
protected $listen = [
|
||||||
|
SetHomepage::class => [HomepageChanged::class]
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -23,5 +23,8 @@ class OnePageTemplate extends ServiceProvider
|
|||||||
$this->loadViewsFrom(array_merge(array_map(function ($path) {
|
$this->loadViewsFrom(array_merge(array_map(function ($path) {
|
||||||
return $path;
|
return $path;
|
||||||
}, \Config::get('view.paths')), [__DIR__ . '/../Resources/views']), 'template');
|
}, \Config::get('view.paths')), [__DIR__ . '/../Resources/views']), 'template');
|
||||||
|
|
||||||
|
// register event service provider for this template
|
||||||
|
$this->app->register(EventProvider::class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,15 @@
|
|||||||
<?php
|
<?php
|
||||||
return [
|
return [
|
||||||
'title' => 'Homepage setup',
|
'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.',
|
'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...',
|
'noPagesSelected' => 'No pages selected for homepage. Yet...',
|
||||||
'noPagesAvailable' => 'There are no pages you could set up for homepage.',
|
'noPagesAvailable' => 'There are no pages you could set up for homepage.',
|
||||||
'successfullyAdded' => 'Page successfully added to homepage.',
|
'successfullyAdded' => 'Page successfully added to homepage.',
|
||||||
'successfullyRemoved' => 'Page successfully removed from homepage.',
|
'successfullyRemoved' => 'Page successfully removed from homepage.',
|
||||||
'invalidPageId' => 'Cannot remove page from homepage, because given ID does not exist.',
|
'invalidPageId' => 'Cannot remove page from homepage, because given ID does not exist.',
|
||||||
'usedPages' => 'Used pages',
|
'usedPages' => 'Used pages',
|
||||||
'notUsedPages' => 'Not used pages',
|
'notUsedPages' => 'Not used pages',
|
||||||
'reallyRemovePage' => 'Do you really want to remove this page from homepage?',
|
'reallyRemovePage' => 'Do you really want to remove this page from homepage?',
|
||||||
|
'cannotSetHomepageAsPartOfHomepage' => 'Cannot set currently set homepage as one of homepage pages.'
|
||||||
|
|
||||||
];
|
];
|
||||||
@@ -1 +0,0 @@
|
|||||||
{{dd($page)}}
|
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
<h1>{{$page->title}}</h1>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{!! $page->content !!}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
@if(isset($extra['pagesHtml']))
|
||||||
|
@foreach($extra['pagesHtml'] as $subpage)
|
||||||
|
{!! $subpage !!}
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<h3>{{$page->title}}</h3>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{!! $page->content !!}
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user