Template Hooks
Craft templates can give modules and plugins an opportunity to hook into them using hook tags.
{# Give plugins a chance to make changes here #}
{% hook 'my-custom-hook-name' %}
Plugins and modules can register methods to be called by template hooks using craft\web\View::hook() (opens new window).
Craft::$app->view->hook('my-custom-hook-name', function(array &$context) {
// Modify template *context*
$context['foo'] = 'bar';
// Return template *output*
return '<p>Hey!</p>';
});
The callback method will pass a $context
argument, which represents the current template context (all of the currently defined template variables). Any changes to this array will result in changes to the template’s variables for any tags that follow the {% hook %}
tag.
The method can optionally return a string, which will be output where the {% hook %}
tag is in the template.
# Control Panel Template Hooks
Your custom plugin or module can use existing template hooks to modify parts of the Craft control panel.
Pay close attention to what you intend to modify; some hooks are provided for modifying context while others make most sense for output.
Hook | Description & Template |
---|---|
cp.elements.element | Base element template. _elements/element.html (opens new window) |
cp.layouts.base | Before doctype declaration in base template._layouts/base.html (opens new window) |
cp.assets.edit | Before asset detail view’s template blocks. assets/_edit.html (opens new window) |
cp.assets.edit.content | After asset detail view’s main content. assets/_edit.html (opens new window) |
cp.assets.edit.details | After asset detail view’s existing right sidebar details column. assets/_edit.html (opens new window) |
cp.assets.edit.settings | After asset detail view’s “Filename” field. assets/_edit.html (opens new window) |
cp.assets.edit.meta | After asset detail view’s existing right sidebar meta details. assets/_edit.html (opens new window) |
cp.categories.edit | Before category detail view’s template blocks. categories/_edit.html (opens new window) |
cp.categories.edit.content | After category detail view’s main content. categories/_edit.html (opens new window) |
cp.categories.edit.details | After category detail view’s existing right sidebar details column. categories/_edit.html (opens new window) |
cp.entries.edit | Before entry detail view’s template blocks. entries/_edit.html (opens new window) |
cp.entries.edit.content | After entry detail view’s main content. entries/_edit.html (opens new window) |
cp.entries.edit.settings | After entry detail view’s sidebar settings block. entries/_edit.html (opens new window) |
cp.entries.edit.meta | After entry detail view’s existing right sidebar meta details. entries/_edit.html (opens new window) |
cp.entries.edit.details | After entry detail view’s existing right sidebar details column. entries/_edit.html (opens new window) |
cp.globals.edit | Before global set detail view’s template blocks. globals/_edit.html (opens new window) |
cp.globals.edit.content | After global set detail view’s main content. globals/_edit.html (opens new window) |
cp.users.edit | Before user detail view’s template blocks. users/_edit.html (opens new window) |
cp.users.edit.prefs | After fields in the user’s “Preferences” tab. users/_edit.html (opens new window) |
cp.users.edit.content | After user detail view’s main tabbed content. users/_edit.html (opens new window) |
cp.users.edit.details | After user detail view’s right sidebar details. users/_edit.html (opens new window) |