要将$this->getFormAction()
URL 返回到您的自定义控制器,您有两个选择:
setFormAction()
在街区的其他地方打电话。
- 使用实现
getFormAction()
.
(1) 是在 中发生的Mage_Contacts_IndexController::indexAction()
,但 (2) 是更简洁的方法,我将详细解释它:
创建自定义模块
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>
此配置为自己的块注册了stack_form
块别名,feedback
为自己的控制器注册了前面的名称。
创建自定义块
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_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
}
}
如果表单的行为与联系表单完全相同,只是使用不同的电子邮件模板和其他表单字段,我在https://magento.stackexchange.com/q/79602/243概述了两种解决方案,其中只有一个他们实际上需要一个自定义控制器操作来发送表单:
如果您查看表单操作中使用的联系人控制器
,您会发现
- 事务模板直接取自配置
- 所有 POST 数据都传递给模板(作为模板变量
data
),以便您可以向表单模板添加任何其他字段并在电子邮件模板中使用它们。但是对“名称”、“评论”、“电子邮件”和“隐藏”的验证是硬编码的。
因此,如果您需要一个完全不同的电子邮件模板或额外/更改的输入验证,最好的办法是创建一个自定义控制器,其中postAction
包含
Mage_Contacts_IndexController
.
但是还有另一种解决方案有点受限,但不涉及任何自定义代码:
如何使用这个自定义块
您可以使用以下代码(CMS 指令)在 CMS 中的任何位置添加表单:
{{block type="stack_form/form" template="path/to/your/form.phtml"}}
如果这样做,则需要将“stack_form/form”添加到System > Permissions > Blocks下的阻止白名单中!
或在布局中使用此代码(布局 XML):
<block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />
没有自定义模块的解决方案
如果您使用没有自定义控制器和上述单个电子邮件模板的解决方案,您也可以使用布局 XML 设置表单操作。
为了实现这一点,我们使用该功能调用帮助器作为块操作的参数。不幸的是,核心助手没有获取 URL 的公共方法,但助手Mage_XmlConnect
有,因此您可以使用该方法:
<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>
在 CMS 指令中,您不能使用帮助程序,因此您需要将实际 URL 放在那里:
{{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}
由于您可能在不同的商店视图中有不同的 CMS 页面/块,这应该不是一个大问题。