46

サーバー側の検証のみを使用してフォームを検証したい。ただし、ブラウザがHTML5をサポートしている場合は、symfony2によってフォームに追加されたHTML5属性を使用して検証するため、HTML5検証を防ぐ必要があります。

4

8 に答える 8

80

タグに追加novalidateするだけです:<form>

<form novalidate>

TWIGでフォームをレンダリングする場合は、次を使用できます。

{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}
于 2012-04-13T14:33:11.827 に答える
21

古い質問は知っていますが、FormType の SF2.6 を使用すると、次のことができます。

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'attr'=>array('novalidate'=>'novalidate')
    ));
}
于 2015-03-30T19:47:04.590 に答える
10

これに対する解決策をグーグルで検索しているときに、アプリ全体でhtml5検証を無効にしたい場合、それが最もエレガントに思えるので、ここで共有したいと思いました. クレジットは、このブログ記事の著者に送られます。

アイデアは、次のような「フォーム」フォーム タイプの拡張機能を作成することです。

<?php
// src/AppBundle/Form/Extension/NoValidateExtension.php

namespace AppBundle\Form\Extension;

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


class NoValidateExtension extends AbstractTypeExtension
{
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['attr'] = array_merge($view->vars['attr'], [
            'novalidate' => 'novalidate',
        ]);
    }

    public function getExtendedType()
    {
        return 'form';
    }
}
?>

次に、次のように services.yml に登録します。

app.no_validation_form_extension:
    class: AppBundle\Form\Extension\NoValidateExtension
    tags:
        - {name: form.type_extension, alias: form}

これで完了です。すべてのフォームには、novalidate属性が自動的に設定されます。

シンフォニー 3.3

Symfony 3.3 の時点で、構成はわずかに異なりますが、それでも可能です。

クラスgetExtendedTypeを返すメソッドを少し更新しました。FormType

// src/AppBundle/Form/Extension/NoValidateExtension.php

namespace AppBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Extension\Core\Type\FormType;

class NoValidateExtension extends AbstractTypeExtension
{
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['attr'] = array_merge($view->vars['attr'], [
            'novalidate' => 'novalidate',
        ]);
    }

    public function getExtendedType()
    {
        return FormType::class;
    }
}

extended_typeさらに、サービス宣言で必要になったタグを少し追加します。

app.no_validation_form_extension:
    class: AppBundle\Form\Extension\NoValidateExtension
    tags:
        - {name: form.type_extension, alias: form, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType}
于 2015-11-20T13:26:45.153 に答える
4

または、何らかの理由で上記の回答のように小枝でやりたくない場合...

{{ フォーム(フォーム, {'属性': {'ノバリデート': 'ノバリデート'}}) }}

または、createFormBuilder を使用して手動でフォームを作成する場合は、createFormBuilder を 2 番目のパラメーターとして使用して、フォーム属性を定義するだけです。

//someAction
$form = $this->createFormBuilder(null, ['attr'=>['novalidate'=>'novalidate']])
->add(...)
->add(...)
->add(...)
->getFrom();

return $this->render("-----:----:----.html.twig", [
    'form'=>$form->createView()
]);
于 2016-01-30T05:27:34.573 に答える
2

Symfony 3 (または 2) を使用していて、特定のフィールドの検証のみをオフにしたい場合は、これを行うことができます。

$form = $this->createFormBuilder($task)
            ->add('task', TextType::class, array('required' => false))
            ->add('dueDate', DateType::class)
            ->add('save', SubmitType::class, array('label' => 'Create Task'))
            ->add('saveAndAdd', SubmitType::class, array('label' => 'Save and Add'))
            ->getForm();

このサンプル フォームでは、array('required' => false)に注意してください。他の要素の検証を無効にすることなく、検証を無効にする任意の要素にこれを追加できます。フォーム全体ではなく、1 つの要素のみを一時的に無効にする場合に非常に便利です。

これは HTML5 検証のみを無効にすることに注意してください。これは、サーバー側の検証を無効にしません。

参照: http://symfony.com/doc/current/book/forms.html#field-type-options

于 2016-01-02T18:05:30.980 に答える
1

実際に検証属性を削除する必要がある場合 (たとえば、検証ライブラリを使用してすべての検証制約を 1 か所に保持したい場合)、twig で widget_attributes ブロックを上書きできます。

たとえば、 app/Resources/views/form.html.twig で既にカスタム フォーム テンプレートを使用している (そして config.yml で有効にしている) 場合は、次のブロックを追加するだけです。

{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}
    {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}{% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}

ここで行ったのは、検証に関連する属性を削除することだけです。

{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }} "{% endif %}

于 2013-12-11T14:24:07.413 に答える
0

formType クラスを使用して特定のフィールドの正規表現検証を無効にするには:

->add('foo',null,array=>('attr'=>('pattern'=>'/[^~,]/'))
于 2016-04-11T13:39:49.273 に答える
0

フォームのテーマを使用する:

まず、app/Resources/views/form/fields.html.twig などのフォーム テーマ テンプレートを作成します。

{% extends 'form_div_layout.html.twig' %}{# or some other base layout #}

{% block form_start %}
    {% if attr.novalidate is not defined %}
        {% set attr = attr|merge({'novalidate':'novalidate'}) %}
    {% endif %}
    {{ parent() }}
{% endblock %}

次に、そのフォーム テーマをテンプレートで使用します。

{% form_theme form with 'form/fields.html.twig' %}

{{ form_start(form) }} <-- now renders with novalidate attribute
...
{{ form_end(form) }}

または、テーマをグローバルに適用します (app/config/config.yml):

twig:
    form_themes:
        - ':form/fields.html.twig'
于 2016-04-27T16:32:28.943 に答える