@mattab opened this Issue on February 22nd 2010 Owner

See use case of plugin #1168

Hooks should be executed in a certain order, so that some plugins modify the data and other can access the recorded data. In some cases, it is not possible to add new hooks as a given data point (eg. the user IP) can be modified by several hooks.

The hook registration should maybe be a function call rather than the current array format. This function would have a priority parameter that would define, from 1 to 100, the priority at which the function should be called. For example, plugins that modify the data and needs to access its raw state, they would set priority=1. Plugins that record the data would set 100. Hooks that modify the value after basic filters would set priority=50.

The range could maybe be from 1 to 10. I am not sure of any code standard regarding this pattern? Also, this is similar to filter priority in wordpress hooks.

@mattab commented on November 24th 2011 Owner

(In [5474]) Refs #1169

  • A good example of why we need event priority/ordering so that a plugin can execute first or last or anytime, for a given hook.
    Imagegraph was missing a few plugin images because it was executed before the Goals plugin added additional ecommerce reports.
  • Adding debug define to force scheduled tasks to run
@mattab commented on April 6th 2014 Owner

We have implemented a basic 3 level hook priority mechanism which lets you run your plugin's hook before or after other plugins.

This is documented in the developer guide http://developer.piwik.org/guides/piwiks-extensibility-points#handling-events

Callback Execution Order

Callbacks can be made to run before or after others. This is done when associating callbacks with events.

To make a callback execute before all others, associate the event with an array like the following:

public function getListHooksRegistered()
{
return array(
'API.getSegmentsMetadata' => array(
'before' => true,
'function' => 'getSegmentsMetadata'
)
);
}

To make a callback execute after other callbacks, associate the event with an array like the following:

public function getListHooksRegistered()
{
return array(
'API.getSegmentsMetadata' => array(
'after' => true,
'function' => 'getSegmentsMetadata'
)
);
}

This Issue was closed on April 6th 2014
Powered by GitHub Issue Mirror