0
votes

My observer does not seem to be catching events emitted by Magento v1.12.0.2. I'm following a tutorial very closely from http://inchoo.net/ecommerce/magento/dispatching-before-and-after-events-to-magento-core-actions/ and cannot seem to reproduce.

app/etc/modules/Require_Additional_Product.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <RequireAdditionalProduct>
            <active>true</active>
            <codePool>local</codePool>
        </RequireAdditionalProduct>
    </modules>
</config>

app/code/local/Hatclub/RequireAdditionalProduct/etc/config.xml:

<modules>
    <RequireAdditionalProduct>
        <version>1.0.0</version>
    </RequireAdditionalProduct>
</modules>

<global>

    <models>
        <dispatcher>
            <class>Hatclub_RequireAdditionalProduct_Model</class>
        </dispatcher>
    </models>

    <events>

         <!-- Hooking to Magento's default event "controller_action_predispatch" -->
        <controller_action_predispatch>
            <observers>
                <controller_action_before>
                    <class>dispatcher/observer</class>
                    <method>hookToControllerActionPreDispatch</method>
                </controller_action_before>
            </observers>
        </controller_action_predispatch>

        <!-- Hooking to Magento's default event "controller_action_postdispatch" -->
        <controller_action_postdispatch>
            <observers>
                <controller_action_after>
                    <class>dispatcher/observer</class>
                    <method>hookToControllerActionPostDispatch</method>
                </controller_action_after>
            </observers>
        </controller_action_postdispatch>

        <!-- Hooking to our own event "add_to_cart_before" -->
        <add_to_cart_before>
            <observers>
                <add_to_cart_before>
                    <class>dispatcher/observer</class>
                    <method>hookToAddToCartBefore</method>
                </add_to_cart_before>
            </observers>
        </add_to_cart_before>

        <!-- Hooking to our own event "add_to_cart_after" -->
        <add_to_cart_after>
            <observers>
                <add_to_cart_after>
                    <class>dispatcher/observer</class>
                    <method>hookToAddToCartAfter</method>
                </add_to_cart_after>
            </observers>
        </add_to_cart_after>

    </events>

</global>

app/code/local/Hatclub/RequireAdditionalProduct/Model/Observer.xml:

class Hatclub_RequireAdditionalProduct_Model_Observer {

    //this is hook to Magento's event dispatched before action is run
    public function hookToControllerActionPreDispatch($observer)
    {

        error_log('test 1', 0);

        //we compare action name to see if that's action for which we want to add our own event
        if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add')
        {
            //We are dispatching our own event before action ADD is run and sending parameters we need
            Mage::dispatchEvent("add_to_cart_before", array('request' => $observer->getControllerAction()->getRequest()));
        }

    }

    public function hookToControllerActionPostDispatch($observer)
    {
        error_log('test 1', 0);

        //we compare action name to see if that's action for which we want to add our own event
        if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add')
        {
            //We are dispatching our own event before action ADD is run and sending parameters we need
            Mage::dispatchEvent("add_to_cart_after", array('request' => $observer->getControllerAction()->getRequest()));
        }
    }

    public function hookToAddToCartBefore($observer)
    {
        error_log('test 1', 0);

        //Hooking to our own event
        $request = $observer->getEvent()->getRequest()->getParams();

        // do something with product
        Mage::log("Product ".$request['product']." will be added to cart.");
    }

    public function hookToAddToCartAfter($observer)
    {   
        error_log('test 1', 0);

        // Hooking to our own event
        $request = $observer->getEvent()->getRequest()->getParams();

        // do something with product
        Mage::log("Product ".$request['product']." is added to cart.");
    }

}

I'm simply trying to get output so that I know the observer is catching the event (through the use of php error_log, and Mage::log). Neither are outputting anything, so it seems that this is not working at all. Can anyone spot where I'm going wrong?

1
It is a bad idea to use class alias dispatcher. Class alias should be <vendor_name>_<module_name> in lower case.Dmytro Zavalkin

1 Answers

5
votes

The xpath from your module registration file is incorrect for your module config file.

<?xml version="1.0"?>
<config>
    <modules>
        <!--
            this node name along with codePool value is how your module's
            config.xml file will be located.
        -->
        <Hatclub_RequireAdditionalProduct>
            <active>true</active>
            <codePool>local</codePool>
        </Hatclub_RequireAdditionalProduct>
    </modules>
</config>

See Mage_Core_Model_Config::loadModulesConfiguration() (link) for more insight.