10

任何人都可以提供有关如何在 Magento 中创建将数据发布到控制器操作的前端表单的虚拟指南\代码片段。

我正在尝试编写与我们联系的变体。(我知道修改联系我们表格很容易,如此所述)。我也在尝试创建一个包含其他字段的反馈表。

鉴于这种基本形式:

<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>

我需要采取哪些基本步骤才能将输入的名称输入到控制器操作中进行处理?

4

2 回答 2

13

如果有人感兴趣,我通过构建自己的模块来解决这个问题,该模块很大程度上基于该Magento_Contacts模块。

以下是一些帮助我解决问题的链接。

http://www.magentocommerce.com/wiki/custom_module_with_custom_database_table

http://incho.net/ecommerce/magento/magento-custom-emails/

于 2009-07-07T22:58:11.453 回答
4

要将$this->getFormAction()URL 返回到您的自定义控制器,您有两个选择:

  1. setFormAction()在街区的其他地方打电话。
  2. 使用实现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概述了两种解决方案,其中只有一个他们实际上需要一个自定义控制器操作来发送表单:

如果您查看表单操作中使用的联系人控制器 ,您会发现

  1. 事务模板直接取自配置
  2. 所有 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”添加到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 页面/块,这应该不是一个大问题。

于 2015-09-16T13:41:13.580 回答