Magento is based on MVC
model. This model helps for defining models, view (layout + templates)
and controllers. Despite big amount of modules available by
default in Magento and on Magento Connect,
you may want to create your own module and define your controller
for you Magento
website. No problem, this tutorial will explain you how to create
your own controller and how to make it respect its authoritah
to layouts and templates.
Purpose of this example controller will be to give result of
two integers multiplication (very useful if you lost your calculator).
Integers will be provided through a basic form. Result will be displayed
in a Magento notification.
Before starting creation of your module, please turn off the cache
management in order to see immediately every change.
Creating your module
Our extension will be named arithmetic. Folders
needed for this extension are created.
$ mkdir -p app/code/local/Baobaz/Arithmetic/controllers
$ mkdir -p app/code/local/Baobaz/Arithmetic/etc
We create file app/code/local/Baobaz/Arithmetic/etc/config.xml,
in order to register this extension
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<baobaz_arithmetic>
<version>0.0.1</version>
</baobaz_arithmetic>
</modules>
</config>
And a file app/etc/modules/Baobaz_Arithmetic.xml for
its activation:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Baobaz_Arithmetic>
<active>true</active>
<codePool>local</codePool>
</Baobaz_Arithmetic>
</modules>
</config>
For more informations about creation of a new extension, please check Wojtek's
post "Developing
module for Magento Tutorial - Where to Begin [Part 1]".
Creating a controller
You need now to create file app/code/local/Baobaz/Arithmetic/controllers/IntegerController.php
and write method that will be used for multiplication.
Controller files must always follow pattern xxxxxController.php
(xxxxx will be used after in url for calling this controller)
and put in controllers folder.
Controllers methods names must follow pattern yyyyyAction
(yyyyy will also be used in url for calling this controller).
For the moment content of our file is:
class Baobaz_Arithmetic_IntegerController extends Mage_Core_Controller_Front_Action
{
public function multiplyAction(){
}
}
We need to indicate now that some controllers are available
in Arithmetic modules. For doing that, we add the
following content in app/code/local/Baobaz/Arithmetic/etc/config.xml
file:
<config>
...
<frontend>
<routers>
<arithmetic>
<use>standard</use>
<args>
<module>Baobaz_Arithmetic</module>
<frontName>arithmetic</frontName>
</args>
</arithmetic>
</routers>
</frontend>
</config>
Let see how this router declaration works:
- <frontend> indicates that router will be use
in front part of website - <routers> is where you declare all your
routers - <arithmetic> is identifier of this router
- <use>standard</use> can take value standard
(for front part) or admin (for admin part). - <module>Baobaz_Arithmetic</module>
indicates which module contain controller that handles this router - <frontName>arithmetic</frontName> is
router name that will be used in url
We can now modify multiplyAction method for making
it displaying a message:
public function multiplyAction(){
echo "Respect my authoritah";
}
When you call now url http://monsitemagento/arithmetic/integer/multiply
message "Respect my authoritah" will be displayed. Let
dissect this url:
- arithmetic tells that controller is in Baobaz_Arithmetic
module - integer tells that controllers/integerController.php
file must be cehcked - multiply tells that multiplyAction
method must be chosen in this file
Displaying a template
We define which layout file will be used in the module:
<config>
...
<frontend>
...
<layout>
<updates>
<arithmetic>
<file>arithmetic.xml</file>
</arithmetic>
</updates>
</layout>
</frontend>
</config>
We create app/design/frontend/default/default/layout/arithmetic.xml
file in order to define which blocks will be used for controller
that was just made.
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<arithmetic_integer_multiply>
<reference name="root">
<action method="setTemplate">
<template>page/1column.phtml</template>
</action>
</reference>
<reference name="content">
<block type="core/template" name="arithmetic_integer_multiply" template="arithmetic/integer/multiply.phtml"></block>
</reference>
</arithmetic_integer_multiply>
</layout>
Main template used by arithmetic/integer/multiply is page/1column.phtml.
For "content" part of this template, only arithmetic_integer_multiply
block will be displayed. This block does not need any particular
management. It is then set with core/template type that
is default type. Template file used will be arithmetic/integer/multiply.phtml.
Our template is defined, app/design/frontend/default/default/template/arithmetic/integer/multiply.phtml
must then be created. This file will be empty for the moment..
For displaying correctly layout, it must be loaded in controller
public function multiplyAction(){
$this->loadLayout();
$this->renderLayout();
}
Interaction between template and controller
Our template will just have a basic form for providing integers to
multiply
<form action="<?php echo Mage::getUrl('arithmetic/integer/multiply') ?>" method="post">
<fieldset>
<ul>
<li>
<label for="int1">Integer 1</label>
<input type="text" id="int1" name="int1" />
</li>
<li>
<label for="int2">Integer 2</label>
<input type="text" id="int2" name="int2" />
</li>
<li><input type="submit" value="Multiply" /></li>
</ul>
</fieldset>
</form>
Action form url is again arithmetic/integer/multiply.
Controller action must then be modified in order to manage
data from form and to give result.
public function multiplyAction(){
if ($this->getRequest()->isPost()){
$int1 = $this->getRequest()->getPost('int1');
$int2 = $this->getRequest()->getPost('int2');
$result = $int1 * $int2;
Mage::getSingleton('customer/session')->addSuccess("$int1 * $int2 = $result");
}
$this->loadLayout();
$this->_initLayoutMessages('customer/session');
$this->renderLayout();
}
In order to know if controller is called after using form,
following instruction is used:
$this->getRequest()->isPost()
Result is put in 'customer/session' session. For
being able to display this result in template, message template must be
loaded in multiplyAction method:
$this->_initLayoutMessages('customer/session');
Add then in you template the following line where you want to display
the result
echo $this->getMessagesBlock()->getGroupedHtml();
And here we are: we have now a new controller that displays
result of a multiplication.
All files used in this tutorial are available in baobaz_arithmetic.tar.gz
archive.