Magento: Creating an event to extend customer creation in magento - magento

So I am simply trying to create a hook into registrations predispatch event. This is what I have so far:
config.xml:
<events>
<controller_action_predispatch_customer_account_createpost>
<observers>
<mymodulename>
<class>mymodulename/observer</class>
<method>hookToAccountCreationBefore</method>
</mymodulename>
</observers>
</controller_action_predispatch_customer_account_createpost>
</events>
and the observer:
Model/Observer.php :
public function hookToAccountCreationBefore($observer) {
die('getting here');
}
So I go and do a registration and I see the controller_action_predispatch_customer_account_createpost event getting called in my event logs but its not calling my function.
Please help!
UPDATE:
The answer below worked perfectly for me. However, $observer->getEvent()->getCustomer() is getting NULL for me even though another observer is overriding the same exact event and this works fine. I've tried temporarily commenting out the observer config for the other extension and its still empty. Any ideas?

In your config.xml you could also do
config.xml:
<global>
<models>
<mymodulename>
<class>MyNamespace_MyModuleName_Model</class>
</mymodulename>
</models>
<events>
<controller_action_predispatch_customer_account_createpost>
<observers>
<mymodulename>
<type>singleton</type>
<class>mymodulename/observer</class>
<method>hookToAccountCreationBefore</method>
</mymodulename>
</observers>
</controller_action_predispatch_customer_account_createpost>
</events>
</global>
or
<global>
<events>
<controller_action_predispatch_customer_account_createpost>
<observers>
<mymodulename>
<type>singleton</type>
<class>MyNamespace_MyModuleName_Model_Observer</class>
<method>hookToAccountCreationBefore</method>
</mymodulename>
</observers>
</controller_action_predispatch_customer_account_createpost>
</events>
</global>

Maybe try with following Event
customer_register_success

Related

How to Fetch OrderId After checkout in Magento

Hello I am creating a Observer in Magento to fetch OrderId
i have created an event name as in my config.xml
logically this event has to run after checkout
but in my case this event is running once i clicked on ADD TO CART
here is my config.xml file
<events>
<sales_quote_save_after>
<observers>
<salesorder>
<class>IlexSquare_SalesOrder_Model_Observer</class>
<method>salesOrder</method>
</salesorder>
</observers>
</sales_quote_save_after>
</events>
here is My Observer
class IlexSquare_SalesOrder_Model_Observer
{
public function salesOrder($observer)
{
die('7878');
}
}
But this die is running whenever i click on Add to Cart .. m missing something.
Please Help
After trying certain solution i got my answer
<events>
<checkout_type_onepage_save_order_after>
<observers>
<salesorder>
<class>IlexSquare_SalesOrder_Model_Observer</class>
<method>salesOrder</method>
</salesorder>
</observers>
</checkout_type_onepage_save_order_after>
</events>
just add this section in <frontend>tag instead of writing in <global> tag.

Magento - Getting 'getLastRealOrderId' once order has been placed

Once an order is placed in my magento store I have a custom module so that i can save the order number into an external database table.
My custom module setup is:
Custom/ExternalOms/config.xml
So i hook into the sales_order_place_after event
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Custom_ExternalOms>
<version>0.0.1</version>
</Custom_ExternalOms>
</modules>
<global>
<models>
<custom_externaloms>
<class>Custom_ExternalOms_ExternalOms</class>
</custom_externaloms>
</models>
<events>
<sales_order_place_after>
<observers>
<custom_externaloms>
<type>model</type>
<class>Custom_ExternalOms_Model_ExternalOms</class>
<method>exportToOMS</method>
</custom_externaloms>
</observers>
</sales_order_place_after>
</events>
</global>
</config>
Custom/ExternalOms/Model/ExternalOms.php
and run my function:
class Custom_ExternalOms_Model_ExternalOms extends Mage_Core_Model_Abstract
{
public function exportToOMS()
{
$_order_number = Mage::getSingleton('checkout/session')->getLastRealOrderId();
// remaining code..
}
}
The code runs once the order has been placed correctly but this:
Mage::getSingleton('checkout/session')->getLastRealOrderId();
Is coming up empty
Replace your event by this code
<events>
<sales_order_place_after>
<observers>
<custom_externaloms>
<type>model</type>
<class>externaloms/externalOms</class>
<method>exportToOMS</method>
</custom_externaloms>
</observers>
</sales_order_place_after>
</events>
ExternalOms file by this
class Custom_Externaloms_Model_ExternalOms {
public function exportToOMS($observer)
{
$observer->getOrder();
// remaining code..
}
}
/* in case $observer->getOrder(); will not work than use
Mage::getSingleton('checkout/session')->getLastOrderId(); for getting last order id and load order
*/
I hope it will work

