diff --git a/app/Helpers/Settings.php b/app/Helpers/Settings.php index fe95ec03..cac5e30d 100644 --- a/app/Helpers/Settings.php +++ b/app/Helpers/Settings.php @@ -28,13 +28,21 @@ class Settings * @param string $key settings key * @param string|null $default default value, which will be returned when given key does not exist * - * @return string|null + * @param null $exists + * + * @return null|string */ - public static function get($key, $default = null) + public static function get($key, $default = null, & $exists = null) { self::init(); - return isset(self::$settings->$key) ? self::$settings->$key : $default; + if (isset(self::$settings->$key)) { + $exists = true; + return self::$settings->$key; + } + + $exists = false; + return $default; } /** diff --git a/app/Providers/ModuleManager.php b/app/Providers/ModuleManager.php index f251d23e..f925aec1 100644 --- a/app/Providers/ModuleManager.php +++ b/app/Providers/ModuleManager.php @@ -3,7 +3,6 @@ namespace App\Providers; use App\Models\Module; -use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; @@ -17,7 +16,7 @@ class ModuleManager extends ServiceProvider { // this service provider needs published config - config is merged right after this service provider try { - $modules = Module::where('is_template', false) + $modules = Module::where('enabled', true) ->get(); } catch (\Exception $e) { // ignore error @@ -26,6 +25,20 @@ class ModuleManager extends ServiceProvider // iterate over all modules and enable or disable them foreach ($modules as $module) { + + $module->module_settings = json_decode($module->module_settings); + + if ($module->is_template) { + + if (isset($module->module_settings->providers) && !empty($module->module_settings->providers)) { + foreach ($module->module_settings->providers as $provider) { + $this->app->register($provider); + } + } + + continue; + } + $this->createModulesJson($module); } } @@ -48,7 +61,7 @@ class ModuleManager extends ServiceProvider */ private function createModulesJson(Module $module) { - $config = json_decode($module->module_settings); + $config = $module->module_settings; if (is_null($config)) { return; diff --git a/templates/Base/OnePage/Handlers/OnePage.php b/templates/Base/OnePage/Handlers/OnePage.php index 5bfb3ffa..8a43c241 100644 --- a/templates/Base/OnePage/Handlers/OnePage.php +++ b/templates/Base/OnePage/Handlers/OnePage.php @@ -8,6 +8,11 @@ use App\Models\User; abstract class OnePage implements TemplateHandler { + /** + * Name of settings key for list of pages used on homepage + */ + const HOMEPAGE_PAGES_SETTINGS_KEY = 'template.onepage.homepagePages'; + /** * Register admin menu (or multiple ones) * diff --git a/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php b/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php new file mode 100644 index 00000000..9ea6ce87 --- /dev/null +++ b/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php @@ -0,0 +1,132 @@ +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)json_decode(Settings::get(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 = []; + foreach ($allPages as $page) { + $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 + ]); + } + + /** + * Add page into homepage + * + * @param $id + * + * @return \Illuminate\Http\RedirectResponse + */ + public function addPage($id) + { + + // try to get page config + $settingsEntry = \App\Models\Settings::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) + ->where('language', LaravelLocalization::getCurrentLocale()) + ->first(); + + if (!$settingsEntry) { + $settingsEntry = new \App\Models\Settings(); + $settingsEntry->language = LaravelLocalization::getCurrentLocale(); + $settingsEntry->key = OnePage::HOMEPAGE_PAGES_SETTINGS_KEY; + $usedPagesIds = []; + } else { + $usedPagesIds = (array)json_decode($settingsEntry->value); + } + + if (!in_array($id, $usedPagesIds)) { + $usedPagesIds[] = $id; + } + + $settingsEntry->value = json_encode($usedPagesIds); + $settingsEntry->save(); + + 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)json_decode(Settings::get(OnePage::HOMEPAGE_PAGES_SETTINGS_KEY, '{}')); + + 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 + \App\Models\Settings::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) + ->where('language', LaravelLocalization::getCurrentLocale()) + ->update(['value' => json_encode($pages)]); + + return redirect() + ->back() + ->with('success', trans('template::admin/setHomepage.successfullyRemoved')); + } + } +} \ No newline at end of file diff --git a/templates/Base/OnePage/Http/routes.php b/templates/Base/OnePage/Http/routes.php new file mode 100644 index 00000000..51e3c7b1 --- /dev/null +++ b/templates/Base/OnePage/Http/routes.php @@ -0,0 +1,25 @@ + [ + 'localeSessionRedirect', + 'localizationRedirect', + 'web', + 'auth', + 'adminMenu' + ], + '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/templates/Base/OnePage/Providers/OnePageTemplate.php b/templates/Base/OnePage/Providers/OnePageTemplate.php new file mode 100644 index 00000000..5adc4e77 --- /dev/null +++ b/templates/Base/OnePage/Providers/OnePageTemplate.php @@ -0,0 +1,27 @@ +loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'template'); + + // load views + $this->loadViewsFrom(array_merge(array_map(function ($path) { + return $path; + }, \Config::get('view.paths')), [__DIR__ . '/../Resources/views']), 'template'); + } +} \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/lang/en/admin/mainMenu.php b/templates/Base/OnePage/Resources/lang/en/admin/mainMenu.php new file mode 100644 index 00000000..9f102eeb --- /dev/null +++ b/templates/Base/OnePage/Resources/lang/en/admin/mainMenu.php @@ -0,0 +1,5 @@ + 'Homepage settings', + 'templateName' => 'Onepager' +]; \ 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 new file mode 100644 index 00000000..9065c5db --- /dev/null +++ b/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php @@ -0,0 +1,14 @@ + '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?', + +]; \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/views/admin/homepage/set.blade.php b/templates/Base/OnePage/Resources/views/admin/homepage/set.blade.php new file mode 100644 index 00000000..32e0a3a8 --- /dev/null +++ b/templates/Base/OnePage/Resources/views/admin/homepage/set.blade.php @@ -0,0 +1,76 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', trans('template::admin/setHomepage.title')) +@section('pageDescription', trans('template::admin/setHomepage.pageDescription')) + +@section('content') + +
+
+

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

+ @forelse($usedPagesIds as $pageId) + + {{--ignore non-existing pages--}} + @if(!isset($allPages[$pageId])) + @continue + @endif + +
+
+
+

{{$allPages[$pageId]->title}}

+
+
+
+

+ (@lang($allPages[$pageId]->module_name)) +

+

{{str_limit(strip_tags($allPages[$pageId]->content), 200)}}

+
+ +
+ @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), 200)}}

