I had explained a way to add extra controllers to existing route. Here I am going to explain another method which is used for overriding controllers and actions. Like my each post on tips & tricks, I am going to first explain where the trick is applicable! I am considering that readers of this post are aware of MVC architecture in Magento.
Let me explain the difference between the both tricks. The trick explained in previous post is used when we need additional URLs in same route i.e. additional controllers and actions. I have already explained an example there. Here we need to change the behavior of existing controller and action. For example, when a customer adds a product to shopping cart,
Of course, this too can be done just by simple XML configuration (apart from creating custom controllers and actions) but without using route rewriting approach! Let's take a same example above where we want to override action for
Simple isn't it? Now let's understand how it works. The work flow of this rewrite process is little bit tricky.
-By Parthiv PatelLet me explain the difference between the both tricks. The trick explained in previous post is used when we need additional URLs in same route i.e. additional controllers and actions. I have already explained an example there. Here we need to change the behavior of existing controller and action. For example, when a customer adds a product to shopping cart,
addAction
of CartController
of Mage_Checkout
module is called. If we want to override this by My_Checkout
, MycartController
, myaddAction
as similarly as we can override Models and Blocks in our own modules. So the the trick in previous post is used for overloading while the trick here is used for overriding.Of course, this too can be done just by simple XML configuration (apart from creating custom controllers and actions) but without using route rewriting approach! Let's take a same example above where we want to override action for
checkout/cart/add
. First create My_Checkout
module with MycartController
class and myaddAction
method defined within it. The way to do this is better explained in this wiki. Then the configuration required in etc/config.xml
of My_Checkout
module is like below:<global>
<routers>
<checkout> <!-- Mage_Checkout module -->
<rewrite>
<cart> <!-- CartController -->
<to>mycheckout/mycart</to> <!-- My_Checkout module, MycartController -->
<override_actions>true</override_actions>
<actions>
<add> <!-- addAction -->
<to>mycheckout/mycart/myadd<to> <!-- My_Checkout/MycartController/myaddAction -->
</add>
</actions>
</cart>
</rewrite>
</checkout>
</routers>
</global>
Here we also need configuration to define module front name for My_Checkout
module as below:<frontend> <!-- It will be admin for overriding admin controller -->
<routers>
<mycheckout>
<use>admin</use>
<args>
<module>My_Checkout</module>
<frontName>mycheckout</frontName>
</args>
</mycheckout>
</routers>
</frontend> <!-- It will be admin for overriding admin controller -->
Note: The above configuration examples only display portions of config.xml
file. Please do not consider it as a complete configuration.Simple isn't it? Now let's understand how it works. The work flow of this rewrite process is little bit tricky.
- When an
checkout/cart/add
action is going to be dispatched, first it is passed through rewrite process. - Rewrite process tries to find
global/routers/checkout/rewrite/cart
node is found in configuration, wherecheckout
is front name ofMage_Checkout
module andcart
indicates
.Mage_Checkout_
CartController - If this node is not found, rewrite process is not be continued and returned to dispatch process. So the action is executed normally. Otherwise, rewrite process is continued.
- Now, under this node, it tries to find whether
override_actions
node istrue
orfalse
. By default value ofoverride_actions
is true. So if it is not added in configuration, it is considered as true. - If
override_actions
istrue
, it overrides all actions ofMage_Checkout_CartController
with same actions ofMy_Checkout_MycartController
as defined byto
node valuemycheckout/mycart
. For example, if we have definedaddAction
andindexAction
methods insideMy_Checkout_MycartController
, then it automatically overrides bothaddAction
andindexAction
ofMage_Checkout_CartController
. In short usingto
node andoverride_actions
node we can override whole controller instead of individual actions. - If
actions/add
node is defined where,add
indicatesaddAction
ofMage_Checkout_CartController
, thenoverride_actions
node value is not considered and overrides action by value ofactions/add/to
node which ismycheckout/mycart/myadd
i.e.My_Checkout
module, My_Checkout_Mycontroller
andmyaddAction
. So we can also override individual actions by this type of configuration.
Parthiv Patel
Bhaishri Info Solution
Sr. PHP Developer
Limdi Chowk, AT PO. Nar, Di. Anand
Nar, Gujarat
388150
India
pparthiv2412@gmail.com
7383343029
DOB: 12/24/1986
No comments:
Post a Comment