Не смотря на то, что уже есть хорошее описание параметров формы, я сделаю заметки для себя, которые может помогут кому-нибудь еще:
К примеру, создадим форму (с скрытым полем csrf-токена, который по-умолчанию генерируется как хэш имен полей формы).
$entity = array('id' => 0);
$formBuilder = $this->createFormBuilder($entity)
->add('rate', 'text', array(
'attr' => array('rows' => 1),
'label' => 'Цена работ:',
'constraints' => [
new Constraints\NotBlank(),
new Constraints\Range(array('min' => 1))
]
))
->add('save', 'submit', array(
'label' => 'Сохранить',
'attr' => array('class' => 'btn btn-success')
));
$form = $formBuilder->getForm();
return array(
'form' => $form->createView(),
'errors' => $form->getErrors(true)
);Самый простой способ вывести эту форму Twig-ом, это в написать:
{% form_theme form 'bootstrap_3_layout.html.twig' %}
{{ form(form, {'attr': {'novalidate': 'novalidate'}}) }}Благодаря такой краткой записи, форма будет сама рисовать поля и выводить ошибки, если поле заполнено неверно.
{'attr': {'novalidate': 'novalidate'}} - нужно, если мы хотим, чтобы браузер не валидировал поля (современные браузеры умеют это делать, но пока плохо)
Обратите внимание, выше описанная форма будут отправлять данные по адресу текущей страницы. А если Вам нужно, чтобы форма отправляла данные по другому адресу, то это необходимо указать:
$formBuilder->setAction($this->generateUrl('RouteName'));Однако, Вы можете захотеть отформатировать форму по-своему, и тогда Вам пригодится следующий пример:
<form method="post" action="{{ path("RouteName", {id : form.vars.value.id}) }}" novalidate {{ form_enctype(form) }}>
{# тут выведется ошибка протухшего csrf-токена (если она появляется) #}
{{ form_errors(form) }}
<b>{{ form_label(form.rate, 'Цена работ:') }} </b>:
{{ form_widget(form.rate) }}
{{ form_errors(form.rate) }}
<input type="submit" class="btn btn-primary" value="Опубликовать">
{# поля, про которые забыли: #}
{{ form_rest(form) }}
</form>Источники: 1 - 2- 3 - 4- 5 - 6 - 7- 8 - 9- 10 - 11- 12 - 13 - 14 - 15
Комментарии
Комментариев пока нет.