FEATURE: add base support for displaying multiple pages on one-page template

This commit is contained in:
Michal Kváček
2016-09-24 01:53:43 +02:00
parent 7cd084e621
commit b15bbae037
13 changed files with 181 additions and 31 deletions
@@ -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 [];
}
/**
@@ -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)
@@ -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) {
return $path;
}, \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
return [
'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?',
'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.'
];