要使 $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 概述了两种解决方案,其中只有一个实际上需要自定义控制器操作来发送形式:
如果您查看contacts
controller
在表单动作中使用,你会发现
- 事务模板直接取自配置
- 所有 POST 数据都传递给模板(作为模板变量
data),以便您可以向表单添加任何其他字段
模板并在电子邮件模板中使用它们。但是验证很难
编码为“姓名”、“评论”、“电子邮件”和“隐藏”。
所以,如果您需要一个完全不同的电子邮件模板或
附加/更改的输入验证,您最好的选择是创建一个
带有postAction 的修改副本的自定义控制器
Mage_Contacts_IndexController.
但是还有另一种解决方案有点受限,但没有任何
涉及的自定义代码:
如何使用这个自定义块
您可以使用此代码(CMS 指令)在 CMS 中的任何位置添加表单:
{{block type="stack_form/form" template="path/to/your/form.phtml"}}
如果这样做,则需要将“stack_form/form”添加到系统>权限>阻止下的阻止白名单中!
或在布局中使用此代码(布局 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 页面/块,这应该不是什么大问题。