Pergunta

Alguém pode fornecer um guia fictício \ trechos de código sobre como criar um formulário front-end em Magento que envia dados para uma ação de controlador.

Eu estou tentando escrever uma variante do contato nos de. (Eu sei que é fácil de modificar o formulário de contato, conforme descrito aqui ). Eu estou tentando também criar um formulário com campos adicionais.

Dada esta forma básica:

<form action="<?php echo $this->getFormAction(); ?>" id="feedbackForm" method="post">   
                <div class="input-box">
                    <label for="name"><?php echo Mage::helper('contacts')->__('Name') ?> <span class="required">*</span></label><br />
                    <input name="name" id="name" title="<?php echo Mage::helper('contacts')->__('Name') ?>" value="<?php echo $this->htmlEscape($this->helper('contacts')->getUserName()) ?>" class="required-entry input-text" type="text" />
                </div>

    <div class="button-set">
        <p class="required"><?php echo Mage::helper('contacts')->__('* Required Fields') ?></p>
        <button class="form-button" type="submit"><span><?php echo Mage::helper('contacts')->__('Submit') ?></span></button>
    </div>
</form>

O que são o passo básico eu preciso tomar para obter o nome introduzido a uma ação do controlador para processamento?

Foi útil?

Solução

Se alguém estiver interessado, eu resolvi isso construindo meu próprio módulo que foi fortemente com base no módulo Magento_Contacts.

Aqui estão alguns links que me ajudaram a descobrir as coisas.

http://www.magentocommerce.com/wiki/custom_module_with_custom_database_table

http://inchoo.net/ecommerce/magento/magento-custom- e-mails /

Outras dicas

Para fazer $this->getFormAction() devolver o URL para o seu controlador personalizado, você tem duas opções:

  1. chamada setFormAction() em outro lugar no bloco.
  2. usar um tipo de bloco personalizado que implementa getFormAction().

(1) é o que acontece em Mage_Contacts_IndexController::indexAction(), mas (2) é a abordagem mais limpa e eu vou explicar em detalhes:

Criar um personalizado módulo

app/etc/modules/Stack_Form.xml:

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

app/code/local/Stack/Form/etc/config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Stack_Form>
            <version>0.1.0</version>
        </Stack_Form>
    </modules>
    <frontend>
        <routers>
            <stack_form>
                <use>standard</use>
                <args>
                    <module>Stack_Form</module>
                    <frontName>feedback</frontName>
                </args>
            </stack_form>
        </routers>
    </frontend>
    <global>
        <blocks>
            <stack_form>
                <class>Stack_Form_Block</class>
            </stack_form>
        </blocks>
    </global>
</config>

Esta configuração registra o alias bloco stack_form para blocos próprios eo nome feedback frente para controladores próprios.

Criar costume bloquear

app/code/local/Stack/Form/Block/Form.php

class Stack_Form_Block_Form extends Mage_Core_Block_Template
{
    public function getFormAction()
    {
        return $this->getUrl('stack_form/index/post`);
    }
}

Aqui nós implementado getFormAction() para gerar a URL para o nosso controlador personalizado (o resultado será BASE_URL / feedback / index / post ).

Criar personalizado controlador

app/code/local/Stack/Form/controllers/IndexController.php

class Stack_Form_IndexController extends Mage_Contacts_IndexController
{
    public function postAction()
    {
        // your custom post action
    }
}

Se o formulário deve se comportar exatamente como o formulário de contato, apenas com um modelo de e-mail diferente e campos de formulários adicionais, existem duas soluções que eu salientei em https://magento.stackexchange.com/q/79602/243 onde apenas um deles requer realmente uma ação de controlador personalizado para enviar o formulário:

Se você olhar para o contatos controlador usado na ação de formulário, você vai achar que

  1. o modelo transacional é levado diretamente a partir da configuração
  2. todos os dados POST é passado para o modelo (como data variável de modelo), de modo que você pode adicionar todos os campos adicionais para a forma template e usá-los no modelo de e-mail. Mas validação é difícil codificado para "nome", "comentário", "email" e "hideit".

Então, se você precisa de um modelo de e-mail completamente diferente ou validação de entrada adicional / alterados, a sua melhor aposta é a de criar um controlador personalizado com uma cópia modificada do postAction de Mage_Contacts_IndexController.

Mas há outra solução que é um pouco limitada, mas sem qualquer código personalizado envolvidos:

  • criar uma entrada escondida que determina o tipo do formulário. Poderia ser apenas <input type="hidden" name="custom" value="1" />.
  • no modelo de e-mail transacional contato, use a diretiva if para mostrar conteúdo diferente com base no tipo de formulário:

    {{if data.custom}}
        ... custom contact form email ...
    {{else}}
        ... standard contact form email ...
    {{/if}}
    

Como usar este bloco personalizado

Você pode adicionar o formulário em qualquer lugar do CMS usando este código (directiva CMS):

{{block type="stack_form/form" template="path/to/your/form.phtml"}}

Se você fizer isso, você precisa adicionar "stack_form / form" para o bloco lista branca sob Sistema> Permissões> Blocos !

Ou no layout usando este código XML (esquema):

<block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />

solução sem costume módulo

Se você usar a solução sem controlador personalizado e um único modelo de e-mail mencionado acima, você pode definir a ação formulário usando XML de layout também.

Para conseguir isso, usamos o recurso para chamar ajudantes como parâmetros para ações de bloqueio. Infelizmente, o ajudante núcleo não tem um método público para obter um URL, mas o ajudante de Mage_XmlConnect tem, assim você pode usar esse:

<block type="core/template" name="any_unique_name" template="path/to/your/form.phtml">
    <action method="setFormAction">
        <param helper="xmlconnect/getUrl">
            <route>contacts/index/post</route>
        </param>
    </action
</block>

Nos CMS Directiva você não pode usar ajudantes, então não seria necessário para colocar o URL real:

{{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}

Uma vez que você provavelmente tem diferentes CMS páginas / blocos em diferentes pontos de vista da loja, isso não deve ser um grande problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top