7

Symfony2に連絡フォームがあり、そこにいくつかのバリデーターをemail、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検証のため、たとえばフィールドが空であるため、リダイレクトできません。

それを再考するために、私は2つの解決策を見つけましたが、私はそれらが好きではありません。

  1. HTML5検証を無効にします。

    <form novalidate>
    
  2. JavaScriptを使用する

しかし、私が言ったように、私はそれらのメソッドが好きではなく、それを解決するためのいくつかの素晴らしいSymfonyメソッドがあると確信しています。

何か案が?どうもありがとうございます。

4

6 に答える 6

19

以下を使用して、キャンセルボタン専用のフォーム検証を無効にしますformnovalidate

<input name="cancel" type="submit" value="Cancel" formnovalidate/>
于 2013-06-07T20:34:41.810 に答える
6

これは古いスレッドだと思いますが、他の人が役立つと思った場合に備えて、別の解決策を提供したいと思いました。私は3つのことをしたかったので、このトピックに関する他の回答に満足していませんでした。

  • 各ビューテンプレートでカスタムフォームレンダリングを行う必要はありません(私は単に使用するのが好きです{{ form(form) }}
  • キャンセルボタンを送信ボタンのすぐ隣に表示します(カスタムレンダリングを行わない場合、symfonyはデフォルトですべてのフォームボタンをdivタグでラップするため、驚くほど注意が必要です)
  • 追加するか編集するかなどでリンクが変わるので、コントローラーのオプションとしてキャンセルアクションを設定できます。

そして、私はDRYの原則を適用しながらこれらすべてをやりたかったのです。まず、基本フォームタイプを拡張して、カスタムオプション'cancel_action'を許可しました。

<?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';
    }
}

そして、そのフォームタイプ拡張を私の設定に登録しました(エイリアス'form'を使用して、すべてのフォームで使用できるようにします):

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:
    form_themes:
        - 'AcmeBundle:Form:fields.html.twig'

出来上がり!ここで、フォームごとに、キャンセルボタンが必要な場合は、コントローラーでフォームを初期化するときに、オプションとしてキャンセルアクションを指定するだけです。

$form = $this->createForm(new AlbumType(), $album, array(
    'cancel_action' => $this->generateUrl('album_home')
));
于 2015-07-02T14:58:59.447 に答える
3

コメントを再開します:)

フォーム(HTML5かどうかに関係なく)を処理していて、終了したい場合は、データを送信して検証する必要はありません。ページを変更するには、単純なhrefリンクを配置するだけです。お気に入りのCSSスタイルを使用して同じ外観にします

ヒント:ユーザーが入力値を変更したときに、javascriptイベント「onbeforeunload」をリッスンできます。ページを終了することをユーザーに警告します

お役に立てば幸いです。

于 2013-02-11T08:30:33.147 に答える
3
->add('cancel', 'submit', array(
            'label' => 'Cancel',
            'attr' => array(                       
                    'formnovalidate'=>'formnovalidate'
            ) 
    ))
于 2015-12-04T22:32:06.683 に答える
0

formnovalidateによるHTML5必須属性を使用してフォーム検証を簡単に無効にできます

于 2015-02-19T09:30:38.437 に答える
0

あなたもそれを行うことができます:

<button name="cancel" type="submit" value="Cancel" formnovalidate>Cancel</button>
于 2021-11-08T14:07:24.180 に答える