Simplify system events

This pipes all event calls through a new EventEmitter trait, which substitutes the October Rain event emitter trait. The view event has been moved to this trait also.
Pass some variables by reference to allow multi-extension.
Fixes #2420
This commit is contained in:
Samuel Georges 2016-12-10 09:02:06 +11:00
parent 1bdedb5584
commit 0a2b343047
11 changed files with 158 additions and 166 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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.

View File

@ -1,14 +1,11 @@
<?php namespace Backend\Widgets;
use Backend;
use Backend\Classes\FormField;
use Backend\FormWidgets\DatePicker;
use Carbon\Carbon;
use Db;
use Str;
use Lang;
use Event;
use Backend;
use DbDongle;
use Carbon\Carbon;
use Backend\Classes\WidgetBase;
use Backend\Classes\FilterScope;
use ApplicationException;
@ -211,7 +208,9 @@ class Filter extends WidgetBase
* Trigger class event, merge results as viewable array
*/
$params = func_get_args();
$result = $this->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
*

View File

@ -1,7 +1,6 @@
<?php namespace Backend\Widgets;
use Lang;
use Event;
use Form as FormHelper;
use Backend\Classes\FormTabs;
use Backend\Classes\FormField;
@ -357,8 +356,7 @@ class Form extends WidgetBase
* Extensibility
*/
$dataHolder = (object) ['data' => $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

View File

@ -1,11 +1,10 @@
<?php namespace Backend\Widgets;
use Db;
use Html;
use App;
use Html;
use Lang;
use Input;
use Event;
use Backend;
use DbDongle;
use Carbon\Carbon;
@ -15,8 +14,8 @@ use System\Helpers\DateTime as DateTimeHelper;
use System\Classes\PluginManager;
use Backend\Classes\ListColumn;
use Backend\Classes\WidgetBase;
use ApplicationException;
use October\Rain\Database\Model;
use ApplicationException;
use DateTime;
/**
@ -334,8 +333,7 @@ class Lists extends WidgetBase
/*
* Extensibility
*/
Event::fire('backend.list.extendQueryBefore', [$this, $query]);
$this->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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -0,0 +1,94 @@
<?php namespace System\Traits;
use Event;
/**
* Adds system event related features to any class.
*
* @package october\system
* @author Alexey Bobkov, Samuel Georges
*/
trait EventEmitter
{
use \October\Rain\Support\Traits\Emitter;
/**
* Fires a combination of local and global events. The first segment is removed
* from the event name locally and the local object is passed as the first
* argument to the event globally. Halting is also enabled by default.
*
* For example:
*
* $this->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:
*
* <?= $this->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 '';
}
}

View File

@ -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 '';
}
}