У меня есть контактная форма на 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, я не могу перенаправить, например, потому что поля пусты.
Чтобы решить это, я нашел два решения, но они мне не нравятся:
Отключите проверку HTML 5:
<form novalidate>
Используйте JavaScript
Но, как я уже сказал, мне не нравятся эти методы, и я уверен, что есть несколько хороших методов Symfony для решения этой проблемы.
Есть идеи? Спасибо большое.
Ответ 1 · рейтинг 3 · Julien Rollin
я возобновляю свой комментарий :)
при работе с формой (HTML5 или нет) и вы хотите выйти, вам не нужно отправлять и проверять какие-либо данные. Вам просто нужно поместить простую ссылку href, чтобы изменить страницу. Используйте свой любимый стиль CSS, чтобы иметь такой же внешний вид
Совет: вы можете прослушать событие javascript "onbeforeunload", когда пользователь изменил входное значение. Он предупреждает пользователя, что он покинет страницу
Надеюсь, это помогло!
Ответ 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')
));