Magento is the most popular open source eCommerce product. It has thousands of plugins free and paid.  To write plugins/custom code/Extensions effectively one need to understand Magento Event-Observer pattern. We are going to see what it is and how can we use it to write a Magento Plugin.

Observers register themselves to wait for an event so that they can execute code whenever an event is fired. In other words each observer registers with the subject, and when an event occurs, the subject notifies and observer code is executed.

Magento Events

An Event is something that is/can be triggered during a particular sequence flow.Say for example once a customer completes an order, the flow sequence would be to

  • Save the order details
  • Send e-mail confirmation to customer

Events can be triggered before or after each of these flow points to introduce custom logic.

How to use Events in Magento?

For using Events Observers first we need to declare the events in config.xml  under  tag.
In Magento Events are divided into three sections:

  1. global –  When we are declaring events in the  section these events will be accessible both in frontend and Admin.
  2. adminhtml – These are the events which will triggered only in Admin area.
  3. frontend – These are the events  which will triggered only for front end section. 

Then we need to register an observer method for particular event.

<event_name>
<observers>
<module_name>
<type>typeOfObserver</type>
<class>Observer Class Name</class>
<method>methodName</method>
</module_name>
</observers>
</event_name>

 

When particular event is triggered related Observer method will execute the code after the specified action.

We can dispatch the events in the following way.

Mage::dispatchEvent(‘eventname’, ‘params Info’);

Example:

eav_entity_attribute_set_save_commit_after

Define the event in the module config file.
app/code/local/Ktree/Eventobservers/etc/config.xml

This event is related to admin  as we are only saving the attributeset from Magento admin  with default installation.  So we need to create event definition under  adminhtml tag in config.xml.

Under config section we need to create a new section with name if it is not exists.

<adminhtml>
<events>
<eav_entity_attribute_set_save_commit_after>
<observers>
<ktree_eventobservers_attribute_save_after>
<type>singleton</type>
<class>Ktree_Eventobservers_Model_Observer</class>
<method>onAttributeSetSave</method>
</ktree_eventobservers_attribute_save_after>
</observers>
</eav_entity_attribute_set_save_commit_after>
</events>
</adminhtml>

 

After defining the event in config.xml  we need to create a  Model  with the following class under the path  app/code/codepool/Namespace/Module/Model/Observer.php

<?php
Class Ktree_Eventobservers_Model_Observer
{
public function onAttributeSetSave($observer) {
//here we need to write our own login based on requirement
// getting the attributeSet Data using $observer Object
$attributeSetData = $observer->getEvent()->getDataObject()->getData();
//retrieving the Attributeset form post Data
$syncStatus = Mage::app()->getRequest()->getParam(‘sync_attr_set_create’);
$attributeSetPostData = Mage::helper(‘core’)->jsonDecode(Mage::app()->getRequest()->getParam(‘data’));
$syncStatus = ($syncStatus) ? $syncStatus : $attributeSetPostData[‘sync_attr_set_create’];
$attrSetId = $attributeSetData[‘attribute_set_id’];
//Saving the Custom data into our model like below
$ktEavAttributeSet = Mage::getModel(‘kteavattributeset/’kteavattributeset);
$ktEavAttributeSet->setAttributeSetId($attrSetId)->setSyncStatus($syncStatus);
$ktEavAttributeSet>save();
return true;
}
}

