使用html5和CANCEL按钮进行Symfony2表单验证

时间:2013-02-07 16:44:38

标签: html5 validation symfony twig

我在Symfony2上有一个联系表格,我把一些验证器作为电子邮件,minLength等。 所有这些字段也设置为notBlank。

因此,HTML5也在验证这些字段(对于电子邮件而非空白),这对我来说没问题。

我有一个提交按钮:

<input type="submit" value="Submit"/>

问题是我有另一个提交按钮,这是一个取消按钮:

<input name="cancel" type="submit" value="Cancel" />

使用此按钮,在我的控制器中,我正在进行重定向:

if( $request->get('cancel') == 'Cancel' )
    return  $this->redirect($this->generateUrl('SciForumVersion2Bundle_homepage'));

现在,由于HTML5验证,我无法重定向,因为例如字段为空。

为了重新获得这个,我找到了两个解决方案,但我不喜欢它们:

  1. 禁用HTML 5验证:

    <form novalidate>
    
  2. 使用JavaScript

  3. 但正如我所说,我不喜欢这些方法,我相信有一些很好的Symfony方法可以解决这个问题。

    有什么想法吗?非常感谢你。

5 个答案:

答案 0 :(得分:18)

使用formnovalidate

为取消按钮专门禁用表单验证
<input name="cancel" type="submit" value="Cancel" formnovalidate/>

答案 1 :(得分:6)

我认为这是一个较旧的主题,但我想提供一个替代解决方案,以防其他人发现它有用。我对这个主题的其他答案不满意,因为我想做三件事:

  • 不必在每个视图模板中进行任何自定义表单呈现(我只想使用{{ form(form) }}
  • 取消按钮出现在提交按钮旁边(非常棘手,因为如果您不进行自定义渲染,symfony默认会将所有表单按钮包装在div标签中)
  • 能够将取消操作设置为控制器中的选项 ,因为链接会因我是否添加或编辑等而有所不同

我想在应用DRY原则的同时做到这一切。首先,我将基本表单类型扩展为允许自定义选项,&#39; cancel_action&#39;:

<?php
namespace AcmeBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;

class FormTypeExtension extends AbstractTypeExtension
{
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        parent::configureOptions($resolver);

        $resolver->setDefined('cancel_action');
        $resolver->setAllowedTypes('cancel_action', 'string');
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        parent::buildView($view, $form, $options);

        if (isset($options['cancel_action'])) {
            $view->vars['cancel_action'] = $options['cancel_action'];
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return 'form';
    }
}

在我的配置中注册了该表单类型扩展名(使用别名&#39;表单&#39;以便它可用于我的所有表单):

acme.form_type_extension:
    class: AcmeBundle\Form\Extension\FormTypeExtension
    tags:
        - {name: form.type_extension, alias: form}

然后我使用表单主题来扩展基本表单视图(我扩展了submit_widget块,以便取消按钮位于div标签内的提交按钮旁边):

{# AcmeBundle:Form:fields.html.twig #}

{% extends 'form_div_layout.html.twig' %}

{%- block submit_widget -%}
    {%- set type = type|default('submit') -%}
    {{ block('button_widget') }}
    {% if form.parent.vars.cancel_action is defined %}
        <a class="btn btn-default" href="{{ form.parent.vars.cancel_action }}" role="button">Cancel</a>
    {% endif %}
{%- endblock submit_widget -%}

并在我的twig配置中注册了该主题,以便它默认应用于所有表单视图:

twig:
    form_themes:
        - 'AcmeBundle:Form:fields.html.twig'

瞧瞧!现在对于每个表单,如果我想要一个取消按钮,我需要做的就是在控制器中初始化表单时指定取消操作作为选项:

$form = $this->createForm(new AlbumType(), $album, array(
    'cancel_action' => $this->generateUrl('album_home')
));

答案 2 :(得分:3)

我恢复了我的评论:)

在处理表单(HTML5与否)并且您想要退出时,您不需要提交和验证任何数据 您只需要输入一个简单的href链接来更改页面。使用您最喜欢的CSS样式具有相同的外观

提示:当用户更改输入值时,您可以收听javascript事件“onbeforeunload”。它提醒用户他将退出页面

希望它有所帮助!

答案 3 :(得分:2)

->add('cancel', 'submit', array(
            'label' => 'Cancel',
            'attr' => array(                       
                    'formnovalidate'=>'formnovalidate'
            ) 
    ))

答案 4 :(得分:0)

我们可以通过 formnovalidate

使用HTML5必需属性轻松禁用表单验证