Dispatched Back-End Events
We provide events so developers can customize the behavior of their extension. We utilize Magento’s dispatched events convention for our hooks. You can find a full list of our dispatched events at the end of the page.
You can learn how to create listeners on custom events in a custom extension in Create a custom extension tutorial.
Modifying index settings
All indices managed by the extension have a *_index_before_set_settings
event that lets you modify index settings before sending them to Algolia.
Entity | Related Event |
---|---|
products | algolia_products_index_before_set_settings |
categories | algolia_categories_index_before_set_settings |
pages | algolia_pages_index_before_set_settings |
suggestions | algolia_suggestions_index_before_set_settings |
additional_sections | algolia_additional_sections_index_before_set_settings |
Here’s an example of how this kind of event is dispatched in the extension:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$indexSettings = [...];
// Additional index settings from event observer
$transport = new DataObject($indexSettings);
$this->eventManager->dispatch(
'algolia_products_index_before_set_settings',
[
'store_id' => $storeId,
'index_settings' => $transport,
]
);
$indexSettings = $transport->getData();
$this->algoliaHelper->setSettings($indexName, $indexSettings, false, true);
Whenever using backend events, make sure to refer to where it is dispatched in the code. This lets you see what variable are available for your customization.
You can add or modify the index settings parameters object before sending it to Algolia. Keep in mind that at this point of the event, that the extension has already added and formatted parameters based on your settings.
Here’s an example of how an observer could modify index settings:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
namespace Your\CustomModule\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class AlgoliaUpdateProductsSettings implements ObserverInterface
{
public function execute(Observer $observer)
{
$productsSettings = $observer->getData('index_settings');
$searchableAttributes = $productSettings->getData('searchableAttributes');
// Add code here to modify searchableAttributes
// reset the searchableAttributes value with the updated array
$productsSettings->setData('searchableAttributes', $searchableAttributes);
// add unhandled setting
$productsSettings->setData('snippetEllipsisText', '...')
}
}
Updating attribute data
If you need to modify entity data just before indexing, the extension offers algolia_after_create_*_object
events to let you add your changes to almost all the maintained entities.
Entity | Related Event |
---|---|
products | algolia_after_create_product_object |
categories | algolia_after_create_category_object |
pages | algolia_after_create_page_object |
suggestions | algolia_after_create_suggestion_object |
These events fire in the getObject()
method of the entity Helper class. For example, in \Algolia\AlgoliaSearch\Helper\Entity\ProductHelper::getObject()
you can see this event is dispatched just before the object is returned for indexing:
1
2
3
4
5
6
$transport = new DataObject($customData);
$this->eventManager->dispatch(
'algolia_after_create_product_object',
['custom_data' => $transport, 'sub_products' => $subProducts, 'productObject' => $product]
);
$customData = $transport->getData();
Here’s an example of how an observer could transform the created_at
attribute from the default MySQL date format to a timestamp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
namespace Your\CustomModule\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class AlgoliaAfterCreateProductObject implements ObserverInterface
{
public function execute(Observer $observer)
{
$data = $observer->getData('custom_data');
// update created_at MySQL date format to timestamp
$createdAt = $data->getData('created_at');
$data->setData('created_at', strtotime($createdAt));
}
}
Modifying Product Data
As previously seen, algolia_after_create_product_object
is the event to use to modify the product data sent to Algolia. However, depending on what data you need for your customization, a particular attribute may not be available in the collection data.
In that case, you need go farther back in the stack trace to modify the product collection data to request the attribute you need. The reason is that the product data we use for indexing is from a product collection request. Since we specify the attributes for this collection, the full product model is not available during the object creation method.
This applies for categories and suggestions indexing as well. They have their own algolia_after_*_collection_build
events where you can access the collection.
The\Algolia\AlgoliaSearch\Helper\Entity\ProductHelper::getProductCollectionQuery()
method is where we create the product collection and set its attributes. As you can see, we dispatch the algolia_after_products_collection_build
event where you have access to the $collection
object, at the end of the method:
1
2
3
4
5
6
7
8
9
$this->eventManager->dispatch(
'algolia_after_products_collection_build',
[
'store' => $storeId,
'collection' => $products,
'only_visible' => $onlyVisible,
'include_not_visible_individually' => $includeNotVisibleIndividually,
]
);
In your custom observer, you can access the product collection and add your attribute before the collection loads:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
namespace Your\CustomModule\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class AlgoliaAddAttributesToProductCollection implements ObserverInterface
{
public function execute(Observer $observer)
{
$collection = $observer->getData('collection');
$collection->addAttributeToSelect('custom_attribute_code');
}
}
Once you’ve added the attribute, your product can now retrieve it in your observer for the algolia_after_create_product_object
event:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
namespace Your\CustomModule\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class AlgoliaAfterCreateProductObject implements ObserverInterface
{
public function execute(Observer $observer)
{
$data = $observer->getData('custom_data');
$product = $observer->getData('productObject');
// add new custom attribute
$data->setData('newCustomAttribute', $product->getData('custom_attribute_code'));
// update created_at MySQL date format to timestamp
$createdAt = $data->getData('created_at');
$data->setData('created_at', strtotime($createdAt));
}
}
In the example above, we added our new customization along with the previous one for transforming data. It’s up to you if you’d like to use one observer for one event for multiple customizations, or if you’d like to create a separate observer for each customization.
Changing front-end configuration
In order for the front end to display the configured UI, the extension creates the algoliaConfig
variable in JavaScript by retrieving the configuration from a block class. You can modify the algoliaConfig
object before page load by using the algolia_after_create_configuration
event.
This event is dispatched at the end of \Algolia\AlgoliaSearch\Block\Configuration::getConfiguration()
:
1
2
3
4
5
6
$transport = new DataObject($algoliaJsConfig);
$this->_eventManager->dispatch(
'algolia_after_create_configuration',
['configuration' => $transport]
);
$algoliaJsConfig = $transport->getData();
As you can see, we turn the configuration array into a DataObject
so that you can easily make modifications in your observer using getters and setters:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
namespace Your\CustomModule\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class AlgoliaAfterCreateConfiguration implements ObserverInterface
{
public function execute(Observer $observer)
{
$config = $observer->getData('configuration');
// add new config value
$config->setData('newData', 'newValue');
// modify set value 9 -> 10
$config->setData('hitsPerPage', 10);
// modify/add new translations
$trans = $config->getData('translations');
$trans['newTranslation'] = __('New Translation');
$trans['showMore'] = __('Show More');
$config->setData('translations', $trans);
}
}
List of events
Product events
Dispatching before pushing products’ index settings to Algolia
algolia_products_index_before_set_settings
Passed parameters:
$storeId
$index_settings
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$index_settings
as data inMagento\Framework\DataObject
object
Dispatching after products collection creation
algolia_after_products_collection_build
Passed parameters:
$storeId
$collection
asMagento\Catalog\Model\ResourceModel\Product\Collection
$only_visible
$include_not_visible_individually
Modifiable parameters:
$collection
asMagento\Catalog\Model\ResourceModel\Product\Collection
Dispatching before final products collection load
algolia_before_products_collection_load
Passed parameters:
$collection
asMagento\Catalog\Model\ResourceModel\Product\Collection
$store
Modifiable parameters:
$collection
Dispatching before fetching product’s attributes for indexing
algolia_product_index_before
Passed parameters:
$product
asMagento\Catalog\Model\Product
$custom_data
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$custom_data
as data inMagento\Framework\DataObject
object
Dispatching after fetching product’s attributes for indexing
algolia_after_create_product_object
Passed parameters:
$custom_data
as data inMagento\Framework\DataObject
object$subProducts
as array of sub products$productObject
asMagento\Catalog\Model\Product
Modifiable parameters:
$custom_data
as data inMagento\Framework\DataObject
object
Category events
Dispatching before pushing categories’ index settings to Algolia
algolia_categories_index_before_set_settings
Passed parameters:
$storeId
$index_settings
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$index_settings
as data inMagento\Framework\DataObject
object
Dispatching after categories collection creation
algolia_after_categories_collection_build
Passed parameters:
$store
$collection
asMagento\Catalog\Model\ResourceModel\Category\Collection
Modifiable parameters:
$collection
Dispatching before fetching category’s attributes for indexing
algolia_category_index_before
Passed parameters:
$category
asMagento\Catalog\Model\Category
$custom_data
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$custom_data
as data inMagento\Framework\DataObject
object
Dispatching after fetching category’s attributes for indexing
algolia_after_create_category_object
Passed parameters:
$category
asMagento\Catalog\Model\Category
$categoryObject
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$categoryObject
as data inMagento\Framework\DataObject
object
Page events
Dispatching before pushing pages’ index settings to Algolia
algolia_pages_index_before_set_settings
Passed parameters:
$store_id
$index_settings
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$index_settings
as data inMagento\Framework\DataObject
object
Dispatching after fetching page’s attributes for indexing
algolia_after_create_page_object
Passed parameters:
$page
as data inMagento\Framework\DataObject
object$pageObject
asMagento\Cms\Model\Page
Modifiable parameters:
$page
as data inMagento\Framework\DataObject
object
Suggestion events
Dispatching before pushing suggestions’ index settings to Algolia
algolia_suggestions_index_before_set_settings
Passed parameters:
$store_id
$index_settings
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$index_settings
as data inMagento\Framework\DataObject
object
Dispatching after suggestions collection creation
algolia_after_suggestions_collection_build
Passed parameters:
$store
$collection
asMagento\Search\Model\ResourceModel\Query\Collection
Modifiable parameters:
$collection
Dispatching after fetching suggestion’s attributes for indexing
algolia_after_create_suggestion_object
Passed parameters:
$suggestion
as data inMagento\Framework\DataObject
object$suggestionObject
asMagento\Search\Model\Query
Modifiable parameters:
$suggestion
as data inMagento\Framework\DataObject
object
Additional sections events
Dispatching before pushing additional sections’ index settings to Algolia
algolia_additional_sections_index_before_set_settings
Passed parameters:
$store_id
$index_settings
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$index_settings
as data inMagento\Framework\DataObject
object
Dispatching after fetching additional_section’s attributes for indexing
algolia_additional_section_items_before_index
Passed parameters:
$section
$record
as data inMagento\Framework\DataObject
object$store_id
Modifiable parameters:
$record
as data inMagento\Framework\DataObject
object
Front-end configuration events
Dispatching after front-end configuration creation
algolia_after_create_configuration
Passed parameters:
$configuration
as data inMagento\Framework\DataObject
object
Modifiable parameters:
$configuration
as data inMagento\Framework\DataObject
object