+
+ +
+ @empty +
+ @lang('template::admin/setHomepage.noPagesAvailable') +
+ @endforelse +
+
+ +@endsection \ No newline at end of file diff --git a/templates/Base/OnePage/config.php b/templates/Base/OnePage/config.php index 0b6df1f6..a94cf0f9 100644 --- a/templates/Base/OnePage/config.php +++ b/templates/Base/OnePage/config.php @@ -1,10 +1,8 @@ \Templates\Base\OnePage\Handlers\OnePage::class, - 'name' => 'Sablona', - 'alias' => 'sablona', - 'description' => 'Sablona jednostrankova', - 'files' => [ - __DIR__.'/routes.php' - ] + 'providers' => [\Templates\Base\OnePage\Providers\OnePageTemplate::class], + 'files' => [__DIR__ . '/Http/routes.php'], + 'handler' => null, + 'name' => null, + 'description' => null, ]; diff --git a/templates/Base/OnePage/routes.php b/templates/Base/OnePage/routes.php deleted file mode 100644 index 2b69cd3a..00000000 --- a/templates/Base/OnePage/routes.php +++ /dev/null @@ -1,7 +0,0 @@ - 'web', 'prefix' => 'test'], function() -{ - Route::get('/', function() { - echo "ahoj"; - })->name('template.route'); -}); \ No newline at end of file diff --git a/templates/Jednostrankovka/Handler.php b/templates/Jednostrankovka/Handler.php index ac53ea73..b272bf2c 100644 --- a/templates/Jednostrankovka/Handler.php +++ b/templates/Jednostrankovka/Handler.php @@ -3,11 +3,24 @@ namespace Templates\Jednostrankovka; use App\Http\Requests\Request; use App\Models\Content; +use App\Models\User; use Illuminate\Support\Facades\Artisan; +use Pingpong\Menus\MenuFacade; use Templates\Base\OnePage\Handlers\OnePage; class Handler extends OnePage { + public static function registerAdminMenu(User $user) + { + parent::registerAdminMenu($user); + + $menu = \Menu::instance('mainMenu'); + + $menu->dropdown(trans('template::admin/mainMenu.templateName'), function ($sub) { + $sub->route('template.setHomepage', trans('template::admin/mainMenu.setHomepage'), [], 1, ['icon' => 'fa fa-fw fa-home']); + }, 20, ['icon' => 'fa fa-fw fa-send']); + + } /** * Prepare Content object to be rendered using Blade template diff --git a/templates/Jednostrankovka/config.php b/templates/Jednostrankovka/config.php index c519e8de..08d4ce56 100644 --- a/templates/Jednostrankovka/config.php +++ b/templates/Jednostrankovka/config.php @@ -1,7 +1,10 @@