Для реализации формы создания товара с генератором атрибутов в Symfony можно воспользоваться компонентом Form. Для начала необходимо создать сущность, представляющую товар, и определить нужные атрибуты.
// src/Entity/Product.php namespace AppEntity; use DoctrineORMMapping as ORM; /** * @ORMEntity(repositoryClass="AppRepositoryProductRepository") */ class Product { /** * @ORMId() * @ORMGeneratedValue() * @ORMColumn(type="integer") */ private $id; /** * @ORMColumn(type="string", length=255) */ private $name; // Добавьте сюда необходимые атрибуты товара // Геттеры и сеттеры для атрибутов public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } // ... }
Затем необходимо создать форму для создания товара, используя FormBuilder. В данной форме мы будем использовать CollectionType для динамического добавления атрибутов товара.
// src/Form/ProductType.php namespace AppForm; use AppEntityProduct; use SymfonyComponentFormExtensionCoreTypeCollectionType; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver; class ProductType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class) ->add('attributes', CollectionType::class, [ 'entry_type' => AttributeType::class, 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, ]); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => Product::class, ]); } }
В данном примере мы используем AttributeType, который будет представлять отдельный атрибут товара. Форма AttributeType должна быть аналогично реализована с использованием нужных полей.
// src/Form/AttributeType.php namespace AppForm; use SymfonyComponentFormAbstractType; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver; class AttributeType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class) ->add('value', TextType::class); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => Attribute::class, ]); } }
Теперь можно использовать созданную форму в контроллере для создания товара.
// src/Controller/ProductController.php namespace AppController; use AppEntityProduct; use AppFormProductType; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationRequest; use SymfonyComponentRoutingAnnotationRoute; class ProductController extends AbstractController { /** * @Route("/product/create", name="product_create") */ public function create(Request $request) { $product = new Product(); $form = $this->createForm(ProductType::class, $product); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $entityManager = $this->getDoctrine()->getManager(); $entityManager->persist($product); $entityManager->flush(); // Дополнительные действия при успешном сохранении товара return $this->redirectToRoute('product_show', ['id' => $product->getId()]); } return $this->render('product/create.html.twig', [ 'form' => $form->createView(), ]); } }
В данном примере мы создаем форму с использованием ProductType и передаем ее в представление для отображения. После отправки формы мы обрабатываем ее в контроллере, сохраняем товар и выполняем дополнительные действия, если необходимо.
В представлении create.html.twig, вы можете использовать функцию form() для отображения сгенерированной формы.
{# templates/product/create.html.twig #} {% block content %} {{ form(form) }} {% endblock %}
Теперь у вас должна быть рабочая форма, позволяющая создавать товары с динамически добавляемыми атрибутами. Вы можете адаптировать этот код под свои потребности, например, добавить валидацию или использовать другие типы полей вместо TextType.