formulários personalizados no Magento
-
21-08-2019 - |
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?
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:
- chamada
setFormAction()
em outro lugar no bloco. - 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
- o modelo transacional é levado diretamente a partir da configuração
- 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
deMage_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.