diff --git a/modules/backend/behaviors/ListController.php b/modules/backend/behaviors/ListController.php index 8f84b76fb..505189439 100644 --- a/modules/backend/behaviors/ListController.php +++ b/modules/backend/behaviors/ListController.php @@ -426,15 +426,6 @@ class ListController extends ControllerBehavior // Overrides // - /** - * Called before the list columns are defined. - * @param Backend\Widgets\List $host The hosting list widget - * @return void - */ - // public function listExtendColumnsBefore($host) - // { - // } - /** * Called after the list columns are defined. * @param \Backend\Widgets\List $host The hosting list widget diff --git a/modules/backend/classes/Controller.php b/modules/backend/classes/Controller.php index 8a83514d1..f29a5ed85 100644 --- a/modules/backend/classes/Controller.php +++ b/modules/backend/classes/Controller.php @@ -5,7 +5,6 @@ use Str; use Lang; use View; use Flash; -use Event; use Config; use Request; use Backend; @@ -37,8 +36,8 @@ class Controller extends Extendable use \System\Traits\ViewMaker; use \System\Traits\AssetMaker; use \System\Traits\ConfigMaker; + use \System\Traits\EventEmitter; use \Backend\Traits\WidgetMaker; - use \October\Rain\Support\Traits\Emitter; /** * @var string Object used for storing a fatal error. @@ -178,10 +177,7 @@ class Controller extends Extendable /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.beforeDisplay', [$action, $params], true)) || - ($event = Event::fire('backend.page.beforeDisplay', [$this, $action, $params], true)) - ) { + if ($event = $this->fireSystemEvent('backend.page.beforeDisplay', [$action, $params])) { return $event; } diff --git a/modules/backend/classes/WidgetBase.php b/modules/backend/classes/WidgetBase.php index b05af847b..246078275 100644 --- a/modules/backend/classes/WidgetBase.php +++ b/modules/backend/classes/WidgetBase.php @@ -18,8 +18,8 @@ abstract class WidgetBase extends Extendable use \System\Traits\ViewMaker; use \System\Traits\AssetMaker; use \System\Traits\ConfigMaker; + use \System\Traits\EventEmitter; use \Backend\Traits\WidgetMaker; - use \October\Rain\Support\Traits\Emitter; /** * @var object Supplied configuration. diff --git a/modules/backend/widgets/Filter.php b/modules/backend/widgets/Filter.php index 2a19a3e17..99e2721e3 100644 --- a/modules/backend/widgets/Filter.php +++ b/modules/backend/widgets/Filter.php @@ -1,14 +1,11 @@ fireEvent('filter.update', [$params]); + if ($result && is_array($result)) { return call_user_func_array('array_merge', $result); } @@ -306,8 +305,7 @@ class Filter extends WidgetBase /* * Extensibility */ - Event::fire('backend.filter.extendQuery', [$this, $query, $scope]); - $this->fireEvent('filter.extendQuery', [$query, $scope]); + $this->fireSystemEvent('backend.filter.extendQuery', [$query, $scope]); if (!$searchQuery) { return $query->get(); @@ -417,8 +415,7 @@ class Filter extends WidgetBase /* * Extensibility */ - Event::fire('backend.filter.extendScopesBefore', [$this]); - $this->fireEvent('filter.extendScopesBefore'); + $this->fireSystemEvent('backend.filter.extendScopesBefore'); /* * All scopes @@ -432,8 +429,7 @@ class Filter extends WidgetBase /* * Extensibility */ - Event::fire('backend.filter.extendScopes', [$this]); - $this->fireEvent('filter.extendScopes'); + $this->fireSystemEvent('backend.filter.extendScopes'); $this->scopesDefined = true; } @@ -743,7 +739,6 @@ class Filter extends WidgetBase return $processed; } - /** * Convert an array from the posted dates * @@ -782,7 +777,6 @@ class Filter extends WidgetBase return $dates; } - /** * @param mixed $scope * diff --git a/modules/backend/widgets/Form.php b/modules/backend/widgets/Form.php index 0384b51bb..8b8cec11c 100644 --- a/modules/backend/widgets/Form.php +++ b/modules/backend/widgets/Form.php @@ -1,7 +1,6 @@ $saveData]; - $this->fireEvent('form.beforeRefresh', [$dataHolder]); - Event::fire('backend.form.beforeRefresh', [$this, $dataHolder]); + $this->fireSystemEvent('backend.form.beforeRefresh', [$dataHolder]); $saveData = $dataHolder->data; /* @@ -370,8 +368,7 @@ class Form extends WidgetBase /* * Extensibility */ - $this->fireEvent('form.refreshFields', [$this->allFields]); - Event::fire('backend.form.refreshFields', [$this, $this->allFields]); + $this->fireSystemEvent('backend.form.refreshFields', [$this->allFields]); /* * If an array of fields is supplied, update specified fields individually. @@ -399,10 +396,7 @@ class Form extends WidgetBase /* * Extensibility */ - $eventResults = array_merge( - $this->fireEvent('form.refresh', [$result]), - Event::fire('backend.form.refresh', [$this, $result]) - ); + $eventResults = $this->fireSystemEvent('backend.form.refresh', [$result], false); foreach ($eventResults as $eventResult) { $result = $eventResult + $result; @@ -426,8 +420,7 @@ class Form extends WidgetBase /* * Extensibility */ - Event::fire('backend.form.extendFieldsBefore', [$this]); - $this->fireEvent('form.extendFieldsBefore'); + $this->fireSystemEvent('backend.form.extendFieldsBefore'); /* * Outside fields @@ -462,8 +455,7 @@ class Form extends WidgetBase /* * Extensibility */ - $this->fireEvent('form.extendFields', [$this->allFields]); - Event::fire('backend.form.extendFields', [$this, $this->allFields]); + $this->fireSystemEvent('backend.form.extendFields', [$this->allFields]); /* * Convert automatic spanned fields diff --git a/modules/backend/widgets/Lists.php b/modules/backend/widgets/Lists.php index acc8e9b2d..81f73d5e6 100644 --- a/modules/backend/widgets/Lists.php +++ b/modules/backend/widgets/Lists.php @@ -1,11 +1,10 @@ fireEvent('list.extendQueryBefore', [$query]); + $this->fireSystemEvent('backend.list.extendQueryBefore', [$query]); /* * Prepare searchable column names @@ -501,10 +499,7 @@ class Lists extends WidgetBase /* * Extensibility */ - if ( - ($event = $this->fireEvent('list.extendQuery', [$query], true)) || - ($event = Event::fire('backend.list.extendQuery', [$this, $query], true)) - ) { + if ($event = $this->fireSystemEvent('backend.list.extendQuery', [$query])) { return $event; } @@ -653,8 +648,7 @@ class Lists extends WidgetBase /* * Extensibility */ - Event::fire('backend.list.extendColumns', [$this]); - $this->fireEvent('list.extendColumns'); + $this->fireSystemEvent('backend.list.extendColumns'); /* * Use a supplied column order @@ -754,12 +748,15 @@ class Lists extends WidgetBase { $columns = $this->visibleColumns ?: $this->getVisibleColumns(); $total = count($columns); + if ($this->showCheckboxes) { $total++; } + if ($this->showSetup) { $total++; } + return $total; } @@ -773,11 +770,7 @@ class Lists extends WidgetBase /* * Extensibility */ - if ($response = Event::fire('backend.list.overrideHeaderValue', [$this, $column, $value], true)) { - $value = $response; - } - - if ($response = $this->fireEvent('list.overrideHeaderValue', [$column, $value], true)) { + if ($response = $this->fireSystemEvent('backend.list.overrideHeaderValue', [$column, $value])) { $value = $response; } @@ -861,11 +854,7 @@ class Lists extends WidgetBase /* * Extensibility */ - if (($response = Event::fire('backend.list.overrideColumnValue', [$this, $record, $column, $value], true)) !== null) { - $value = $response; - } - - if (($response = $this->fireEvent('list.overrideColumnValue', [$record, $column, $value], true)) !== null) { + if ($response = $this->fireSystemEvent('backend.list.overrideColumnValue', [$record, $column, &$value])) { $value = $response; } @@ -884,11 +873,7 @@ class Lists extends WidgetBase /* * Extensibility */ - if ($response = Event::fire('backend.list.injectRowClass', [$this, $record], true)) { - $value = $response; - } - - if ($response = $this->fireEvent('list.injectRowClass', [$record], true)) { + if ($response = $this->fireSystemEvent('backend.list.injectRowClass', [$record])) { $value = $response; } diff --git a/modules/cms/classes/ComponentBase.php b/modules/cms/classes/ComponentBase.php index d9dbcbf53..9814207d2 100644 --- a/modules/cms/classes/ComponentBase.php +++ b/modules/cms/classes/ComponentBase.php @@ -2,7 +2,6 @@ use Str; use Lang; -use Event; use Config; use Cms\Classes\CodeBase; use Cms\Classes\CmsException; @@ -18,8 +17,8 @@ use BadMethodCallException; abstract class ComponentBase extends Extendable { use \System\Traits\AssetMaker; + use \System\Traits\EventEmitter; use \System\Traits\PropertyContainer; - use \October\Rain\Support\Traits\Emitter; /** * @var string A unique identifier for this component. @@ -157,10 +156,7 @@ abstract class ComponentBase extends Extendable /* * Extensibility */ - if ( - ($event = $this->fireEvent('component.beforeRunAjaxHandler', [$handler], true)) || - ($event = Event::fire('cms.component.beforeRunAjaxHandler', [$this, $handler], true)) - ) { + if ($event = $this->fireSystemEvent('cms.component.beforeRunAjaxHandler', [$handler])) { return $event; } @@ -169,10 +165,7 @@ abstract class ComponentBase extends Extendable /* * Extensibility */ - if ( - ($event = $this->fireEvent('component.runAjaxHandler', [$handler, $result], true)) || - ($event = Event::fire('cms.component.runAjaxHandler', [$this, $handler, $result], true)) - ) { + if ($event = $this->fireSystemEvent('cms.component.runAjaxHandler', [$handler, $result])) { return $event; } diff --git a/modules/cms/classes/Controller.php b/modules/cms/classes/Controller.php index 66180ed2b..14e53561e 100644 --- a/modules/cms/classes/Controller.php +++ b/modules/cms/classes/Controller.php @@ -8,7 +8,6 @@ use File; use View; use Lang; use Flash; -use Event; use Config; use Session; use Request; @@ -42,7 +41,7 @@ use Illuminate\Http\RedirectResponse; class Controller { use \System\Traits\AssetMaker; - use \October\Rain\Support\Traits\Emitter; + use \System\Traits\EventEmitter; /** * @var \Cms\Classes\Theme A reference to the CMS theme processed by the controller. @@ -180,10 +179,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.beforeDisplay', [$url, $page], true)) || - ($event = Event::fire('cms.page.beforeDisplay', [$this, $url, $page], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.beforeDisplay', [$url, $page])) { if ($event instanceof Page) { $page = $event; } @@ -223,10 +219,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.display', [$url, $page, $result], true)) || - ($event = Event::fire('cms.page.display', [$this, $url, $page, $result], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.display', [$url, $page, $result])) { return $event; } @@ -326,10 +319,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.init', [$page], true)) || - ($event = Event::fire('cms.page.init', [$this, $page], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.init', [$page])) { return $event; } @@ -362,10 +352,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.beforeRenderPage', [$page], true)) || - ($event = Event::fire('cms.page.beforeRenderPage', [$this, $page], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.beforeRenderPage', [$page])) { $this->pageContents = $event; } else { @@ -410,10 +397,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.start', [], true)) || - ($event = Event::fire('cms.page.start', [$this], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.start')) { return $event; } @@ -422,9 +406,11 @@ class Controller */ if ($this->layoutObj) { CmsException::mask($this->layout, 300); - $response = (($result = $this->layoutObj->onStart()) || + $response = ( + ($result = $this->layoutObj->onStart()) || ($result = $this->layout->runComponents()) || - ($result = $this->layoutObj->onBeforePageStart())) ? $result: null; + ($result = $this->layoutObj->onBeforePageStart()) + ) ? $result : null; CmsException::unmask(); if ($response) { @@ -436,9 +422,11 @@ class Controller * Run page functions */ CmsException::mask($this->page, 300); - $response = (($result = $this->pageObj->onStart()) || + $response = ( + ($result = $this->pageObj->onStart()) || ($result = $this->page->runComponents()) || - ($result = $this->pageObj->onEnd())) ? $result : null; + ($result = $this->pageObj->onEnd()) + ) ? $result : null; CmsException::unmask(); if ($response) { @@ -457,10 +445,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.end', [], true)) || - ($event = Event::fire('cms.page.end', [$this], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.end')) { return $event; } @@ -481,7 +466,7 @@ class Controller $dataHolder = (object) ['content' => $content]; - Event::fire('cms.page.postprocess', [$this, $url, $page, $dataHolder]); + $this->fireSystemEvent('cms.page.postprocess', [$url, $page, $dataHolder]); return $dataHolder->content; } @@ -566,8 +551,7 @@ class Controller /* * Extensibility */ - $this->fireEvent('page.initComponents', [$this->page, $this->layout]); - Event::fire('cms.page.initComponents', [$this, $this->page, $this->layout]); + $this->fireSystemEvent('cms.page.initComponents', [$this->page, $this->layout]); } // @@ -750,10 +734,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.render', [$contents], true)) || - ($event = Event::fire('cms.page.render', [$this, $contents], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.render', [$contents])) { return $event; } @@ -783,10 +764,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.beforeRenderPartial', [$name], true)) || - ($event = Event::fire('cms.page.beforeRenderPartial', [$this, $name], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.beforeRenderPartial', [$name])) { $partial = $event; } /* @@ -936,10 +914,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.renderPartial', [$name, $partialContent], true)) || - ($event = Event::fire('cms.page.renderPartial', [$this, $name, $partialContent], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.renderPartial', [$name, &$partialContent])) { return $event; } @@ -958,10 +933,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.beforeRenderContent', [$name], true)) || - ($event = Event::fire('cms.page.beforeRenderContent', [$this, $name], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.beforeRenderContent', [$name])) { $content = $event; } /* @@ -991,10 +963,7 @@ class Controller /* * Extensibility */ - if ( - ($event = $this->fireEvent('page.renderContent', [$name, $fileContent], true)) || - ($event = Event::fire('cms.page.renderContent', [$this, $name, $fileContent], true)) - ) { + if ($event = $this->fireSystemEvent('cms.page.renderContent', [$name, &$fileContent])) { return $event; } diff --git a/modules/cms/controllers/Index.php b/modules/cms/controllers/Index.php index 861d44d34..5f421c95f 100644 --- a/modules/cms/controllers/Index.php +++ b/modules/cms/controllers/Index.php @@ -3,14 +3,11 @@ use Url; use Lang; use Flash; -use Event; use Config; use Request; use Response; use Exception; use BackendMenu; -use Backend\Classes\Controller; -use Backend\Classes\WidgetManager; use Cms\Widgets\AssetList; use Cms\Widgets\TemplateList; use Cms\Widgets\ComponentList; @@ -23,9 +20,10 @@ use Cms\Classes\Content; use Cms\Classes\CmsCompoundObject; use Cms\Classes\ComponentManager; use Cms\Classes\ComponentPartial; -use ApplicationException; -use Backend\Traits\InspectableContainer; +use Backend\Classes\Controller; +use Backend\Classes\WidgetManager; use October\Rain\Router\Router as RainRouter; +use ApplicationException; /** * CMS index @@ -35,7 +33,7 @@ use October\Rain\Router\Router as RainRouter; */ class Index extends Controller { - use InspectableContainer; + use \Backend\Traits\InspectableContainer; protected $theme; @@ -189,8 +187,7 @@ class Index extends Controller /* * Extensibility */ - Event::fire('cms.template.save', [$this, $template, $type]); - $this->fireEvent('template.save', [$template, $type]); + $this->fireSystemEvent('cms.template.save', [$template, $type]); Flash::success(Lang::get('cms::lang.template.saved')); @@ -263,8 +260,7 @@ class Index extends Controller /* * Extensibility */ - Event::fire('cms.template.delete', [$this, $type]); - $this->fireEvent('template.delete', [$type]); + $this->fireSystemEvent('cms.template.delete', [$type]); return [ 'deleted' => $deleted, @@ -284,8 +280,7 @@ class Index extends Controller /* * Extensibility */ - Event::fire('cms.template.delete', [$this, $type]); - $this->fireEvent('template.delete', [$type]); + $this->fireSystemEvent('cms.template.delete', [$type]); } public function onGetTemplateList() @@ -366,7 +361,10 @@ class Index extends Controller throw new ApplicationException(trans('cms::lang.template.not_found')); } - Event::fire('cms.template.processSettingsAfterLoad', [$this, $template]); + /* + * Extensibility + */ + $this->fireSystemEvent('cms.template.processSettingsAfterLoad', [$template]); return $template; } @@ -475,11 +473,9 @@ class Index extends Controller /* * Extensibility */ - $dataHolder = (object)[ - 'settings' => $settings - ]; + $dataHolder = (object) ['settings' => $settings]; - Event::fire('cms.template.processSettingsBeforeSave', [$this, $dataHolder]); + $this->fireSystemEvent('cms.template.processSettingsBeforeSave', [$dataHolder]); return $dataHolder->settings; } diff --git a/modules/system/traits/EventEmitter.php b/modules/system/traits/EventEmitter.php new file mode 100644 index 000000000..56942e293 --- /dev/null +++ b/modules/system/traits/EventEmitter.php @@ -0,0 +1,94 @@ +fireSystemEvent('backend.list.myEvent', ['my value']); + * + * Is equivalent to: + * + * $this->fireEvent('list.myEvent', ['myvalue'], true); + * + * Event::fire('backend.list.myEvent', [$this, 'myvalue'], true); + * + * @param string $event Event name + * @param array $params Event parameters + * @param boolean $halt Halt after first non-null result + * @return mixed + */ + public function fireSystemEvent($event, $params = [], $halt = true) + { + $result = []; + + $shortEvent = substr($event, strpos($event, '.') + 1); + + $longArgs = array_merge([$this], $params); + + /* + * Local event first + */ + if ($response = $this->fireEvent($shortEvent, $params, $halt)) { + if ($halt) { + return $response; + } + else { + $result = array_merge($result, $response); + } + } + + /* + * Global event second + */ + if ($response = Event::fire($event, $longArgs, $halt)) { + if ($halt) { + return $response; + } + else { + $result = array_merge($result, $response); + } + } + + return $result; + } + + /** + * Special event function used for extending within view files, + * allowing HTML to be injected multiple times. + * + * For example: + * + * fireViewEvent('backend.auth.extendSigninView') ?> + * + * @param string $event Event name + * @param array $params Event parameters + * @return string + */ + public function fireViewEvent($event, $params = []) + { + // Add the local object to the first parameter always + array_unshift($params, $this); + + if ($result = Event::fire($event, $params)) { + return implode(PHP_EOL.PHP_EOL, (array) $result); + } + + return ''; + } +} diff --git a/modules/system/traits/ViewMaker.php b/modules/system/traits/ViewMaker.php index 00d711a4d..8d88f9214 100644 --- a/modules/system/traits/ViewMaker.php +++ b/modules/system/traits/ViewMaker.php @@ -296,22 +296,4 @@ trait ViewMaker $guessedPath = $classFile ? $classFile . '/' . $classFolder . $suffix : null; return ($isPublic) ? File::localToPublic($guessedPath) : $guessedPath; } - - /** - * Special event function used for extending within view files - * @param string $event Event name - * @param array $params Event parameters - * @return string - */ - public function fireViewEvent($event, $params = []) - { - // Add the local object to the first parameter always - array_unshift($params, $this); - - if ($result = Event::fire($event, $params)) { - return implode(PHP_EOL.PHP_EOL, (array) $result); - } - - return ''; - } }