Magento 中的自定义表单
Posted
技术标签:
【中文标题】Magento 中的自定义表单【英文标题】:Custom forms in Magento 【发布时间】:2009-06-30 21:18:47 【问题描述】:谁能提供关于如何在 Magento 中创建将数据发布到控制器操作的前端表单的虚拟指南\code sn-ps。
我正在尝试编写与我们联系的变体。 (我知道修改联系我们表格很容易,如here 所述)。我也在尝试创建一个包含其他字段的反馈表。
鉴于这种基本形式:
<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>
要将输入的名称输入到控制器操作中进行处理,我需要采取哪些基本步骤?
【问题讨论】:
【参考方案1】:如果有人感兴趣,我通过构建自己的模块来解决这个问题,该模块很大程度上基于Magento_Contacts
模块。
这里有一些链接可以帮助我解决问题。
http://www.magentocommerce.com/wiki/custom_module_with_custom_database_table
http://inchoo.net/ecommerce/magento/magento-custom-emails/
【讨论】:
我的反馈表:dropbox.com/sh/32zqgejubfllz0h/AACkB_iIh-KJQxtEUikZ8i9Na?dl=0我如何在包括主页@Dan在内的所有页面中显示 第一个链接现在重定向到他们的主要文档页面:/【参考方案2】:要使 $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
.但是还有另一种解决方案有点受限,但没有任何 涉及的自定义代码:
创建一个隐藏输入来确定表单的类型。可能只是<input type="hidden" name="custom" value="1" />
。在联系人交易电子邮件模板中,使用
if
指令根据表单类型显示不同的内容:if data.custom ... custom contact form email ... else ... standard contact form email ... /if
如何使用这个自定义块
您可以使用此代码(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 页面/块,这应该不是什么大问题。
【讨论】:
我试过你的教程伙伴,但我只看到一个空白页面!我必须在public function postAction()
中包含任何内容吗?我创建了app\design\frontend\base\default\template\contacts\form.phml
的 stack_form.phtml 的副本,并在新的 cms 页面中尝试了 block... 方式
是的,postAction 方法必须包含您的自定义代码,以从表单输入创建电子邮件并向用户显示成功消息。如上所述,这可以是 Mage_Contacts_IndexController 的 postAction 的修改副本
我添加了它,但结果相同... getFormAction 函数呢?这可以是空的吗?
我现在遇到致命错误:在 app/code/core/Mage/Contacts/controllers/IndexController.php on line 55
中调用布尔值的成员函数 setFormAction()
好的,我必须将块 stack_form/form 列入白名单以上是关于Magento 中的自定义表单的主要内容,如果未能解决你的问题,请参考以下文章