Symfony forms

Не смотря на то, что уже есть хорошее описание параметров формы, я сделаю заметки для себя, которые может помогут кому-нибудь еще:

К примеру, создадим форму (с скрытым полем 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>

Об урлах

Я предпочитаю писать просто

    /**
     * форма добавления/редактирование компании
     * @Route("/formCompany/", name="formCompany")
     * @Template()
     */
    public function formCompanyAction()
    {
        $id = (int)$request->get('id');

1. благодаря тому, что мы указали в конце роута слэш, симфони будет редиректить посетителя сайта с страницы /formCompany на страницу /formCompany/

2. как видите, я обрабатываю GET-параметр вручную и в большинстве случаев это удобнее, чем писать:

* @Route("/formCompany/{id}", defaults={"id" = 0}, name="formCompany")

потому что при дополнительном параметре, придется расширять роут-правило + это принесет ненужную нагрузку на парсер роутинга.

3. в месте, где нужно указать, какую строку мы будем изменять, мы напишем:

<a href="{{ url('formCompany', { id : 123 }, true) }}">Изменить</a>

true - здесь говорит о том, что id является GET-параметром, а не параметром роута.

Если нужен красивый URI

То придется в роуте прописать значение по-умолчанию

@Route("/formCompany/{id}", defaults={"id" = 0}, name="formCompany")

т.к. если не прописать defaults, то twig будет ругаться на построение пути без указания id:

{{ path('formCompany') }}

и будет прав, т.к. id является обязательным, поэтому придется написать:

{{ path('formCompany', { id : 123 }) }}

Удачки.

Оцени публикацию:
  • 0,0
Оценили человек: 0

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » PHP »