16

On a fresh installation of Magento, it comes with several default CMS pages that you can edit in CMS > Pages. However, it also comes with a couple of "non-editable" CMS Pages: Orders and Returns and Contact Us... both of which are pages with forms on them, and highlights a shortcoming in Magento CE: creating and editing forms.

I have managed to override the default Contact Us with my own form, but I would like to add another form, and may need to add more forms in the future. I am somewhat familiar with creating Magento Modules to override existing functions and pages, as I've done thus far.

I have started working on a module that would enable the ability to create form pages in Magento, but they have to be invisible to the CMS management like the default forms are. I have found answers to programmatically creating a CMS page, but that adds it to Magento's CMS > Pages.

How do I create a CMS page that is only editable by a Magento Module?

migrated from stackoverflow.com Apr 19 '13 at 19:13

This question came from our site for professional and enthusiast programmers.

21

Actually 'Contact Us' and 'Orders and returns' are not CMS pages. They are actually pages from a separate module. They are more like the 'Login' or 'Register' page than like CMS pages. To create a page like this you can create a simple module with a controller, one block and one template. Let's call the extension Easylife_Customform. For this you will need the following files.
app/etc/modules/Easylife_Customform.xml - module declaration file

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Customform>
            <active>true</active>
            <codePool>local</codePool>
        </Easylife_Customform>
    </modules>
</config>

app/code/local/Easylife/Customform/etc/config.xml - config file

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Customform>
            <version>0.0.1</version>
        </Easylife_Customform>
    </modules>
    <global>
        <blocks>
            <customform><!-- block alias -->
                <class>Easylife_Customform_Block</class>
            </customform>
        </blocks>
        <helpers>
            <customform><!-- helper alias -->
                <class>Easylife_Customform_Helper</class>
            </customform>
        </helpers>
    </global>
    <frontend>
        <routers>
            <customform>
                <use>standard</use>
                <args>
                    <module>Easylife_Customform</module>
                    <frontName>customform</frontName><!-- url key for module -->
                </args>
            </customform>
        </routers>
        <layout>
            <updates>
                <easylife_customform>
                    <file>easylife_customform.xml</file><!-- frontend layout file -->
                </easylife_customform>
            </updates>
        </layout>
        <translate>
            <modules>
                <Easylife_Customform>
                    <files>
                        <default>Easylife_Customform.csv</default><!-- translation file (not mandatory) -->
                    </files>
                </Easylife_Customform>
            </modules>
        </translate>
    </frontend>
</config>

app/design/frontend/base/default/layout/easylife_customform.xml - frontend layout file

<?xml version="1.0"?>
<layout>
    <customform_index_index translate="label" module="customform">
        <label>Custom form</label>
        <reference name="root">
            <action method="setTemplate"><template>page/2columns-right.phtml</template></action><!-- can be different -->
        </reference>        
        <reference name="content">
            <block type="core/template" name="customform" template="easylife_customform/form.phtml" /><!-- content of page -->
        </reference>
    </customform_index_index>
</layout>

app/code/local/Easylife/Customform/Helper/Data.php - default module helper

<?php
class Easylife_Customform_Helper_Data extends Mage_Core_Helper_Abstract{
}

app/design/frontend/base/default/template/easylife_customform/form.phtml - the actual html for the form - make this look like you need

<form action="<?php echo $this->getUrl('customform/index/send')?>">
    <input type="text" name="name" />
    <input type="submit" />
</form>

app/code/local/Easylife/Customform/controllers/IndexController.php - the module controller

<?php 
class Easylife_Customform_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){ //this will display the form
        $this->loadLayout();
        $this->_initLayoutMessages('core/session'); //this will allow flash messages
        $this->renderLayout();
    }
    public function sendAction(){ //handles the form submit
        $post = $this->getRequest()->getPost();
        //do something with the posted data
        Mage::getSingleton('core/session')->addSuccess($this->__('Your message was sent'));//add success message.
        $this->_redirect('*/*');//will redirect to form page
    }
}

This should be it. Clear the cache and you should be able to access the form at mysite.com/customform
I hope I wrote the code correctly and didn't miss something

  • 2
    you really went the extra mile on this answer. +1 – philwinkle Apr 22 '13 at 4:29
  • @philwinkle: is that good or bad? :) – Marius Apr 22 '13 at 14:29
  • Really great guide Marius, thank you! I am trying to set a page title, the <label> in my layout xml is being ignored and this <reference name="head"> <action method="setTitle" translate="title"><title>Subscribe to our Newsletter</title></action> </reference> won't work. – loeffel Jun 22 '15 at 14:35
  • @loeffel. Maybe you have something else that overrides the title. In theory the code should work. – Marius Jun 22 '15 at 14:37
  • @Marius This is very handy, but how can we add Error Messages? I tried adding Mage::getSingleton('core/session')->addError("Error"); but no luck. Its only showing success message. Any help? – Aamir Siddique May 12 '16 at 15:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.