Symfony show EventListener изменения в форме - PullRequest
0 голосов
/ 31 мая 2018

Я использую Symfony 3.4 и доктрину, и у меня проблема с данными, измененными слушателем событий.

Если форма отправлена ​​и DoTrine PreUpdate EventLister изменяет значение сущности, это не отображается в форме.

Пример с сущностью с именем Activity, которая имеет атрибут $ number:

/**
 * @ORM\Entity
 * @ORM\Table(name="activity")
 * @ORM\EntityListeners({"ActivityListener"})
 */
class Activity
{
  /**
   * @ORM\Column(type="integer")
   */
  private $number ;

  ...
  Getters, Setters an other stuff...
}

И прослушиватель событий:

class ActivityListener
{
  // Events
  public function get()
  {
    return ( ['preUpdate']);
  }

  public function preUpdate(Activity $activity, LifecycleEventArgs $args)
  {
    $activity->setNumber(1) ;
  }
}

Обработка формы в контроллере, при условии, что я отправил форму с, например, 0 в качестве значения для моего числового поля:

class ActivityController
{
  ...
  // Create form and handle request
  $form = $this->createForm (ActivityForm::class, $activity) ;   
  $this->form->handleRequest ( $this->request ) ;
  if ( $this->form->isSubmitted() )
  {
    // $activity->number == 0 as entred in HTML Form
    $this->em->persist($activity) ; 
    $this->em->flush();
    // $activity->number == 1 as set in PreUpdate Event
  }
  $this->view = $this->form->createView () ;
  ...
}

Таким образом, поле «число» правильно установлено в EventListener и правильно сохранено в базе данных.

Но форма отображается с «0» в поле числа, вероятно, потому что значения уже полученыс помощью команды createForm?

Как мне добиться, чтобы новое значение, которое мой прослушиватель событий записал в сущность, правильно отображалось в форме?

Спасибо и С уважением, Саша

Ответы [ 2 ]

0 голосов
/ 21 июля 2018

Я нашел решение для моей проблемы.После сохранения сущности я просто воссоздаю форму, чтобы она содержала измененные значения.

Примерно так в контроллере, который обрабатывает отправку формы:

$this->form->handleRequest ( $this->request ) ;
if ($this->form->isValid() )
{
  // Persist data 
  $this->em->persist($this->entity) ;
  // At this point, entity data has been modified by PreUpdate Event
  $this->em->flush();
  $this->flashbag->add ( 'success', $this->translator->trans('form.info.save') ) ;

  // Recreate form so the modified data is instantly shown in the form
  $this->createForm (EntityForm::class, $entity ) ;
  $this->view = $this->form->createView () ;
}
0 голосов
/ 01 июня 2018

событие preUpdate происходит после отправки формы, поэтому в форме все еще отображается 0.

Если вы хотите, чтобы оно уже было 1, событие preUpdate не то, чтоВы должны использовать.Вы можете обновить его вручную или установить 1 в качестве значения по умолчанию в поле формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...