Проверка формы Symfony2 с помощью html5 и кнопки ОТМЕНА

У меня есть контактная форма на Symfony2, где я помещаю некоторые валидаторы в виде электронной почты, minLength и т. д. Все эти поля также установлены как непустые.

Из-за этого 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

Но, как я уже сказал, мне не нравятся эти методы, и я уверен, что есть несколько хороших методов Symfony для решения этой проблемы.

Есть идеи? Спасибо большое.


person Milos Cuculovic    schedule 07.02.2013    source источник
comment
если вы отмените, вы не хотите отправлять, нет? почему бы вам не использовать ссылку href и не закрыть страницу?   -  person Julien Rollin    schedule 07.02.2013
comment
Спасибо за ваш ответ. Вы правы, так что вместо простой кнопки отправки есть возможность использовать кнопку с href?   -  person Miloš    schedule 08.02.2013
comment
Лучший вариант — использовать простую ссылку. Также подчеркивается, что делать, если вы хотите продолжить (большая кнопка) или отменить (маленькая ссылка).   -  person Maerlyn    schedule 08.02.2013
comment
Имея кнопку с одной стороны и ссылку отмены с другой, я предпочитаю две кнопки и, возможно, играю с цветами.   -  person Miloš    schedule 08.02.2013
comment
посмотрите на twitter.github.com/bootstrap/base-css.html#buttons, он будет отображать ссылки в виде кнопки, если вы добавите правильный класс. Полезный   -  person Julien Rollin    schedule 09.02.2013
comment
Спасибо @JulienRollin. Не могли бы вы опубликовать ответ (аналогично вашему первому комментарию о href). Так что могу принять.   -  person Miloš    schedule 11.02.2013


Ответы (4)


я возобновляю свой комментарий :)

при работе с формой (HTML5 или нет) и вы хотите выйти, вам не нужно отправлять и проверять какие-либо данные. Вам просто нужно поместить простую ссылку href, чтобы изменить страницу. Используйте свой любимый стиль CSS, чтобы иметь такой же внешний вид

Совет: вы можете прослушать событие javascript "onbeforeunload", когда пользователь изменил входное значение. Он предупреждает пользователя, что он покинет страницу

Надеюсь, это помогло!

person Julien Rollin    schedule 11.02.2013

Отключите проверку формы исключительно для кнопки отмены с помощью formnovalidate:

<input name="cancel" type="submit" value="Cancel" formnovalidate/>
person Antoine Bolvy    schedule 07.06.2013
comment
Это должен быть принятый ответ: он делает именно то, что нужно: он отключает проверку формы для всех полей, если он установлен на кнопке отмены submit. Это работает намного лучше для многих дизайнеров, потому что вы можете использовать две кнопки submit вместо одной кнопки submit и ссылки. Это также лучшее семантическое описание страницы. - person Christopher Schultz; 07.06.2018

Я вижу, что это старая ветка, но я хотел предложить альтернативное решение на случай, если другие сочтут его полезным. Меня не удовлетворили другие ответы на эту тему, потому что я хотел сделать три вещи:

  • Не нужно делать какой-либо пользовательский рендеринг формы в каждом шаблоне представления (мне нравится просто использовать {{ 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';
    }
}

И зарегистрировал это расширение типа формы в моей конфигурации (используя псевдоним «форма», чтобы он был доступен для всех моих форм):

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')
));
person sarahg    schedule 02.07.2015
comment
Спасибо за это! Единственное изменение, которое я сделал, это добавить style="margin-left: 10px; и btn-primary к классу ссылок из-за использования начальной загрузки Braincrafted. - person geoB; 14.02.2018
comment
@sarahg, это потрясающе, спасибо, но у меня были некоторые проблемы с применением этого к symfony 4.1, при использовании темы bootstrap 4 мне пришлось удалить {% extensions из файла шаблона, теперь не знаю, почему, но это работает! - person Tio; 20.03.2018

Мы можем легко отключить проверку формы с помощью обязательного атрибута HTML5 с помощью formnovalidate.

person Abdul Rahim    schedule 19.02.2015