Como crio uma página Magento CMS não editável?

16

Em uma nova instalação do Magento, ele vem com várias páginas CMS padrão nas quais você pode editar CMS > Pages. No entanto, ele também vem com algumas páginas CMS "não editáveis": Orders and Returnse Contact Us... ambas são páginas com formulários, e destaca uma falha no Magento CE: criação e edição de formulários.

Consegui substituir o Fale Conosco padrão por meu próprio formulário, mas gostaria de adicionar outro formulário e talvez seja necessário adicionar mais formulários no futuro. Estou familiarizado com a criação de módulos Magento para substituir funções e páginas existentes, como fiz até agora.

Comecei a trabalhar em um módulo que permitiria criar páginas de formulário no Magento, mas elas precisam ser invisíveis para o gerenciamento do CMS, como os formulários padrão. Eu encontrei respostas para criar programaticamente uma página do CMS, mas isso a adiciona ao Magento CMS > Pages.

Como crio uma página do CMS que só é editável por um módulo Magento?

andyjv
fonte
Bom saber! É kosher fazer postagens cruzadas ou qual é a prática aceita desde que eu publiquei isso aqui já?
andyjv
Eu clicaria no link "flag" e pediria a um mod para movê-lo para você. De um modo geral, a postagem cruzada é desaprovada.
John Conde
Se você estiver procurando por um formulário de contacto personalizado dentro de uma página CMS, consulte magento.stackexchange.com/questions/79602/... ou mais detalhada stackoverflow.com/q/1066127/664108
Fabian Schmengler

Respostas:

21

Na verdade, 'Fale conosco' e 'Pedidos e devoluções' não são páginas do CMS. Na verdade, são páginas de um módulo separado. Eles são mais parecidos com a página 'Login' ou 'Registrar' do que com páginas do CMS. Para criar uma página como essa, você pode criar um módulo simples com um controlador, um bloco e um modelo. Vamos chamar a extensão Easylife_Customform. Para isso, você precisará dos seguintes arquivos.
app/etc/modules/Easylife_Customform.xml- arquivo de declaração do módulo

<?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 - arquivo de configuração

<?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 - arquivo de layout de front-end

<?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 - auxiliar de módulo padrão

<?php
class Easylife_Customform_Helper_Data extends Mage_Core_Helper_Abstract{
}

app/design/frontend/base/default/template/easylife_customform/form.phtml - o html real do formulário - faça com que pareça necessário

<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 - o controlador do módulo

<?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
    }
}

Deve ser isso. Limpe o cache e você poderá acessar o formulário em mysite.com/customform
Espero ter escrito o código corretamente e não tenha perdido nada

Marius
fonte
2
você realmente fez um esforço extra nesta resposta. 1
philwinkle
@ philwinkle: isso é bom ou ruim? :)
Marius
Realmente ótimo guia Marius, obrigado! Estou tentando definir um título da página, o <label> no meu layout xml está sendo ignorado e isso <reference name="head"> <action method="setTitle" translate="title"><title>Subscribe to our Newsletter</title></action> </reference> não funcionará.
Loeffel
@loeffel. Talvez você tenha algo mais que substitua o título. Em teoria, o código deve funcionar.
Marius
@ Marius Isso é muito útil, mas como podemos adicionar mensagens de erro? Eu tentei adicionar, Mage::getSingleton('core/session')->addError("Error");mas sem sorte. Está apenas mostrando uma mensagem de sucesso. Qualquer ajuda?
Aamir Siddique