Функция form_rest
Функция form_rest принимает переменную формы и
возвращает HTML всех полей, которые ещё не были
отрендерены через form_widget или другие
функции вывода. Обычно используются для скрытых
полей, таких как _token. Функция вызывается
перед закрывающим тегом </form>.
Синтаксис
{{ form_rest(form) }}
Пример
Давайте создадим форму и выведем её поля через
form_widget, а оставшиеся скрытые поля
через form_rest:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class ArticleController extends AbstractController
{
public function index(): Response
{
$form = $this->createFormBuilder()
->add('name', TextType::class)
->add('save', SubmitType::class)
->getForm();
return $this->render('article/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Теперь выведем форму в шаблоне и добавим form_rest:
{{ form_start(form) }}
{{ form_widget(form.name) }}
{{ form_widget(form.save) }}
{{ form_rest(form) }}
{{ form_end(form) }}
Результат выполнения кода:
<form name="" method="post">
<div><label for="form_name">Name</label><input type="text" id="form_name" name="form[name]"></div>
<div><button type="submit" id="form_save" name="form[save]">Save</button></div>
<input type="hidden" id="form__token" name="form[_token]" value="abcde">
</form>
Пример
Давайте убедимся, что без form_rest скрытый
токен не попадёт в HTML. Уберём вызов функции:
{{ form_start(form) }}
{{ form_widget(form.name) }}
{{ form_widget(form.save) }}
{{ form_end(form) }}
Результат выполнения кода:
<form name="" method="post">
<div><label for="form_name">Name</label><input type="text" id="form_name" name="form[name]"></div>
<div><button type="submit" id="form_save" name="form[save]">Save</button></div>
</form>
Обратите внимание: скрытое поле _token
исчезло. При отправке такой формы Symfony выдаст
ошибку о недействительном CSRF-токене.
Пример
Давайте добавим в форму поле text типа
TextareaType и выведем только его, а
остальные поля отдадим form_rest:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class ArticleController extends AbstractController
{
public function index(): Response
{
$form = $this->createFormBuilder()
->add('name', TextType::class)
->add('text', TextareaType::class)
->add('save', SubmitType::class)
->getForm();
return $this->render('article/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Выведем в шаблоне только поле name, а
text и save оставим для
form_rest:
{{ form_start(form) }}
{{ form_widget(form.name) }}
{{ form_rest(form) }}
{{ form_end(form) }}
Результат выполнения кода:
<form name="" method="post">
<div><label for="form_name">Name</label><input type="text" id="form_name" name="form[name]"></div>
<div><label for="form_text">Text</label><textarea id="form_text" name="form[text]"></textarea></div>
<div><button type="submit" id="form_save" name="form[save]">Save</button></div>
<input type="hidden" id="form__token" name="form[_token]" value="abcde">
</form>
Как видите, form_rest вывел поля
text, save и скрытый _token,
которые не были отрендерены вручную.
Смотрите также
-
функция
form_widget,
которая выводит одно поле формы -
функция
form_row,
которая выводит label, поле и ошибки -
функция
form_end,
которая закрывает форму и выводит остаток полей -
функция
form_errors,
которая выводит ошибки валидации формы