Magento : controller_action_predispatch is not working

I am trying to create controller_action_predispatch event:
This is my Mbyte/Pushnotification/etc/config.xml file code
<events>
<controller_action_predispatch_mbyte_pushnotification_index_index>
<observers>
<Mbyte_Pushnotification>
<class>Mbyte_Pushnotification/Observer</class>
<method>indexPreDispatch</method>
</Mbyte_Pushnotification>
</observers>
</controller_action_predispatch_mbyte_pushnotification_index_index>
</events>
My controller code : Mbyte/Pushnotification/controllers/IndexController.php file code
class Mbyte_Pushnotification_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
Mage::log('Run',null,'log.log');
}
}
Observer file code:
class Mbyte_Pushnotification_Model_Observer {
public function indexPreDispatch($observer)
{
Mage::log('Check',null,'observer.log');
}}
controller_action_predispatch is not working.
Is there something i am doing wrong?
The event triggered should be
controller_action_predispatch_pushnotification_index_index
instead of
controller_action_predispatch_mbyte_pushnotification_index_index
in case you did not modify the frontend name ("pushnotification") of your controller.
Therefore you have to update your config.xml to
<events>
<controller_action_predispatch_pushnotification_index_index>
<observers>
<Mbyte_Pushnotification>
<class>Mbyte_Pushnotification_Model_Observer</class>
<method>indexPreDispatch</method>
</Mbyte_Pushnotification>
</observers>
</controller_action_predispatch_pushnotification_index_index>
</events>
you could also write
<events>
<controller_action_predispatch_pushnotification_index_index>
<observers>
<Mbyte_Pushnotification>
<class>pushnotification/observer</class>
<method>indexPreDispatch</method>
</Mbyte_Pushnotification>
</observers>
</controller_action_predispatch_pushnotification_index_index>
</events>
if you named your module "pushnotification", which i assume.
According to magento define event depends should be
controller_action_predispatch_frontName_Controller_Youaction
it is define like:
Mage::dispatchEvent('controller_action_predispatch_' . $this->getFullActionName(),
array('controller_action' => $this));

Magento Enterprise CatalogEvent

