Symfony 4 Embed Forms — только встраиваемая часть

У меня есть 2 сущности: Статья, Комментарий

У каждого есть свой FormType -> ArticleType, CommentType


Для создания статей я просто использую тип статьи для создания формы.

Для комментариев я использую свой CommentType, но я также хочу изменить некоторую информацию из статьи.

Например: Добавить комментарий и иметь возможность изменять категории статей.

Это означает, что мне нужно добавить поле «Категория статьи» к моему CommentType. Так как есть способы встраивания в полную форму. Мне было интересно, могу ли я встроить только часть формы.

Тип статьи:

$builder->add('headline', TextType::class, [ ... ])
        ->add('text', TextType::class, [ ... ])
        ->add('category', EntityType:class, [ ... ])

Тип комментария:

$builder->add('article', ArticleType::class, [ ... ])
//adds all fields of ArticleType, but only want the category field

Есть ли способ приблизиться к этому, не добавляя часть категории из моего ArticleType? (предотвратить дублирование кода).

Также мне было интересно, как будет выглядеть контроллер для моего случая. Сейчас я использую следующий код, который может нуждаться в улучшении:

/**
 * @Route("/article/{id}", name = "app_article")
 */
public function article(Request $request, Article $article)
{
    $comment = new Comment();
    $comment->setArticle($article); //to modify current article values

    $form = $this->createForm(CommentType::class, $comment);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $tmpArticle = $comment->getArticle(); //if I don't get the article from my comment, doctrine/symfony creates a *new* Article - which I dont want
        $article->setCategory($tmpArticle->getCategory());

        $em->persist($comment);
        $em->persist($article);
        $em->flush();

        return $this->redirectToRoute(...);
    }

    return $this->render(...);
}

Спасибо.

JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
1
0
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите выбрать существующую статью для категории. Следует ли использовать EntityType: Связь

С параметрами вы можете выбрать метку при выборе.

Это то, что я делаю прямо сейчас. К сожалению, мне не нравится это решение, потому что я также использую FormEvents для динамического изменения формы. Если я использую EntityType, мне нужно переписать все события FormEvents, которые у меня практически уже есть. Пример: если я выбираю категорию, я получаю выбор с подкатегориями. Вот почему я хочу использовать свой ArticleType, поэтому мне (если возможно) не нужно все дублировать :)

Syllz 19.07.2019 11:50

Может быть, моя идея глупа. Если вы напишете: $builder->add('article.category', EntityType:class, [ ... ])

Gary Houbre 19.07.2019 12:00

точки [.] являются недопустимыми символами в этом контексте =) Имена должны начинаться с буквы, цифры или подчеркивания и содержать только буквы, цифры, цифры, символы подчеркивания ("_"), дефисы ("-") и двоеточия (":" ).

Syllz 19.07.2019 12:12
Ответ принят как подходящий

Решение: Я изменил свой тип статьи, чтобы использовать все поля по умолчанию, но когда я использую конкретный параметр, он использует только несколько необходимых мне полей.

Другие вопросы по теме