Few of Magento Events which KTree used in Magento Development.

  1. admin_system_config_section_save_after

    • In this event we can find the changes related to admin configuration  which is in  system-> configuration link. Based on the system configuration value  we can execute the custom code like sending the same value to Other systems  or Validating the custom plugin license with provided Api Key  in config section
  2. admin_session_user_login_success

    • This is the event which we can validate the custom code after successful login of admin user.
  3. adminhtml_widget_container_html_before

    • In this event observer  we can add some extra html code  like buttons to specific widget Area  without overriding the core magento admin blocks.
  4. core_block_abstract_to_html_after
  5. controller_action_layout_generate_blocks_after

    • These are the events where we can inject custom html code to   adminhtml forms and also in the frontend section.
  6. catalog_product_save_before
  7. customer_save_before

    • In this event we can add any other values to object based on other attributes information  and  also we can add server level Validations also.
  8. catalog_product_save_commit_after (Product After Save event)
  9. eav_entity_attribute_set_save_commit_after (AttributeSet After Save event)
  10. catalog_entity_attribute_save_commit_after (Attribute After Save event)
  11. catalog_category_save_commit_after (Category After Save event)
  12. adminhtml_customer_save_after  (Customer Save event)
  13. customer_address_save_after  (Customer Address Save event)

    • Here we can check the related object updated attribute information and we can save the data into other modules/  change history.
  14. catalog_product_delete_after (Product Delete Event)
  15. catalog_controller_product_delete (Product Delete Event)
  16. catalog_controller_category_delete  (Category Delete Event)
  17. catalog_entity_attribute_delete_after (Attribute Delete Event)
  18. eav_entity_attribute_set_delete_after   (AttributeSet Delete Event)
  19. customer_address_delete_after (Customer Address Delete Event)
  20. customer_delete_after (Customer Delete Event)

    • Here we do some login like   removing existing links with other instances.
  21. adminhtml_catalog_product_edit_prepare_form

    • In this event we can inject block of code  after product from elements for displaying information for users.
  22. eav_entity_attribute_set_delete_before

    • In this event  we can find the products related to attribute set and we can perform the same operations like product delete because of all products will remove from Magento if we are going to delete attributeset.
  23. eav_entity_attribute_set_delete_before

    • This is the event which we can use for Mass update of products.  Here we can find what are the attributes are updated and corresponding product ids.
  24. catalog_category_prepare_save
  25. catalog_category_tree_move_before

    • Here we can add custom validations for category save.  Before saving the category we can check same category already exists or not in the current level  as we don’t have category unique in default Magento
  26. catalog_category_tree_move_after

    • In this event we can find the previous and current parents related to the category.
  27. sales_order_save_after

    • In this event We can find the change in Order Status  and we can execute the custom logic based on order status
  28. sales_order_place_after
  29. sales_model_service_quote_submit_after

    • This event will trigger from frontend place order.  We can check any custom payment status and we can save the data into custom database tables for further use.
  30. order_cancel_after
  31. sales_order_creditmemo_save_before

    • This event will trigger when we are cancelling the order from Magento admin.  In this event  we can refund the amounts and adding the ordered product  stock back to  Product.
  32. sales_order_shipment_save_after

    • This will trigger after shipment created  for particular order.  Here we can deduct the related products stock from connected instances like Openerp/MicroBiz on the fly using Apis.
  33. sales_quote_remove_item

    • This will trigger when we are removing an item from cart,  so that we can made necessary changes to cart  if there is any dependent discounts
  34. sales_quote_collect_totals_after

    • If there are any custom discounts after applying the gift cards which is saving in another model,  We are loading the model data in this observer and recalculating the totals
  35. sales_order_payment_refund

    • When we are refunding order we need to check is there any gift card items usied while placing the order, if any we need to revert the amount back to GC.
  36. checkout_controller_onepage_save_shipping_method
  37. checkout_controller_multishipping_shipping_post

    • This event we are using for custom shipping methods which we can find the method is available on the specified date or not  on the fly with third party system.
  38. checkout_multishipping_controller_success_action.

    • This will trigger all the orders are successfully created  in multishipping page.
  39. checkout_type_multishipping_create_orders_single

    • In multi shipping checkout each address will generate single address so that we can find each and every order save using this event in multishipping checkout.
  40. checkout_cart_product_add_after

    • This event will trigger when we are adding single product to cart.  In this event we can add any custom options to product and also we can make changes to product attributes like price configurable options etc
  41. checkout_cart_save_after
  42. checkout_cart_update_items_after
  43. controller_action_predispatch_checkout_cart_updatePost

    • This event will trigger when cart is updated.  So based on cart totals we can add custom discounts based on products available in the cart
  44. sales_quote_load_after
  45. sales_order_load_after
  • These are the events we are using for displaying the custom shipping methods information’s from Other modules in Order view page