symfony4 Form -- вывести связанную сущность в виде выпадающего списка select
Primary tabs
В процессе создания админки для интернет магазина мне потребовалось вывести для заполнения не только текстовые поля объекта Product, но и все имеющиеся в БД фирмы в виде списка.
Это можно сделать так:
- Создаём форму в контроллере
// src/Controller/ProductController.php /** * Creates a new product entity. * * @Route("/new", name="product_new") * * @Method({"GET", "POST"}) * * @return Response */ public function newAction(Request $request, FirmGetter $firmGetter): Response { $form = $this->createForm(ProductType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // сохраняем новый Product в БД и перенаправляем админа на страницу просмотра return $this->redirectToRoute('product_show', [ 'id' => $product->getId(), ]); } return $this->render('product/new.html.twig', [ 'form' => $form->createView(), ]); }
- Класс, описывающий форму
// src/Form/ProductType.php /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', TextType::class, [ 'label' => 'Название', ]) // здесь могут быть и другие поля продукта (описание, цена и т.п.) ->add('firm', EntityType::class, [ 'label' => 'Фирма', 'class' => Firm::class, ]); }
- Чтобы Symfony знал, какое поле сущности выводить в списке, добавим в класс Entity\Firm.php магический метод __toString():
public function __toString() { return $this->getLabel(); }
- Выводим форму в шаблоне с использованием twig:
// product/new.html.twig {{ form_start(form, {'enctype': "multipart/form-data", 'method': 'post'}) }} {{form_widget(form)}} <input type="submit" value="Создать" formnovalidate> {{ form_end(form) }}
Источники
- Документация EntityType
- Создание и редактирование объекта с примерами кода
- Можно ещё с использованием empty_data, но это скорее всего связано не со связанными сущностями, а с передачей данных в форму в целом
- Log in to post comments
- 3593 reads