From cfaf3228d9010a317fb25673ebffc9e3c44dd653 Mon Sep 17 00:00:00 2001 From: Sam Georges Date: Mon, 10 Nov 2014 20:34:42 +1100 Subject: [PATCH] Fixes #9 - Adds maintenance mode setting to the CMS --- modules/backend/lang/en/lang.php | 1 + .../backend/models/brandsettings/fields.yaml | 1 - modules/cms/classes/Controller.php | 14 +++- modules/cms/models/MaintenanceSettings.php | 70 +++++++++++++++++++ .../models/maintenancesettings/fields.yaml | 14 ++++ modules/system/behaviors/SettingsModel.php | 26 +++---- modules/system/reportwidgets/Status.php | 2 + .../reportwidgets/status/partials/_widget.htm | 11 ++- 8 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 modules/cms/models/MaintenanceSettings.php create mode 100644 modules/cms/models/maintenancesettings/fields.yaml diff --git a/modules/backend/lang/en/lang.php b/modules/backend/lang/en/lang.php index 9d8e5ea4e..31a5c4bfe 100644 --- a/modules/backend/lang/en/lang.php +++ b/modules/backend/lang/en/lang.php @@ -65,6 +65,7 @@ return [ 'status' => [ 'widget_title_default' => 'System status', 'online' => 'online', + 'maintenance' => 'in maintenance', 'update_available' => '{0} updates available!|{1} update available!|[2,Inf] updates available!', ] ], diff --git a/modules/backend/models/brandsettings/fields.yaml b/modules/backend/models/brandsettings/fields.yaml index e2506923a..4357de9c4 100644 --- a/modules/backend/models/brandsettings/fields.yaml +++ b/modules/backend/models/brandsettings/fields.yaml @@ -2,7 +2,6 @@ # Field Definitions # =================================== - tabs: fields: diff --git a/modules/cms/classes/Controller.php b/modules/cms/classes/Controller.php index df630b05d..91b13544f 100644 --- a/modules/cms/classes/Controller.php +++ b/modules/cms/classes/Controller.php @@ -18,6 +18,7 @@ use Cms\Twig\Loader as TwigLoader; use Cms\Twig\DebugExtension; use Cms\Twig\Extension as CmsTwigExtension; use Cms\Classes\FileHelper as CmsFileHelper; +use Cms\Models\MaintenanceSettings; use System\Models\RequestLog; use System\Classes\ErrorHandler; use System\Classes\CombineAssets; @@ -150,7 +151,7 @@ class Controller extends BaseController } /* - * Handle hidden pages + * Hidden page */ $page = $this->router->findByUrl($url); if ($page && $page->hidden) { @@ -159,6 +160,17 @@ class Controller extends BaseController } } + /* + * Maintenance mode + */ + if ( + MaintenanceSettings::isConfigured() + && MaintenanceSettings::get('is_enabled', false) + && !BackendAuth::getUser() + ) { + $page = Page::loadCached($this->theme, MaintenanceSettings::get('cms_page')); + } + /* * Extensibility */ diff --git a/modules/cms/models/MaintenanceSettings.php b/modules/cms/models/MaintenanceSettings.php new file mode 100644 index 000000000..cdd8f56bc --- /dev/null +++ b/modules/cms/models/MaintenanceSettings.php @@ -0,0 +1,70 @@ +is_enabled = false; + } + + public function getCmsPageOptions() + { + return Page::sortBy('baseFileName')->lists('baseFileName', 'baseFileName'); + } + + /** + * Ensure each theme has its own CMS page, store it inside a mapping array. + * @return void + */ + public function beforeValidate() + { + if (!$theme = Theme::getEditTheme()) + throw new ApplicationException('Unable to find the active theme.'); + + $themeMap = $this->getSettingsValue('theme_map', []); + $themeMap[$theme->getDirName()] = $this->getSettingsValue('cms_page'); + $this->setSettingsValue('theme_map', $themeMap); + } + + /** + * Restore the CMS page found in the mapping array, or disable the + * maintenance mode. + * @return void + */ + public function afterFetch() + { + if ( + ($theme = Theme::getEditTheme()) + && ($themeMap = array_get($this->attributes, 'theme_map')) + && ($cmsPage = array_get($themeMap, $theme->getDirName())) + ) { + $this->cms_page = $cmsPage; + } + else { + $this->is_enabled = false; + } + } +} diff --git a/modules/cms/models/maintenancesettings/fields.yaml b/modules/cms/models/maintenancesettings/fields.yaml new file mode 100644 index 000000000..f653f6b54 --- /dev/null +++ b/modules/cms/models/maintenancesettings/fields.yaml @@ -0,0 +1,14 @@ +# =================================== +# Field Definitions +# =================================== + +fields: + + is_enabled: + label: cms::lang.maintenance.is_enabled + comment: cms::lang.maintenance.is_enabled_comment + type: checkbox + + cms_page: + type: dropdown + cssClass: checkbox-align \ No newline at end of file diff --git a/modules/system/behaviors/SettingsModel.php b/modules/system/behaviors/SettingsModel.php index cf5cee027..f676f15fa 100644 --- a/modules/system/behaviors/SettingsModel.php +++ b/modules/system/behaviors/SettingsModel.php @@ -56,7 +56,7 @@ class SettingsModel extends ModelBehavior $this->model->bindEvent('model.afterFetch', [$this, 'afterModelFetch']); $this->model->bindEvent('model.beforeSave', [$this, 'beforeModelSave']); $this->model->bindEvent('model.afterSave', [$this, 'afterModelSave']); - $this->model->bindEvent('model.setAttribute', [$this, 'setModelAttribute']); + $this->model->bindEvent('model.setAttribute', [$this, 'setSettingsValue']); $this->model->bindEvent('model.saveInternal', [$this, 'saveModelInternal']); /* @@ -135,6 +135,18 @@ class SettingsModel extends ModelBehavior return $default; } + /** + * Set a single setting value, if allowed. + */ + public function setSettingsValue($key, $value) + { + if ($this->isKeyAllowed($key)) { + return; + } + + $this->fieldValues[$key] = $value; + } + /** * Default values to set for this model, override */ @@ -182,18 +194,6 @@ class SettingsModel extends ModelBehavior Cache::forget($this->getCacheKey()); } - /** - * Adulterate the model setter to use our field values instead. - */ - public function setModelAttribute($key, $value) - { - if ($this->isKeyAllowed($key)) { - return; - } - - $this->fieldValues[$key] = $value; - } - /** * Checks if a key is legitimate or should be added to * the field value collection diff --git a/modules/system/reportwidgets/Status.php b/modules/system/reportwidgets/Status.php index 52dd571cf..be05f9e99 100644 --- a/modules/system/reportwidgets/Status.php +++ b/modules/system/reportwidgets/Status.php @@ -2,6 +2,7 @@ use System\Models\Parameters; use System\Classes\UpdateManager; +use Cms\Models\MaintenanceSettings; use Backend\Classes\ReportWidgetBase; use Exception; @@ -44,6 +45,7 @@ class Status extends ReportWidgetBase protected function loadData() { $manager = UpdateManager::instance(); + $this->vars['inMaintenance'] = MaintenanceSettings::get('is_enabled'); $this->vars['showUpdates'] = $this->controller->user->hasAccess('system.manage_updates'); $this->vars['updates'] = $manager->check(); } diff --git a/modules/system/reportwidgets/status/partials/_widget.htm b/modules/system/reportwidgets/status/partials/_widget.htm index b7f40dbff..8779e5b66 100644 --- a/modules/system/reportwidgets/status/partials/_widget.htm +++ b/modules/system/reportwidgets/status/partials/_widget.htm @@ -4,8 +4,15 @@