Events
Wishlist provides events for extending its functionality. Modules and plugins can register event listeners, typically in their init() methods, to change Wishlist’s behaviour.
Lists and items are Craft elements, so their save and delete events are Craft’s own element events, triggered on the ListElement and Item classes.
List Events
The beforeSave Event
The event that is triggered before a list is saved. Set $event->isValid to false to prevent the list from being saved.
use craft\events\ModelEvent;
use verbb\wishlist\elements\ListElement;
use yii\base\Event;
Event::on(ListElement::class, ListElement::EVENT_BEFORE_SAVE, function(ModelEvent $event) {
$list = $event->sender;
$isNew = $event->isNew;
});The afterSave Event
The event that is triggered after a list is saved.
use craft\events\ModelEvent;
use verbb\wishlist\elements\ListElement;
use yii\base\Event;
Event::on(ListElement::class, ListElement::EVENT_AFTER_SAVE, function(ModelEvent $event) {
$list = $event->sender;
});The beforeDelete Event
The event that is triggered before a list is deleted. Set $event->isValid to false to prevent the list from being deleted.
use craft\events\ModelEvent;
use verbb\wishlist\elements\ListElement;
use yii\base\Event;
Event::on(ListElement::class, ListElement::EVENT_BEFORE_DELETE, function(ModelEvent $event) {
$list = $event->sender;
});The afterDelete Event
The event that is triggered after a list is deleted.
use verbb\wishlist\elements\ListElement;
use yii\base\Event;
Event::on(ListElement::class, ListElement::EVENT_AFTER_DELETE, function(Event $event) {
$list = $event->sender;
});Add to Cart Events
These events are triggered when a visitor adds a list’s items to their Craft Commerce cart, through the wishlist/lists/add-to-cart action. None of them can be cancelled.
The beforeAddToCart Event
The event that is triggered before a list’s items are added to the cart. $event->cart is the visitor’s cart and $event->list is the list.
use verbb\wishlist\controllers\ListsController;
use verbb\wishlist\events\AddToCartEvent;
use yii\base\Event;
Event::on(ListsController::class, ListsController::EVENT_BEFORE_ADD_TO_CART, function(AddToCartEvent $event) {
$cart = $event->cart;
$list = $event->list;
});The afterAddToCart Event
The event that is triggered after a list’s items have been added to the cart and the cart has been saved.
use verbb\wishlist\controllers\ListsController;
use verbb\wishlist\events\AddToCartEvent;
use yii\base\Event;
Event::on(ListsController::class, ListsController::EVENT_AFTER_ADD_TO_CART, function(AddToCartEvent $event) {
$cart = $event->cart;
$list = $event->list;
});The beforeAddLineItem Event
The event that is triggered before an item’s line item is added to the cart. Changes to $event->lineItem, such as its quantity, options or note, are kept when the line item is added. The event can’t skip the item.
use verbb\wishlist\controllers\ListsController;
use verbb\wishlist\events\AddLineItemEvent;
use yii\base\Event;
Event::on(ListsController::class, ListsController::EVENT_BEFORE_ADD_LINE_ITEM, function(AddLineItemEvent $event) {
$cart = $event->cart;
$list = $event->list;
$item = $event->item;
// Add each wishlist item to the cart with a note
$event->lineItem->note = 'Added from ' . $list->title;
});The afterAddLineItem Event
The event that is triggered after an item’s line item has been added to the cart. The cart hasn’t been saved yet at this point.
use verbb\wishlist\controllers\ListsController;
use verbb\wishlist\events\AddLineItemEvent;
use yii\base\Event;
Event::on(ListsController::class, ListsController::EVENT_AFTER_ADD_LINE_ITEM, function(AddLineItemEvent $event) {
$cart = $event->cart;
$list = $event->list;
$item = $event->item;
$lineItem = $event->lineItem;
});List Type Events
The beforeSaveListType Event
The event that is triggered before a list type is validated and saved. $event->isNew is true for a new list type. Changes to $event->listType are saved, and the event can’t prevent the save.
use verbb\wishlist\events\ListTypeEvent;
use verbb\wishlist\services\ListTypes;
use yii\base\Event;
Event::on(ListTypes::class, ListTypes::EVENT_BEFORE_SAVE_LISTTYPE, function(ListTypeEvent $event) {
$listType = $event->listType;
$isNew = $event->isNew;
});The afterSaveListType Event
The event that is triggered after a list type’s changes have been applied from project config, including on other environments when project config is applied there. $event->isNew is always false for this event.
use verbb\wishlist\events\ListTypeEvent;
use verbb\wishlist\services\ListTypes;
use yii\base\Event;
Event::on(ListTypes::class, ListTypes::EVENT_AFTER_SAVE_LISTTYPE, function(ListTypeEvent $event) {
$listType = $event->listType;
});Item Events
The beforeSave Event
The event that is triggered before an item is saved. Set $event->isValid to false to prevent the item from being saved.
use craft\events\ModelEvent;
use verbb\wishlist\elements\Item;
use yii\base\Event;
Event::on(Item::class, Item::EVENT_BEFORE_SAVE, function(ModelEvent $event) {
$item = $event->sender;
$isNew = $event->isNew;
});The afterSave Event
The event that is triggered after an item is saved.
use craft\events\ModelEvent;
use verbb\wishlist\elements\Item;
use yii\base\Event;
Event::on(Item::class, Item::EVENT_AFTER_SAVE, function(ModelEvent $event) {
$item = $event->sender;
});The beforeDelete Event
The event that is triggered before an item is deleted. Set $event->isValid to false to prevent the item from being deleted.
use craft\events\ModelEvent;
use verbb\wishlist\elements\Item;
use yii\base\Event;
Event::on(Item::class, Item::EVENT_BEFORE_DELETE, function(ModelEvent $event) {
$item = $event->sender;
});The afterDelete Event
The event that is triggered after an item is deleted.
use verbb\wishlist\elements\Item;
use yii\base\Event;
Event::on(Item::class, Item::EVENT_AFTER_DELETE, function(Event $event) {
$item = $event->sender;
});The modifySupportedElementTypes Event
The event that is triggered when Wishlist works out which element types can be added to lists. $event->types starts with every registered element type except lists and items. Remove a class to stop visitors adding that type of element from the front end, which also removes it from the element types offered in the control panel.
use craft\elements\Asset;
use craft\elements\User;
use verbb\wishlist\events\ModifySupportedElementTypesEvent;
use verbb\wishlist\services\Items;
use yii\base\Event;
Event::on(Items::class, Items::EVENT_MODIFY_SUPPORTED_ELEMENT_TYPES, function(ModifySupportedElementTypesEvent $event) {
// Don’t allow assets or users to be added to lists
$event->types = array_values(array_diff($event->types, [Asset::class, User::class]));
});PDF Events
The beforeRenderPdf Event
The event that is triggered before a list’s PDF is rendered. $event->list is the list and $event->template is the template path from the pdfPath setting, which you can change to render a different template. Set $event->pdf to your own output to skip Wishlist’s rendering entirely, in which case the afterRenderPdf event isn’t triggered. The event is also triggered for the plain HTML format.
While a listener is registered for this event, Wishlist doesn’t cache rendered PDFs, because the listener’s output can differ from one request to the next.
use verbb\wishlist\events\PdfEvent;
use verbb\wishlist\services\Pdf;
use yii\base\Event;
Event::on(Pdf::class, Pdf::EVENT_BEFORE_RENDER_PDF, function(PdfEvent $event) {
// Use a different template for gift registries
if ($event->list->getType()->handle === 'giftRegistry') {
$event->template = '_pdf/gift-registry';
}
});The afterRenderPdf Event
The event that is triggered after a list’s PDF has been rendered, including when it comes from the cache. $event->pdf holds the PDF output, and whatever it holds when your listener finishes is what Wishlist returns. It isn’t triggered for the plain HTML format.
use verbb\wishlist\events\PdfEvent;
use verbb\wishlist\services\Pdf;
use yii\base\Event;
Event::on(Pdf::class, Pdf::EVENT_AFTER_RENDER_PDF, function(PdfEvent $event) {
$list = $event->list;
$pdf = $event->pdf;
});GraphQL Events
The authorizeLinkedElement Event
The event that is triggered when a GraphQL request reads the element an item links to, and that element is of a type Wishlist doesn’t know how to check against the schema. Wishlist checks entries, users, addresses, assets, categories, tags, global sets, Commerce products and variants, and nested elements through their owner, itself. For any other element type, the element is hidden from GraphQL unless a listener sets $event->authorized to true. The site and status checks still apply first.
$event->element is the linked element and $event->schema is the schema being checked, or null for the active schema.
use craft\helpers\Gql as CraftGql;
use verbb\wishlist\events\AuthorizeGqlElementEvent;
use verbb\wishlist\helpers\Gql;
use yii\base\Event;
use modules\sitemodule\elements\Recipe;
Event::on(Gql::class, Gql::EVENT_AUTHORIZE_LINKED_ELEMENT, function(AuthorizeGqlElementEvent $event) {
if ($event->element instanceof Recipe) {
$event->authorized = CraftGql::canSchema('recipes.all', 'read', $event->schema);
}
});