How to override Magento model classes?
8 Comments 12th AUG 2009 | Posted by Tomas Novoselic in Magento

Many times we need to implement new functionality of existing Magento core classes, but we don’t want to modify core classes.
For controllers, that’s quite easy. Usually we can copy controller from core and put it in the same place in local directory, modify class and that’s it.
Of course, there are better ways to do that (make module), but I’m not going to write about that right now since it is not subject of this post.
I only mentioned that because we can’t do same thing for models even if we want to, so how to override Magento models without modifying core files?
Fortunately, that’s very easy =)
Let’s make one extension of that kind!
Extension we are going to make will be useless, only difference between this extension and original class will be class name var_dump =)
What we are going to do now is to take a random model class from Magento core.
Let it be Mage_Wishlist_Model_Item located in app/code/core/Mage/Wishlist/Model/Item.php
What we want to do is to add new functionality to that class, so let’s make new module.
Call it Inchoo_Wishlist.
Create app/code/local/Inchoo/Wishlist/model/ directory and copy app/code/core/Mage/Wishlist/Model/Item.php
there.
Now, rename class Mage_Wishlist_Model_Item to Inchoo_Wishlist_Model_Item.
Add this line:
var_dump(get_class($this)); exit();
in loadByProductWishlist method
Now, let’s create Inchoo_Wishlist.xml in app/etc/modules/
Put this code there:
< ?xml version="1.0"?>
<config>
<modules>
<inchoo_wishlist>
<active>true</active>
<codepool>local</codepool>
</inchoo_wishlist>
</modules>
</config>
Now, make app/code/local/Inchoo/Wishlist/etc/Config.xml file and put this code there:
< ?xml version="1.0"?>
<config>
<modules>
<inchoo_wishlist>
<version>0.1</version>
</inchoo_wishlist>
</modules>
<global>
<models>
<wishlist>
<rewrite>
<item>Inchoo_Wishlist_Model_Item</item>
</rewrite>
</wishlist>
</models>
</global>
</config>
You are done! Try to add something to wishlist! =)
Play with other models as well!
Cheers ^_^
To post code in comments, place your code inside [code] and [/code] tags.


















August 12th, 2009 at 16:14
You should use instead of
August 12th, 2009 at 16:15
// lost tags, sorry
You should use “codePool” instead of “codepool”
Magento is case sencitive, you know
August 13th, 2009 at 11:12
@ m4e Tnx for mentioning that! I’m not sure what happened, maybe this code display plugin for wordpress. I’ll check that asap
August 13th, 2009 at 11:15
Hm… it seems that I was right, wordpress plugin turns all tags to small case
August 14th, 2009 at 18:32
Thanks for the effort.
Seems like Branko got it covered already at ActiveCodeline, Overrider module, which shows it nicely how to do it ( http://activecodeline.com/modules/ ).
October 19th, 2009 at 14:15
Please correct xml tags there is a space between opening tag and exclamation sign: “< ?xml"
May 13th, 2010 at 17:48
Does anybody know how to override this magento class
class Mage_Directory_Model_Currency extends Mage_Core_Model_Abstract
{ }
In my config.xml file, I have made the following change:
…..
MyCompany_MyModule_Model_Currency
……
But it is not working! I’m missing something?
Regards,
June 17th, 2010 at 9:05
Worth to mention is that if the class you want to override has a deeper catalog structure then you need to provide the whole path to the element in the config.xml file.
For example, I had to override the password length check in
class
Mage_Customer_Model_Customer_Attribute_Backend_Password
My config file:
*snip*
MyCompany_Customer_Model_Customer_Attribute_Backend_Password
*snip*