Forms Magento中的自定义表单

Forms Magento中的自定义表单,forms,magento,controller,php,Forms,Magento,Controller,Php,任何人都可以提供关于如何在Magento中创建将数据发布到控制器操作的前端表单的虚拟指南\代码片段 我想写一个变体的联系我们。(我知道修改“联系我们”表格很容易,如所述)。我还试图创建一个带有附加字段的反馈表单 鉴于这一基本形式: <form action="<?php echo $this->getFormAction(); ?>" id="feedbackForm" method="post"> <div class=

任何人都可以提供关于如何在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>

如果有人感兴趣,我通过构建自己的模块解决了这个问题,该模块主要基于
Magento_联系人
模块

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


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

  • 在块的其他地方调用
    setFormAction()
  • 使用实现
    getFormAction()
    的自定义块类型
  • (1) 是在
    Mage\u Contacts\u IndexController::indexAction()
    中发生的事情,但是(2)是更干净的方法,我将详细解释它:

    创建自定义模块
    app/etc/modules/Stack\u Form.xml

    <?xml version="1.0"?>
    <config>
        <modules>
            <Stack_Form>
                <active>true</active>
                <codePool>local</codePool>
            </Stack_Form>
        </modules>
    </config>
    
    <?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>
    
    此配置为自己的块注册
    堆栈\u表单
    块别名,并为自己的控制器注册
    反馈
    前端名称

    创建自定义块
    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\u 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
        }
    }
    
    如果表单的行为与联系人表单完全相同,只是使用了不同的电子邮件模板和其他表单字段,那么我已经介绍了两种解决方案,其中只有一种实际需要自定义控制器操作来发送表单:

    如果你看 在表单操作中使用,您将发现

  • 事务模板直接从配置中获取
  • 所有POST数据都会传递到模板(作为模板变量
    data
    ),以便您可以向表单中添加任何其他字段 模板,并在电子邮件模板中使用它们。但验证很难 编码为“姓名”、“评论”、“电子邮件”和“隐藏”
  • 因此,如果您需要完全不同的电子邮件模板或 附加/更改的输入验证,最好是创建 带有的
    postAction
    修改副本的自定义控制器
    Mage\u Contacts\u IndexController

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

    • 创建确定表单类型的隐藏输入。它可能只是
    • 在联系人事务性电子邮件模板中,使用
      if
      指令根据表单类型显示不同的内容:

      {{if data.custom}}
          ... custom contact form email ...
      {{else}}
          ... standard contact form email ...
      {{/if}}
      
    如何使用此自定义块 您可以使用以下代码(CMS指令)在CMS中的任何位置添加表单:

    如果您这样做,您需要将“stack_form/form”添加到系统>权限>块下的块白名单中

    或在布局中使用此代码(布局XML):

    在CMS指令中,您不能使用helpers,因此您需要在其中输入实际URL:

    {{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}
    

    由于您可能在不同的商店视图中有不同的CMS页面/块,这应该不是什么大问题。

    我尝试了您的教程伙伴,但我只看到一个空页面!我是否必须在
    公共函数postAction()中包含任何内容?我创建了
    app\design\frontend\base\default\template\contacts\form.phml的stack_form.phtml副本,并尝试了{{block…在新的cms页面中是的,postAction方法必须包含您的自定义代码,以便从表单输入创建电子邮件并向用户显示成功消息。如上所述,这可以是Mage_Contacts_IndexController的postAction的修改副本。我添加了它,但具有相同的结果…getFormAction函数如何?这可以吗空?我现在得到一个致命错误:调用成员函数setFormAction()在第55行的
    app/code/core/Mage/Contacts/controllers/IndexController.php中的布尔值上
    OK我必须将块堆栈列为白名单\u表单/form我的反馈表单:如何在所有页面中显示,包括主页@dant第一个链接现在重定向到他们的主文档页面:/
    <block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />
    
    <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>
    
    {{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}