Forms Magento中的自定义表单
任何人都可以提供关于如何在Magento中创建将数据发布到控制器操作的前端表单的虚拟指南\代码片段 我想写一个变体的联系我们。(我知道修改“联系我们”表格很容易,如所述)。我还试图创建一个带有附加字段的反馈表单 鉴于这一基本形式:Forms Magento中的自定义表单,forms,magento,controller,php,Forms,Magento,Controller,Php,任何人都可以提供关于如何在Magento中创建将数据发布到控制器操作的前端表单的虚拟指南\代码片段 我想写一个变体的联系我们。(我知道修改“联系我们”表格很容易,如所述)。我还试图创建一个带有附加字段的反馈表单 鉴于这一基本形式: <form action="<?php echo $this->getFormAction(); ?>" id="feedbackForm" method="post"> <div class=
<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>
如果有人感兴趣,我通过构建自己的模块解决了这个问题,该模块主要基于Magento_联系人
模块
以下是一些帮助我解决问题的链接
要使$this->getFormAction()
将URL返回到自定义控制器,您有两个选项:
在块的其他地方调用setFormAction()
李>
使用实现getFormAction()
的自定义块类型
(1) 是在Mage\u Contacts\u IndexController::indexAction()
中发生的事情,但是(2)是更干净的方法,我将详细解释它:
创建自定义模块
app/etc/modules/Stack\u Form.xml
:
<?xml version="1.0"?>
<config>
<modules>
<Stack_Form>
<active>true</active>
<codePool>local</codePool>
</Stack_Form>
</modules>
</config>
<?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>
此配置为自己的块注册堆栈\u表单
块别名,并为自己的控制器注册反馈
前端名称
创建自定义块
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`);
}
}
在这里,我们实现了getFormAction()
来为我们的定制控制器生成URL(结果将是BASE\u URL/feedback/index/post)
创建自定义控制器
app/code/local/Stack/Form/controllers/IndexController.php
class Stack_Form_IndexController extends Mage_Contacts_IndexController
{
public function postAction()
{
// your custom post action
}
}
如果表单的行为与联系人表单完全相同,只是使用了不同的电子邮件模板和其他表单字段,那么我已经介绍了两种解决方案,其中只有一种实际需要自定义控制器操作来发送表单:
如果你看
在表单操作中使用,您将发现
事务模板直接从配置中获取
所有POST数据都会传递到模板(作为模板变量data
),以便您可以向表单中添加任何其他字段
模板,并在电子邮件模板中使用它们。但验证很难
编码为“姓名”、“评论”、“电子邮件”和“隐藏”
因此,如果您需要完全不同的电子邮件模板或
附加/更改的输入验证,最好是创建
带有的postAction
修改副本的自定义控制器
Mage\u Contacts\u IndexController
但还有另一种解决方案有点有限,但没有任何限制
涉及的自定义代码:
- 创建确定表单类型的隐藏输入。它可能只是
- 在联系人事务性电子邮件模板中,使用
if
指令根据表单类型显示不同的内容:
{{if data.custom}}
... custom contact form email ...
{{else}}
... standard contact form email ...
{{/if}}
如何使用此自定义块
您可以使用以下代码(CMS指令)在CMS中的任何位置添加表单:
如果您这样做,您需要将“stack_form/form”添加到系统>权限>块下的块白名单中
或在布局中使用此代码(布局XML):
在CMS指令中,您不能使用helpers,因此您需要在其中输入实际URL:
{{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}
由于您可能在不同的商店视图中有不同的CMS页面/块,这应该不是什么大问题。我尝试了您的教程伙伴,但我只看到一个空页面!我是否必须在公共函数postAction()中包含任何内容?我创建了app\design\frontend\base\default\template\contacts\form.phml的stack_form.phtml副本,并尝试了{{block…在新的cms页面中是的,postAction方法必须包含您的自定义代码,以便从表单输入创建电子邮件并向用户显示成功消息。如上所述,这可以是Mage_Contacts_IndexController的postAction的修改副本。我添加了它,但具有相同的结果…getFormAction函数如何?这可以吗空?我现在得到一个致命错误:调用成员函数setFormAction()在第55行的app/code/core/Mage/Contacts/controllers/IndexController.php中的布尔值上
OK我必须将块堆栈列为白名单\u表单/form我的反馈表单:如何在所有页面中显示,包括主页@dant第一个链接现在重定向到他们的主文档页面:/
<block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />
<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>
{{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}