2017-02-20 33 views
0

У меня есть 3 Entities: Статья, Автор, Reivews:В Symfony: Как вставить форму в связанную с ней сущность без включения поля внешнего ключа (заполнить это при отправке)?

отношений:

  • Статья имеет один автор.
  • В статье много отзывов.
  • У автора много статей.
  • Обзор имеет один автор.
  • Обзор имеет один артикул.

Авторы создают как статьи, так и обзоры. Это пользователи приложения.

Я пытаюсь внедрить смесь объектов Author, Article и AND в представлении SHOW статьи. Но только те материалы, которые предоставят пользователи (авторы).

Пример использования примера: пользователь (автор) находится в представлении SHOW статьи. Он будет предложено оставить отзыв и форма содержит поля:

  • рейтинг (Обзор Entity)
  • обзор Название (Обзор Entity)
  • имя (Автор Entity)
  • электронной почты (Автор Entity)

Уведомление о том, что НЕ ДОЛЖНО отображать любые поля, запрашиваемые в статье! В какой-то момент мы сможем захватить это за кулисами и заполнить новый код статьи review_id в коде.

Я работал над этим некоторое время, и я думаю, что это должно что-то сделать с формами и событиями? Вот где я нахожусь (это недалеко ...)

В этой попытке я рассматривал возможность получения полей для автопопуляции, а затем использование скрытых полей .... Я бы МНОГО ОТНОСИТЕЛЬНО НЕ СДЕЛАЛ ЭТО. Я не люблю давать людям шанс, чтобы иметь возможность манипулировать article_id

class ReviewType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder->add('review')->add('title'); 

     //$builder->add('article', HiddenType::class); 

     $builder->add('author', AuthorType::class, array("label" => FALSE)); 

     $builder->add('rating', ChoiceType::class, array(
      'choices' => array('1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' =>'5'), 
      'expanded' => true, 
      'multiple' => false 
     )); 

     $builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function (\Symfony\Component\Form\FormEvent $event) { 
       $form = $event->getForm(); 
       $data = $event->getData(); 

       $article = $data->getArticle(); 
       $articleId = null === $article ? array() : $article->getId(); 
       $form->add('article', ArticleType::class, array("label" => FALSE)); 

      } 
     ); 

    } 

Спасибо заранее за любой вклад, вы можете предоставить !!!

ответ

0

Необходимо изменить действие вашей формы, сгенерированное и отображаемое в article/{id}/show, на что-то вроде article/{id}/review, а затем получить идентификатор статьи в соответствующем действии, где вы управляете отправкой и сохранением формы. Я думаю, что это не вопрос событий формы.

+0

Спасибо! Это блестящая идея. Поэтому, если вы не возражаете, позвольте мне прояснить некоторые вещи, которые я все еще путаю: мы все равно построим форму в ArticleType-> buildForm правильно? Если я добавлю в автору и элементы формы обзора, это не испортит мою стандартную форму добавления/редактирования статьи? Я не уверен, как справиться с этим. Еще раз спасибо! – user2305673

+0

Да, вы можете создать форму как обычно. Вы должны удалить поле 'author' из' ReviewType' и 'addEventListener'. Затем вы можете установить идентификатор автора и идентификатор статьи в контроллере, где вы управляете постоянством обзора. Почему -1? – ste

+0

Хорошо, это прекрасно, спасибо за помощь. Я не уверен, почему/кто дал downvote. Вонючий, они даже не дали причины, но ваше решение отлично работает для меня. – user2305673