JavaScript Hooks
Statamic allows you to hook into specific points in JavaScript and perform asyncronous operations using Promises.
This page is about JavaScript-based hooks. We also have PHP-based hooks, which work differently.
About#
Hooks are programmable interfaces which you can use to modify or extend already existing JavaScript code inside the Control Panel.
Normally they work like this:
- Statamic code is running
- Statamic code checks for existing Hooks
- Your custom hook was found
- The code inside your custom hook will be run
- Statamic code continues to run (with modfied data etc.)
Prerequisites#
Before you start using hooks, you need to register the corresponding javascript file.
Please follow the guide on Adding CSS and JS assets.
How to use hooks#
For example, the entry.saving hook allows you to pause saving to perform an action:
Statamic.$hooks.on('entry.saving', (resolve, reject) => {
if (confirm('Are you sure you want to save this entry?')) {
// Continue with the save action.
resolve();
} else {
// Cancel the save action. You can provide the error message.
reject('You chose not to publish.');
}
});
If you intend to work with another promise, make to resolve or reject once it's done:
Statamic.$hooks.on('entry.saving', (resolve, reject) => {
return axios.get('/something')
.then(resolve)
.catch(() => reject('It broke'));
});
Some hooks may provide you with a payload containing additional data. For example, the entry.saving hook provides you with the collection handle and form values.
Statamic.$hooks.on('entry.saving', (resolve, reject, payload) => {
console.log(payload.collection); // blog
console.log(payload.values); // { title: "My Post", content: "Post Content" }
});
When you reject a hook, any other code using that hook will not be executed.
Unless your intention is to stop the execution chain, you should always resolve, even when your code does nothing.
Statamic.$hooks.on('example', (resolve, reject) => {
if (somethingShouldHappen) {
doSomething();
}
resolve();
});
Available hooks#
entry.saving#
Triggered when you click save on the publish form.
You can use reject() to prevent the request. Payload contains collection name, form values, and a reference to the publish container component.
entry.saved#
Triggered when you click save, but after the request has finished.
Payload contains collection name, and the Axios response.
entry.publishing#
Triggered when revisions are enabled, and you click publish in the publish action stack.
You can use reject() to stop the request. Payload contains collection name and revision message.
entry.published#
Triggered when revisions are enabled, but after the request has finished.
Payload contains collection name, revision message, and the Axios response.
global-set.saving#
Triggered when you click save on the publish form.
You can use reject() to prevent the request. Payload contains global set name, form values, and a reference to the publish container component.
global-set.saved#
Triggered when you click save, but after the request has finished.
Payload contains global set name, and the Axios response.