I'm working on an extension that will receive CatalogEvent information from Magento (Enterprise) when saved and do custom processing on the information.
Here's the code I use to listen to the event:
<?xml version="1.0"?>
<config>
<global>
<models>
<mage4ucustomredirect>
<class>Mage4u_Customredirect</class>
</mage4ucustomredirect>
</models>
<events>
<enterprise_catalogevent_event>
<observers>
<abc>
<type>singleton</type>
<class>Mage4u_Customredirect_Model_Observer</class>
<method>on_enterprise_catalogevent_event</method>
</abc>
</observers>
</enterprise_catalogevent_event>
</events>
</global>
</config>
and this is the observer:
class Mage4u_Customredirect_Model_Observer
{
public function on_enterprise_catalogevent_event(Varien_Event_Observer $observer)
{
Mage::log( "on_enterprise_catalogevent_event" );
}
}
?>
When I save the CatalogEvent, I do not receive the call. Can you spot any problems with my code?
Your observer isn't called, because enterprise_catalog_event is a model, but not an event.
See app/code/core/Enterprise/CatalogEvent/etc/config.xml:
<config>
:
<global>
<models>
<enterprise_catalogevent>
<class>Enterprise_CatalogEvent_Model</class>
<resourceModel>enterprise_catalogevent_resource</resourceModel>
</enterprise_catalogevent>
<enterprise_catalogevent_resource>
:
<entities>
<event>
<table>enterprise_catalogevent_event</table>
</event>
:
</entities>
</enterprise_catalogevent_resource>
</models>
:
</global>
:
</config>
Afaik enterprise_catalogevent/event does not dispatch its own save events, but you could observe the generic model_save_before or model_save_after event, to receive callbacks whenever such model is being created/saved.
You just need to identify the object being passed to these generic events first:
$oObject = $observer->getEvent()->getObject();
if ($oObject instanceof Enterprise_CatalogEvent_Model_Event) {
if ($oObject->isObjectNew()) {
// it is/was a create
else {
// it is/was a save
}
}
Please try this:
<events>
<enterprise_catalogevent_event>
<observers>
<mage4u_customredirect_model_observer>
<type>singleton</type>
<class>Mage4u_Customredirect_Model_Observer</class>
<method>on_enterprise_catalogevent_event</method>
</mage4u_customredirect_model_observer>
</observers>
</enterprise_catalogevent_event>
</events>

Why does my Magento observer get stuck in and endless loop?

My observer gets stuck in and endless loop. Why does it happen and how can I fix it?
config.xml:
<?xml version="1.0"?>
<config>
<global>
<models>
<shipmentsave>
<class>Company_Shipmentsave_Model</class>
</shipmentsave>
</models>
</global>
<adminhtml>
<events>
<sales_order_shipment_track_save_after>
<observers>
<shipmentsave>
<type>model</type>
<class>shipmentsave/observer</class>
<method>salesOrderShipmentTrackSaveAfter</method>
</shipmentsave>
</observers>
</sales_order_shipment_track_save_after>
<sales_order_shipment_save_after>
<observers>
<shipmentsave>
<type>model</type>
<class>shipmentsave/observer</class>
<method>salesOrderShipmentSaveAfter</method>
</shipmentsave>
</observers>
</sales_order_shipment_save_after>
</events>
</adminhtml>
<frontend>
<events>
<sales_order_shipment_save_after>
<observers>
<shipmentsave>
<type>singleton</type>
<class>shipmentsave/observer</class>
<method>salesOrderShipmentSaveAfter</method>
</shipmentsave>
</observers>
</sales_order_shipment_save_after>
</events>
</frontend>
</config>
Observer.php:
class Company_Shipmentsave_Model_Observer
{
public function salesOrderShipmentSaveAfter(Varien_Event_Observer $observer)
{
error_log("My observer called ....",0);
$shipment = $observer->getEvent()->getShipment();
$order = $shipment->getOrder();
$track = Mage::getModel('sales/order_shipment_track')
->setNumber('1231354564')
->setCarrierCode('localdelivery')
->setTitle('Aramex');
$shipment->addTrack($track);
$shipment->save();
return;
}
}
Your observer waits for a shipment to get saved, then saves a shipment, which causes it to receive another event (yadda yadda ad nauseum). You will need a way to either escape the loop or not have to save a shipment.
Can you move your event onto sales_order_shipment_save_before and then allow the normal shipment saving to take effect, or do you need the shipment to already have been saved to do your part of the logic?
If so, change the following line on your observer so that Magento uses it as a singleton:
<type>singleton</type> // changed from model
Then, create a variable in your class to track whether you've recursed yet. If so, then just return.
Alternatively, you could check to see if there are any tracking numbers already on the shipment and only save if there are not (and you add one). That will kill the recursion as well.
Let me know if one of those works for you.
Thanks,
Joe
I used
sales_order_shipment_save_after
and its working for me
Thanks :)

Resources