PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.0.3
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.0.3
5.13.0 5.12.1 5.12.0 5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / EventDispatcher.php
matomo / app / core Last commit date
API 2 years ago Access 2 years ago Application 2 years ago Archive 2 years ago ArchiveProcessor 2 years ago Archiver 2 years ago AssetManager 2 years ago Auth 2 years ago Category 2 years ago Changes 2 years ago CliMulti 2 years ago Columns 2 years ago Concurrency 2 years ago Config 2 years ago Container 2 years ago CronArchive 2 years ago DataAccess 2 years ago DataFiles 2 years ago DataTable 2 years ago Db 2 years ago DeviceDetector 2 years ago Email 2 years ago Exception 2 years ago Http 2 years ago Intl 2 years ago Log 2 years ago Mail 2 years ago Measurable 2 years ago Menu 2 years ago Metrics 2 years ago Notification 2 years ago Period 2 years ago Plugin 2 years ago ProfessionalServices 2 years ago Report 2 years ago ReportRenderer 2 years ago Scheduler 2 years ago Segment 2 years ago Session 2 years ago Settings 2 years ago Tracker 2 years ago Translation 2 years ago Twig 2 years ago UpdateCheck 2 years ago Updater 2 years ago Updates 2 years ago Validators 2 years ago View 2 years ago ViewDataTable 2 years ago Visualization 2 years ago Widget 2 years ago .htaccess 2 years ago Access.php 2 years ago Archive.php 2 years ago ArchiveProcessor.php 2 years ago AssetManager.php 2 years ago Auth.php 2 years ago AuthResult.php 2 years ago BaseFactory.php 2 years ago Cache.php 2 years ago CacheId.php 2 years ago CliMulti.php 2 years ago Common.php 2 years ago Config.php 2 years ago Console.php 2 years ago Context.php 2 years ago Cookie.php 2 years ago CronArchive.php 2 years ago DI.php 2 years ago DataArray.php 2 years ago DataTable.php 2 years ago Date.php 2 years ago Db.php 2 years ago DbHelper.php 2 years ago Development.php 2 years ago ErrorHandler.php 2 years ago EventDispatcher.php 2 years ago ExceptionHandler.php 2 years ago FileIntegrity.php 2 years ago Filechecks.php 2 years ago Filesystem.php 2 years ago FrontController.php 2 years ago Http.php 2 years ago IP.php 2 years ago Log.php 2 years ago LogDeleter.php 2 years ago Mail.php 2 years ago Metrics.php 2 years ago NoAccessException.php 2 years ago Nonce.php 2 years ago Notification.php 2 years ago NumberFormatter.php 2 years ago Option.php 2 years ago Period.php 2 years ago Piwik.php 2 years ago Plugin.php 2 years ago Profiler.php 2 years ago ProxyHeaders.php 2 years ago ProxyHttp.php 2 years ago QuickForm2.php 2 years ago RankingQuery.php 2 years ago ReportRenderer.php 2 years ago Request.php 2 years ago Segment.php 2 years ago Sequence.php 2 years ago Session.php 2 years ago SettingsPiwik.php 2 years ago SettingsServer.php 2 years ago Singleton.php 2 years ago Site.php 2 years ago SiteContentDetector.php 2 years ago SupportedBrowser.php 2 years ago TCPDF.php 2 years ago Theme.php 2 years ago Timer.php 2 years ago Tracker.php 2 years ago Twig.php 2 years ago Unzip.php 2 years ago UpdateCheck.php 2 years ago Updater.php 2 years ago UpdaterErrorException.php 2 years ago Updates.php 2 years ago Url.php 2 years ago UrlHelper.php 2 years ago Version.php 2 years ago View.php 2 years ago bootstrap.php 2 years ago dispatch.php 2 years ago testMinimumPhpVersion.php 2 years ago
EventDispatcher.php
189 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 *
9 */
10 namespace Piwik;
11
12 use Piwik\Container\StaticContainer;
13 /**
14 * This class allows code to post events from anywhere in Piwik and for
15 * plugins to associate callbacks to be executed when events are posted.
16 */
17 class EventDispatcher
18 {
19 /**
20 * @return EventDispatcher
21 */
22 public static function getInstance()
23 {
24 return StaticContainer::get('Piwik\\EventDispatcher');
25 }
26 // implementation details for postEvent
27 const EVENT_CALLBACK_GROUP_FIRST = 0;
28 const EVENT_CALLBACK_GROUP_SECOND = 1;
29 const EVENT_CALLBACK_GROUP_THIRD = 2;
30 /**
31 * Array of observers (callbacks attached to events) that are not methods
32 * of plugin classes.
33 *
34 * @var array
35 */
36 private $extraObservers = array();
37 /**
38 * Array storing information for all pending events. Each item in the array
39 * will be an array w/ two elements:
40 *
41 * array(
42 * 'Event.Name', // the event name
43 * array('event', 'parameters') // the parameters to pass to event observers
44 * )
45 *
46 * @var array
47 */
48 private $pendingEvents = array();
49 /**
50 * Plugin\Manager instance used to get list of loaded plugins.
51 *
52 * @var \Piwik\Plugin\Manager
53 */
54 private $pluginManager;
55 private $pluginHooks = array();
56 public static $_SKIP_EVENTS_IN_TESTS = false;
57 /**
58 * Constructor.
59 */
60 public function __construct(\Piwik\Plugin\Manager $pluginManager, array $observers = array())
61 {
62 $this->pluginManager = $pluginManager;
63 foreach ($observers as $observerInfo) {
64 list($eventName, $callback) = $observerInfo;
65 $this->extraObservers[$eventName][] = $callback;
66 }
67 }
68 /**
69 * Triggers an event, executing all callbacks associated with it.
70 *
71 * @param string $eventName The name of the event, ie, API.getReportMetadata.
72 * @param array $params The parameters to pass to each callback when executing.
73 * @param bool $pending Whether this event should be posted again for plugins
74 * loaded after the event is fired.
75 * @param array|null $plugins The plugins to post events to. If null, the event
76 * is posted to all plugins. The elements of this array
77 * can be either the Plugin objects themselves
78 * or their string names.
79 */
80 public function postEvent($eventName, $params, $pending = false, $plugins = null)
81 {
82 if (self::$_SKIP_EVENTS_IN_TESTS) {
83 return;
84 }
85 if ($pending) {
86 $this->pendingEvents[] = array($eventName, $params);
87 }
88 $manager = $this->pluginManager;
89 if (empty($plugins)) {
90 $plugins = $manager->getPluginsLoadedAndActivated();
91 }
92 $callbacks = array();
93 // collect all callbacks to execute
94 foreach ($plugins as $pluginName) {
95 if (!is_string($pluginName)) {
96 $pluginName = $pluginName->getPluginName();
97 }
98 if (!isset($this->pluginHooks[$pluginName])) {
99 $plugin = $manager->getLoadedPlugin($pluginName);
100 $this->pluginHooks[$pluginName] = $plugin->registerEvents();
101 }
102 $hooks = $this->pluginHooks[$pluginName];
103 if (isset($hooks[$eventName])) {
104 list($pluginFunction, $callbackGroup) = $this->getCallbackFunctionAndGroupNumber($hooks[$eventName]);
105 if (is_string($pluginFunction)) {
106 $plugin = $manager->getLoadedPlugin($pluginName);
107 $callbacks[$callbackGroup][] = array($plugin, $pluginFunction);
108 } else {
109 $callbacks[$callbackGroup][] = $pluginFunction;
110 }
111 }
112 }
113 if (isset($this->extraObservers[$eventName])) {
114 foreach ($this->extraObservers[$eventName] as $callbackInfo) {
115 list($callback, $callbackGroup) = $this->getCallbackFunctionAndGroupNumber($callbackInfo);
116 $callbacks[$callbackGroup][] = $callback;
117 }
118 }
119 // sort callbacks by their importance
120 ksort($callbacks);
121 // execute callbacks in order
122 foreach ($callbacks as $callbackGroup) {
123 foreach ($callbackGroup as $callback) {
124 call_user_func_array($callback, $params);
125 }
126 }
127 }
128 /**
129 * Associates a callback that is not a plugin class method with an event
130 * name.
131 *
132 * @param string $eventName
133 * @param array|callable $callback This can be a normal PHP callback or an array
134 * that looks like this:
135 * array(
136 * 'function' => $callback,
137 * 'before' => true
138 * )
139 * or this:
140 * array(
141 * 'function' => $callback,
142 * 'after' => true
143 * )
144 * If 'before' is set, the callback will be executed
145 * before normal & 'after' ones. If 'after' then it
146 * will be executed after normal ones.
147 */
148 public function addObserver($eventName, $callback)
149 {
150 $this->extraObservers[$eventName][] = $callback;
151 }
152 /**
153 * Re-posts all pending events to the given plugin.
154 *
155 * @param Plugin $plugin
156 */
157 public function postPendingEventsTo($plugin)
158 {
159 foreach ($this->pendingEvents as $eventInfo) {
160 [$eventName, $eventParams] = $eventInfo;
161 $this->postEvent($eventName, $eventParams, $pending = false, array($plugin));
162 }
163 }
164 /**
165 * @internal For testing purpose only
166 */
167 public function clearCache()
168 {
169 $this->pluginHooks = [];
170 }
171 private function getCallbackFunctionAndGroupNumber($hookInfo)
172 {
173 if (is_array($hookInfo) && !empty($hookInfo['function'])) {
174 $pluginFunction = $hookInfo['function'];
175 if (!empty($hookInfo['before'])) {
176 $callbackGroup = self::EVENT_CALLBACK_GROUP_FIRST;
177 } elseif (!empty($hookInfo['after'])) {
178 $callbackGroup = self::EVENT_CALLBACK_GROUP_THIRD;
179 } else {
180 $callbackGroup = self::EVENT_CALLBACK_GROUP_SECOND;
181 }
182 } else {
183 $pluginFunction = $hookInfo;
184 $callbackGroup = self::EVENT_CALLBACK_GROUP_SECOND;
185 }
186 return array($pluginFunction, $callbackGroup);
187 }
188 }
189