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') + +
{{$allPages[$pageId]->title}}
++ (@lang($allPages[$pageId]->module_name)) +
+{{str_limit(strip_tags($allPages[$pageId]->content), 200)}}
+{{$page->title}}
++ (@lang($page->module_name)) +
+{{str_limit(strip_tags($page->content), 200)}}
+