commit e9671314a5001804118884cc9895396c0f54feac Author: Michal Kváček Date: Thu Aug 24 02:51:49 2017 +0200 FEATURE: move template into own repository diff --git a/OnePage/Events/AddPageIntoHomepage.php b/OnePage/Events/AddPageIntoHomepage.php new file mode 100755 index 0000000..2415e47 --- /dev/null +++ b/OnePage/Events/AddPageIntoHomepage.php @@ -0,0 +1,18 @@ +page = $page; + } +} \ No newline at end of file diff --git a/OnePage/Events/RemovePageFromHomepage.php b/OnePage/Events/RemovePageFromHomepage.php new file mode 100755 index 0000000..6b7e2e8 --- /dev/null +++ b/OnePage/Events/RemovePageFromHomepage.php @@ -0,0 +1,18 @@ +page = $page; + } +} \ No newline at end of file diff --git a/OnePage/Handlers/OnePage.php b/OnePage/Handlers/OnePage.php new file mode 100755 index 0000000..39acbad --- /dev/null +++ b/OnePage/Handlers/OnePage.php @@ -0,0 +1,188 @@ +route('template.setHomepage', trans('template::admin/mainMenu.setHomepage'), [], 1, ['icon' => 'fa fa-fw fa-home']); + } + + /** + * Getter for pages displayed on homepage + * + * @return array + */ + public static function getPagesOnHomepage() + { + if (!self::$homepagePagesInitialized) { + $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', '!=', IContent::STATUS_DRAFT); + } else { + $pages = $pages->where('status', IContent::STATUS_PUBLIC); + } + + $homepagePages = $pages->get() + ->getDictionary(); + + foreach ($pageIds as $pageId) { + if (!isset($homepagePages[$pageId])) { + continue; + } + + self::$homepagePages[] = $homepagePages[$pageId]; + } + + self::$homepagePagesInitialized = true; + } + + return self::$homepagePages; + } + + /** + * Prepare Content object to be rendered using Blade template + * + * @param Content $content + * + * @return array + */ + public static function beforeRender(Content & $content) + { + if ($content->isHomepage) { + $pages = self::getPagesOnHomepage(); + + // create real content from pages + $pagesRaw = $pagesInTemplates = []; + foreach ($pages as $page) { + // save pages as models only + $pagesRaw[$page->url] = $page; + + // save rendered pages + try { + $pagesInTemplates[$page->url] = PageRenderer::render($page) + ->render(); + } catch (\Exception $e) { + if (Auth::user()) { + $pagesInTemplates[$page->url] = view(Template::name('errors.cannotRender'), ['page' => $page])->render(); + } + } + } + + // return pages into template + return ['pagesHtml' => $pagesInTemplates, 'pagesRaw' => $pagesRaw]; + } + + return []; + } + + /** + * Install module + */ + public static function install() + { + // register action log types + + $types = [ + [ + 'string_id' => 'pageRemovedFromHomepage', + 'name' => 'template::admin/setHomepage.events.names.removedPage', + 'value' => 'template::admin/setHomepage.events.descriptions.removedPage', + ], + [ + 'string_id' => 'pageAddedIntoHomepage', + 'name' => 'template::admin/setHomepage.events.names.addedPage', + 'value' => 'template::admin/setHomepage.events.descriptions.addedPage', + ], + + ]; + foreach ($types as $type) { + ActionLogType::create($type); + } + + // try to create onepage menu widget + $widgetName = OnePageMenu::getName(); + $widgetDescription = OnePageMenu::getDescription(); + + CurrentTemplate::reset(); + + // create row in widget types + WidgetType::create([ + 'handler' => OnePageMenu::class, + 'name' => $widgetName, + 'module_id' => null, + 'template_id' => CurrentTemplate::get()->id, + 'description' => $widgetDescription + ]); + + $area = WidgetArea::create(['name' => 'Top menu', 'code' => 'topMenu', 'deletable' => 0]); + $widget = Widget::create([ + 'widget_type_handler' => OnePageMenu::class, + 'name' => 'Menu', + 'settings' => '{"containerClass": null}', + 'deletable' => 0 + ]); + + // bind widget with widget area + WidgetInWidgetArea::create(['widget_id' => $widget->id, 'widget_area_id' => $area->id, 'position' => 1]); + } + + /** + * Uninstall template + * + * @param Module $template + */ + public static function uninstall(Module $template) + { + // delete action log types + ActionLogType::whereIn('string_id', ['pageRemovedFromHomepage', 'pageAddedIntoHomepage']) + ->delete(); + + // delete settings with pages on homepage + SettingsModel::where('key', self::HOMEPAGE_PAGES_SETTINGS_KEY) + ->delete(); + } +} \ No newline at end of file diff --git a/OnePage/Http/Controllers/Admin/SetHomepage.php b/OnePage/Http/Controllers/Admin/SetHomepage.php new file mode 100755 index 0000000..8344000 --- /dev/null +++ b/OnePage/Http/Controllers/Admin/SetHomepage.php @@ -0,0 +1,160 @@ +content = $content; + } + + /** + * Display form for organizing pages on homepage + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function getPages() + { + // get pages which are assigned as homepage parts + $usedPagesIds = (array)Settings::getJson(OnePage::HOMEPAGE_PAGES_SETTINGS_KEY); + + // get all pages - they will be separated for used and not used on next lines + $allPages = $this->content->getOverview() + ->get(); + + // separate pages to used and not used - with help of $usedPAgesIds array defined above + $pages = $used = $notUsed = []; + $homepage = null; + foreach ($allPages as $page) { + + if ($page->isHomepage) { + $homepage = $page; + continue; + } + + $pages[$page->id] = $page; + + if (in_array($page->id, $usedPagesIds)) { + $used[$page->id] = $page; + } else { + $notUsed[$page->id] = $page; + } + } + + return view('template::admin/homepage.set', [ + 'usedPagesIds' => $usedPagesIds, + 'allPages' => $pages, + 'usedPages' => $used, + 'notUsedPages' => $notUsed, + 'homepage' => $homepage + ]); + } + + /** + * Add page into homepage + * + * @param $id + * + * @return \Illuminate\Http\RedirectResponse + */ + public function addPage($id) + { + $page = $this->content->getOne($id); + + if ($page->isHomepage) { + return redirect() + ->back() + ->with('error', trans('template::admin/setHomepage.cannotSetHomepageAsPartOfHomepage')); + } + + // try to get page config + $settingsEntry = SettingsModel::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) + ->where('language', LaravelLocalization::getCurrentLocale()) + ->first(); + + if (!$settingsEntry) { + $settingsEntry = new SettingsModel(); + $settingsEntry->language = LaravelLocalization::getCurrentLocale(); + $settingsEntry->key = OnePage::HOMEPAGE_PAGES_SETTINGS_KEY; + $usedPagesIds = []; + } else { + $usedPagesIds = (array)json_decode($settingsEntry->value); + } + + // add page into list of used pages - if not already there + if (!in_array($id, $usedPagesIds)) { + $usedPagesIds[] = $id; + } + + $settingsEntry->value = json_encode($usedPagesIds); + $settingsEntry->save(); + + // inform other application parts about this event + Event::fire(new AddPageIntoHomepage($page)); + + return redirect() + ->back() + ->with('success', trans('template::admin/setHomepage.successfullyAdded')); + } + + /** + * Remove page from homepage + * + * @param $id + * + * @return \Illuminate\Http\RedirectResponse + */ + public function removePage($id) + { + $pages = (array)Settings::getJson(OnePage::HOMEPAGE_PAGES_SETTINGS_KEY); + + $page = $this->content->getOne($id); + + if (!in_array($id, $pages)) { + return redirect() + ->back() + ->with('error', trans('template::admin/setHomepage.invalidPageId')); + } else { + $pagePosition = array_search($id, $pages); + + // remove page from config array + unset($pages[$pagePosition]); + + $pages = array_values($pages); + + // update in database + SettingsModel::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) + ->where('language', LaravelLocalization::getCurrentLocale()) + ->update(['value' => json_encode($pages)]); + + // inform other application parts about this event + Event::fire(new RemovePageFromHomepage($page)); + + return redirect() + ->back() + ->with('success', trans('template::admin/setHomepage.successfullyRemoved')); + } + } +} \ No newline at end of file diff --git a/OnePage/Http/routes.php b/OnePage/Http/routes.php new file mode 100755 index 0000000..55c87ae --- /dev/null +++ b/OnePage/Http/routes.php @@ -0,0 +1,19 @@ + ['admin'], + 'prefix' => \LaravelLocalization::setLocale() . '/admin/template', + 'namespace' => 'Templates\Base\OnePage\Http\Controllers\Admin' + ], function () { + + // display form for selecting pages for homepage + Route::get('homepage', 'SetHomepage@getPages') + ->name('template.setHomepage'); + + // add page into homepage + Route::get('add/{id}', 'SetHomepage@addPage') + ->name('template.homepage.addPage'); + + // delete page from homepage + Route::get('remove/{id}', 'SetHomepage@removePage') + ->name('template.homepage.removePage'); +}); \ No newline at end of file diff --git a/OnePage/Listeners/HomepageChanged.php b/OnePage/Listeners/HomepageChanged.php new file mode 100755 index 0000000..bd5ac2a --- /dev/null +++ b/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/OnePage/Listeners/Loggers/LogAddingPage.php b/OnePage/Listeners/Loggers/LogAddingPage.php new file mode 100755 index 0000000..67bb113 --- /dev/null +++ b/OnePage/Listeners/Loggers/LogAddingPage.php @@ -0,0 +1,23 @@ + $event->page->id, + 'title' => $event->page->title + ]; + + $this->saveLog($parameters); + } + + protected function getName() + { + return 'pageAddedIntoHomepage'; + } +} \ No newline at end of file diff --git a/OnePage/Listeners/Loggers/LogRemovingPage.php b/OnePage/Listeners/Loggers/LogRemovingPage.php new file mode 100755 index 0000000..f862f11 --- /dev/null +++ b/OnePage/Listeners/Loggers/LogRemovingPage.php @@ -0,0 +1,23 @@ + $event->page->id, + 'title' => $event->page->title + ]; + + $this->saveLog($parameters); + } + + protected function getName() + { + return 'pageRemovedFromHomepage'; + } +} \ No newline at end of file diff --git a/OnePage/Providers/EventProvider.php b/OnePage/Providers/EventProvider.php new file mode 100755 index 0000000..7f6c9bb --- /dev/null +++ b/OnePage/Providers/EventProvider.php @@ -0,0 +1,19 @@ + [HomepageChanged::class], + AddPageIntoHomepage::class => [LogAddingPage::class], + RemovePageFromHomepage::class => [LogRemovingPage::class], + ]; +} \ No newline at end of file diff --git a/OnePage/Providers/OnePageTemplate.php b/OnePage/Providers/OnePageTemplate.php new file mode 100755 index 0000000..6de33b5 --- /dev/null +++ b/OnePage/Providers/OnePageTemplate.php @@ -0,0 +1,58 @@ +registerTranslations(); + } + + public function boot() + { + $this->registerViews(); + $this->registerWidgets(); + + // register event service provider for this template + $this->app->register(EventProvider::class); + } + + /** + * Register translations used in this base template + */ + private function registerTranslations() + { + // register translations + $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'template'); + } + + /** + * Register views used in this template - both visitor's and admin's + */ + private function registerViews() + { + // load views + $this->loadViewsFrom(array_merge(array_map(function ($path) { + return $path; + }, \Config::get('view.paths')), [__DIR__ . '/../Resources/views']), 'template'); + } + + /** + * Register all widgets related to this template + */ + private function registerWidgets() + { + $registrator = $this->app->make('registerWidget'); + + // register all available widgets + $registrator->register(OnePageMenu::class); + } +} \ No newline at end of file diff --git a/OnePage/Resources/lang/cs/admin/mainMenu.php b/OnePage/Resources/lang/cs/admin/mainMenu.php new file mode 100755 index 0000000..89c2e5c --- /dev/null +++ b/OnePage/Resources/lang/cs/admin/mainMenu.php @@ -0,0 +1,5 @@ + "Nastavení hlavní stránky", +"templateName" => "Jednostránkovka", +]; diff --git a/OnePage/Resources/lang/cs/admin/setHomepage.php b/OnePage/Resources/lang/cs/admin/setHomepage.php new file mode 100755 index 0000000..0a06cf6 --- /dev/null +++ b/OnePage/Resources/lang/cs/admin/setHomepage.php @@ -0,0 +1,23 @@ + "Přidat stránku na homepage", +"cannotSetHomepageAsPartOfHomepage" => "No toto? Jak mám nastavit domovskou stárnku jako podstránku sama sebe?", +"events" => ["descriptions" => ["addedPage" => 'Na domovskou stránku byla přidána stránka #:id s titulkem ":title"', +"removedPage" => 'Z domovské stránky byla odebrána stránka #:id ":title"', +], +"names" => ["addedPage" => "Stránka přidána na titulní stranu.", +"removedPage" => "Stránka odebrána z titulní strany.", +], +], +"invalidPageId" => "Nelze odebrat stránku z titulní strany, neboť uvedené ID neexistuje.", +"noHomepageSet" => "Není nastavena domovská stránka, následující nastavení se nikde neprojeví!", +"noPagesAvailable" => "Žádné stránky k dispozici.", +"noPagesSelected" => "Nebyla vybrána žádná stránka pro zobrazení na titulní straně. Zatím...", +"notUsedPages" => "Nepoužité stránky", +"pageDescription" => "Na této stránce můžete nastavit stránky, které se mají zobrazovat na titulní strane.", +"reallyRemovePage" => "Opravdu chcete odebrat stránku y hlavní stránky?", +"successfullyAdded" => "Stránka úspěšně přidána na úvodní stranu", +"successfullyRemoved" => "Stránka úspěšně odebrána z úvodní stránky.", +"title" => "Nastavení úvodní stránky", +"usedPages" => "Použité stránky", +]; diff --git a/OnePage/Resources/lang/cs/widget/menu.php b/OnePage/Resources/lang/cs/widget/menu.php new file mode 100755 index 0000000..48a2388 --- /dev/null +++ b/OnePage/Resources/lang/cs/widget/menu.php @@ -0,0 +1,11 @@ + "Jednoduché menu použité pro navigaci v jednostránkovém webu. Pro přechody mezi stránkami používá anchor odkazy na stránky. Ty se generují automaticky ze seznamu stránek přidaných na homepage.", +"form" => ["containerClass" => "HTML třída obalového elementu", +"description" => "Popis", +"name" => "Název menu", +"save" => "Uložit", +], +"name" => "Jednstránkové menu", +"new" => "Vytvořit nové menu", +]; diff --git a/OnePage/Resources/lang/en/admin/mainMenu.php b/OnePage/Resources/lang/en/admin/mainMenu.php new file mode 100755 index 0000000..9f102ee --- /dev/null +++ b/OnePage/Resources/lang/en/admin/mainMenu.php @@ -0,0 +1,5 @@ + 'Homepage settings', + 'templateName' => 'Onepager' +]; \ No newline at end of file diff --git a/OnePage/Resources/lang/en/admin/setHomepage.php b/OnePage/Resources/lang/en/admin/setHomepage.php new file mode 100755 index 0000000..1609b53 --- /dev/null +++ b/OnePage/Resources/lang/en/admin/setHomepage.php @@ -0,0 +1,26 @@ + '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.', + 'noHomepageSet' => 'No homepage set, following settings will not take effect!', + 'addToHomepage' => 'Add page into homepage', + 'events' => [ + 'names' => [ + 'removedPage' => 'Removed page from homepage', + 'addedPage' => 'Added page into homepage' + ], + 'descriptions' => [ + 'removedPage' => 'Removed page #:id ":title" from homepage.', + 'addedPage' => 'Added page #:id ":title" into homepage.' + ] + ] +]; \ No newline at end of file diff --git a/OnePage/Resources/lang/en/widget/menu.php b/OnePage/Resources/lang/en/widget/menu.php new file mode 100755 index 0000000..04a5c5c --- /dev/null +++ b/OnePage/Resources/lang/en/widget/menu.php @@ -0,0 +1,12 @@ + 'One page menu', + 'description' => 'Simple menu used for one page templates. This menu navigates using nachor links on page. Links are generated automatically using list of pages on homepage.', + 'new' => 'Create new menu', + 'form' => [ + 'name' => 'Menu name', + 'description' => 'Description', + 'containerClass' => 'HTML class for container element', + 'save' => 'Save', + ] +]; \ No newline at end of file diff --git a/OnePage/Resources/views/admin/homepage/set.blade.php b/OnePage/Resources/views/admin/homepage/set.blade.php new file mode 100755 index 0000000..cfa6d1b --- /dev/null +++ b/OnePage/Resources/views/admin/homepage/set.blade.php @@ -0,0 +1,90 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', trans('template::admin/setHomepage.title')) +@section('pageDescription', trans('template::admin/setHomepage.pageDescription')) + +{{-- +Improvement: http://www.html5rocks.com/en/tutorials/dnd/basics/ +--}} + +@section('content') + +
+
+ @if(isset($homepage)) + @include('admin.snippets.card', [ + 'type' => 'primary', + 'title' => $homepage->title.' '.trans($homepage->module_name).'', + 'body' => '

'.str_limit(strip_tags($homepage->content), 200).'

', + 'footerClass' => 'text-right', + 'footer' => '' + ]) + @else +
@lang('template::admin/setHomepage.noHomepageSet')
+ @endif + +

@lang('template::admin/setHomepage.usedPages')

+ + @forelse($usedPagesIds as $pageId) + + {{--ignore non-existing pages--}} + @if(!isset($allPages[$pageId])) + @continue + @endif + + + @include('admin.snippets.card', [ + 'title' => $allPages[$pageId]->title.' '.trans($allPages[$pageId]->module_name).'', + 'body' => '

'.str_limit(strip_tags($allPages[$pageId]->content), 200).'

', + 'footerClass' => 'text-right', + 'footer' => ' + + + ' + ]) + @empty +
+ @lang('template::admin/setHomepage.noPagesSelected') +
+ @endforelse +
+
+

@lang('template::admin/setHomepage.notUsedPages')

+ @forelse($notUsedPages as $page) +
+
+
+

{{$page->title}} + @lang($page->module_name) +

+
+
+
+ {{str_limit(strip_tags($page->content), 100)}} +
+ +
+ @empty +
+ @lang('template::admin/setHomepage.noPagesAvailable') +
+ @endforelse +
+
+ +@endsection \ No newline at end of file diff --git a/OnePage/Resources/views/admin/widgets/onePageMenu/edit.blade.php b/OnePage/Resources/views/admin/widgets/onePageMenu/edit.blade.php new file mode 100755 index 0000000..f4dbc2c --- /dev/null +++ b/OnePage/Resources/views/admin/widgets/onePageMenu/edit.blade.php @@ -0,0 +1,15 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('widgets/htmlCode.edit', ['name' => $widget->name])) + +@section('content') +
+ @include('template::admin.widgets.onePageMenu.form', ['action' => route('widgets.postEdit', ['id' => $widget->id])]) +
+
+

@lang('widgets/menu.preview')

+ + @widgetPreview($widget) +
+@stop + diff --git a/OnePage/Resources/views/admin/widgets/onePageMenu/form.blade.php b/OnePage/Resources/views/admin/widgets/onePageMenu/form.blade.php new file mode 100755 index 0000000..94d02c0 --- /dev/null +++ b/OnePage/Resources/views/admin/widgets/onePageMenu/form.blade.php @@ -0,0 +1,27 @@ +
+ {!! csrf_field() !!} + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/OnePage/Resources/views/admin/widgets/onePageMenu/new.blade.php b/OnePage/Resources/views/admin/widgets/onePageMenu/new.blade.php new file mode 100755 index 0000000..426b2db --- /dev/null +++ b/OnePage/Resources/views/admin/widgets/onePageMenu/new.blade.php @@ -0,0 +1,9 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('template::widget/menu.new')) +@section('pageDescription', @trans($type->description)) + +@section('content') + @include('template::admin.widgets.onePageMenu.form', ['action' => route('widgets.postNew', ['type' => $type->id])]) +@stop + diff --git a/OnePage/Widgets/OnePageMenu/OnePageMenu.php b/OnePage/Widgets/OnePageMenu/OnePageMenu.php new file mode 100755 index 0000000..28f2e46 --- /dev/null +++ b/OnePage/Widgets/OnePageMenu/OnePageMenu.php @@ -0,0 +1,49 @@ + $pages, 'widget' => $widget])->render(); + } + + /** + * Display form for creating new instance of widget + * + * @param WidgetType $type + * + * @return mixed + */ + public static function renderAddForm(WidgetType $type) + { + return view('template::admin.widgets.onePageMenu.new', [ + 'type' => $type, + 'widget' => new Widget(), + 'settings' => new \stdClass() + ]); + } + + /** + * Display form for editing already existing widget + * + * @param Widget $widget + * + * @return mixed + */ + public static function renderEditForm(Widget $widget) + { + $settings = $widget->settings; + return view('template::admin.widgets.onePageMenu.edit', ['widget' => $widget, 'settings' => $settings]); + } +} diff --git a/OnePage/config.php b/OnePage/config.php new file mode 100755 index 0000000..a94cf0f --- /dev/null +++ b/OnePage/config.php @@ -0,0 +1,8 @@ + [\Templates\Base\OnePage\Providers\OnePageTemplate::class], + 'files' => [__DIR__ . '/Http/routes.php'], + 'handler' => null, + 'name' => null, + 'description' => null, +];