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-&gt;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.

但是还有另一种解决方案有点受限,但没有任何 涉及的自定义代码:

创建一个隐藏输入来确定表单的类型。可能只是&lt;input type="hidden" name="custom" value="1" /&gt;

在联系人交易电子邮件模板中,使用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 中的自定义表单的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义 magento 单页结帐表单

模板中的自定义表单验证错误

magento 自定义付款方式表单未显示

Drupal 6 中的自定义搜索表单:视图/面板还是自定义 sql?

模板和隐藏输入中的自定义 Django 表单

React 中的自定义 mailchimp 注册表单