Как реализовать Форму создания товара с генератором атрибутов?

Для реализации формы создания товара с генератором атрибутов в 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.