Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Milos CuculovicОтветов: 4

У меня есть контактная форма на 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 для решения этой проблемы.

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

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

validationhtmlsymfonytwig

Ответы

Ответ 1 · рейтинг 3 · Julien Rollin

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

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

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

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

Ответ 2 · рейтинг 18 · Antoine Bolvy

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

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

Ответ 3 · рейтинг 6 · sarahg

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

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

Ответ 4 · Abdul Rahim

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы