Magento Tutorials

How to create a Magento 1.9 Custom Module

We have many free and paid modules available for Magento. However, if you need to make changes in it or the module is not fulfilling your requirements for more functionalities, you must have basic knowledge about how they are created and how they work, etc.

For example, you should know where to place the files, what is the sequence of calling methods and functions or scripts, and so on.

So now, we are starting this basic tutorial for creating a simple module which will help us understand the structure of Magento modules so you can learn to modify modules to suit your needs. In this tutorial, we will introduce the coding mechanism of Magento modules which will simply help us write a log file every time a product is saved.

Before we start:

As a newbie Magento developer, this is the first thing to understand and learn: Disable the Cache. You can do this by going to Admin Panel > System > Cache Management > Select All > Actions: Disable > Submit

The Directories:

So let’s start with the basic structure, the core files and codes of Magento which can be found in the app/code directory. The app/code/core contains the functionalities for products, categories, customers, payments, etc. The modules that have been provided by third parties (i.e. not Magento’s Core Team) can be found in the app/code/community directory. There is an empty directory as well that is the app/code/local directory. This the place where we are going to work.

Structuring the Directory:

The first step is to create the necessary directories which we will be using. Navigate to the app/code/local directory to add some new files and folders.

Module Namespace: The first directory we will create is a “namespace.” This can be anything like company’s, author’s or developer’s name for the module. Magento uses “Mage” as its namespace, we are going to use the same as our namespace. So, create the directory app/code/local/Mage.
Module Name: Next directory is a name of the module. The module we are creating in this tutorial will write a log entry each time a product is saved, so the logical and matching name would be ProductLogUpdate. Create the directory app/code/local/Mage/ProductLogUpdate.

Now, we should see the structure of our module in the following sequence. But remember! These file and folder names are case-sensitive, make sure you pay attention towards it:

Magento Custom Module

Module Configuration:

Next is to configure our module as per requirements. The configuration files can be found inside our module’s directory i.e. ProductLogUpdate in a directory named as etc. So lets create it along with a new XML file:
This XML will inform Magento about the location of the module and the files inside our module as well as other things like version of the module, events to observe, models etc. The config.xml file contains the following initial code:

<config> Root node for Magento module configuration.
<modules> Contains basic information about Magento module.
<Mage_ProductLogUpdate> NameSpace_ModuleName This should be exactly same as the namespace and the module name separated by an underscore.
<version> Version of module.

Activation of Module:

Now we are going to inform Magento that our module exists which we do by creating a new XML file in app/etc/modules. The name of this file can be anything but for our ease, we are going to name this file with namespace and the module name separated by underscore keeping case-sensitivity in mind. Let’s create app/etc/modules/Mage_ProductLogUpdate.xml with the following content:

<active> Whether our module is active: true or false.
<codePool> Which code pool to use: core, community or local.

Now we have a fully functional module that is enabled in Magento. To check it out, log into the Magento Admin Panel and navigate to System > Configuration > Advanced > Advanced and view the Disable Module Output listing. We should see our Mage_ProductLogUpdate module. If not, kindly carefully run through the steps again and diagnose the mistakes. Now, our module’s structure looks like:

Magento Module Development

Event Observer:

After installation, activation and checking of the module, we are moving further to complete our task. For this, we are using an Event Observer. Event observers are the best way to extend Magento’s functionalities without having to rewrite or override any core classes, methods or functions. Here in this module, we are going to observe the event whenever a product is saved. So the code of the event we are interested in is catalog_product_save_after.
(Determining which event code to use when defining an observer, you have to get an idea and basic understanding about the Magento Model Layers)

We are now going to modify our config.xml to include the event observer:

<global> Configure our module’s behavior in the global scope.
<events> Defining an event observer.
<catalog_product_save_after> The code of the event we want to observe.
<observers> Defining an observer for this event.
<mage_productlogupdate> Unique identifier within the catalog_product_save_after node. By convention, we write the module’s name in lowercase.
<class> The model to be instantiated.
<method> The method of the class to be called.
<type> The type of class to instantiate.

Model’s Directory:

In the event observer, we had made a reference to our model’s class mage_productlogupdate/observer and method logUpdate that we have not yet created. First, we need to inform Magento about the model of our module by updating config.xml with the following:

<models> Defining models.
<mage_productlogupdate> Unique identifier in the model’s node. By convention, we put the module’s name in lowercase.
<class> The path to our models directory, with directory separators replaced by underscores.

Now we will be creating our model which will be instantiated when the event is dispatched. Create a new PHP file in app/code/local/Mage/ProductLogUpdate/Model/Observer.php with the following content:

We are done, Hurray!

Finally, our module is complete. It’s time to try it. Log into your Magento Admin Panel, create or update a product and then check the var/log folder to see your product-updates.log file populated.

If nothing appears or the directory doesn’t exist, ensure that the sufficient permissions are granted to Magento to write on this directory and also check that logging is enabled in Admin Panel > System > Configuration > Developer > Log Settings > Enabled.

The final directory structure of our complete module should now look like this:
Magento Module

About Fayyaz Khattak

Fayyaz is a Magento Community Manager at Cloudways - A Managed Magento Hosting Platform. He writes about Magento Tutorials at Magenticians as well as share his knowledge with the Magento Community. Fayyaz is a food lover and enjoys driving. You can email him at

  • Stay Connected:
  • Bruno Brandão

    Really good article! I adapted the code to create a module with another Magento event and everything works fine!

  • pulkitshah

    good example to understand basics