How to extend Magento core controller?
来源:互联网 发布:js dom教程 阮一峰 编辑:程序博客网 时间:2024/06/03 09:22
Just as with models/blocks/helpers, there are times when we want to change the way a core Magento controller works. Since we DON'T EVER WANT TO CHANGE THE CORE, we need a way to tell a request to use OUR controller instead of Magento's controller. We do this by changing the configurations that hold the routing instructions.
Many MVC frameworks use the concept of a route to tell the application how to map the URL to the correct controller/action. Magento has part of that mapping in the config.xml. Below is an example of a common route configuration for the frontend.
<
frontend
>
<
routers
>
<
awesome
>
<
use
>standard</
use
>
<
args
>
<
module
>Super_Awesome</
module
>
<
frontName
>awesome</
frontName
>
</
args
>
</
awesome
>
</
routers
>
</
frontend
>
With that frontend route, a url that looks like this: http://example.com/awesome/noun/verb will be routed to the NounController's verbAction() inside the Super_Awesome module.
In our example, I want to dispatch an event at the beginning of the indexAction(), but I don't want to make ANY other changes. To do this, I will have to create my controller that extends the Mage_Checkout_OnepageController and override the indexAction().
But how do I tell Magento to use my controller instead of Mage_Checkout_OnepageController? Well, that is the point of this post.
First, we need to create our controller:
<?php
require_once
'Mage/Checkout/controllers/OnepageController.php'
;
class
Super_Awesome_OnepageController
extends
Mage_Checkout_OnepageController
{
public
function
indexAction()
{
Mage::dispatchEvent(
'awesome_event'
,
array
(
'piece of data'
));
parent::indexAction();
}
}
The require_once is important. If you don't do this, your code will blow up. How we need to tell Magento to change it's route mappings.
Here is the piece of the config.xml where we do just that -
<
frontend
>
<
routers
>
<
checkout
>
<
use
>standard</
use
>
<
args
>
<
modules
>
<
Super_Awesome
before
=
"Mage_Checkout"
>Super_Awesome</
Super_Awesome
>
</
modules
>
</
args
>
</
checkout
>
</
routers
>
</
frontend
>
If we were to write this in English, it would simply say, "When a request comes in with "checkout" as the module, first look for whatever controller it is requesting in Super_Awesome before looking in Mage_Checkout. If you don't find it in Super_Awesome, fall back on Mage_Checkout".
For this to work, the Controller has to be named the same.
If you are wanting to reroute an adminhtml controller, you would use the same concept. If I have a module called Super_Awesome, I tend to create a Adminhtml directory under controllers to house any of my Admin controllers. The directory structure would be: Super/Awesome/controllers/Adminhtml/NounController.php.
So in the config.xml, I would have something equivalent to:
<
admin
>
<
routers
>
<
adminhtml
>
<
args
>
<
modules
>
<
awesome
before
=
"Mage_Adminhtml"
>Super_Awesome_Adminhtml</
awesome
>
</
modules
>
</
args
>
</
adminhtml
>
</
routers
>
</
admin
>
...and now you know how to rewrite/reroute requests to different controllers.
- How to extend Magento core controller?
- How to extend Magento Order Grid?
- How to overload controller in Magento?
- Magento: How to get controller, module, action and router name?
- How to overload a controller
- How to remove ActiveX Controller
- How to Extend Django User Model
- How to Import Products into Magento
- How to get current date in magento?
- How to use getBodyClass() in magento?
- How to create custom price in Magento?
- How to import products into Magento?
- [Magento] How to add new fields?
- [Magento] How to generate EXCEL report
- How to create Magento invoice from order
- How To Install A Downloaded Magento Theme
- How to close Magento store for maintenance?
- How to override Magento model classes?
- Oracle中的break和continue
- 在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数[#63]。
- web service hacking
- Code review和Case review
- RSA host key has changed 错误
- How to extend Magento core controller?
- notepad++中配置python IDE
- delphi,IOCP之内存分配池[1]
- Widget总结
- 2011年Android先生
- DEV-C++对c文件提示无法编译的问题
- 脏读 幻读 不可重复读 及其解决方法
- 回调函数
- 升级Fedora 16 与安装Ubuntu 11.04