如何在FormEvents::PRE_SUBMIT事件中添加计算字段
在我的侦听器中,我需要在如何在FormEvents::PRE_SUBMIT事件中添加计算字段,events,listener,symfony-forms,symfony,Events,Listener,Symfony Forms,Symfony,在我的侦听器中,我需要在FormEvents::PRE_SUBMIT事件中访问我的实体。在POST_SET_DATA中,这没有问题,只需使用$event->getData() 因此,对于收听POST\u SET\u DATA的事件,我可以接受以下代码: public function postSetData(FormEvent $event) { $form = $event->getForm(); $day = $event->getData(); $tot
FormEvents::PRE_SUBMIT
事件中访问我的实体。在POST_SET_DATA
中,这没有问题,只需使用$event->getData()代码>
因此,对于收听POST\u SET\u DATA
的事件,我可以接受以下代码:
public function postSetData(FormEvent $event)
{
$form = $event->getForm();
$day = $event->getData();
$total = $this->dayManager->calculateTotal($day); // Passing a Day object, yay!
$form->get('total')->setData($total);
}
但是,在我的PRE_SUBMIT
事件方法中
我需要这个函数,因为在提交时,总计不是用新提交的数据计算的
正如你所看到的,它是有效的。然而,这是一个如此黑客的方式,我不相信专业的这样做。这里有两个问题:
- 无法在
preSubmit
功能中使用实体Day
对象
- 必须在
dayManager
- 与
preSubmit
函数中的原始事件数组匹配的丑陋代码
因此,主要问题是:如何在提交前表单事件中从表单获取更新的日期对象。使用提交而不是提交前
别担心,表单还没有提交,SUBMIT
就在form::SUBMIT
你为什么会遇到这个问题?
PRE_SUBMIT
中的所有数据尚未规范化为您的常用对象
如果您想了解更多有关整个事件的信息,请访问:感谢@galeaspablo提交答案!然而,我在我的代码下面添加了如何解决我的特定问题
我的目标是在表单中显示计算出的总字段。没别的了。但是在SUBMIT
事件中,您不能执行$form->get('total')->setData($total)代码>。您将收到一条警告:您无法更改已提交表单的数据。
因此,在提交前修改表单是不可能的。但是添加字段是
我的完整解决方案如下:
在DayType formbuilder中:
// Will add total field via subscriber
//->add('total', TimeType::class, ['mapped' => false])
在事件订阅服务器中:
class CalculateDayTotalFieldSubscriber implements EventSubscriberInterface
{
private $dayManager;
public function __construct(DayManager $dayManager)
{
$this->dayManager = $dayManager;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::SUBMIT => 'addTotalField',
FormEvents::POST_SET_DATA => 'addTotalField'
);
}
public function addTotalField(FormEvent $event)
{
$form = $event->getForm();
$day = $event->getData();
$total = $this->dayManager->calculateTotal($day);
$form->add('total', TimeType::class, ['mapped' => false, 'data' => $total]);
}
}
请注意,SUBMIT
和POST\u SET\u DATA
事件都使用了保存功能。一本好书是:Hi@galeaspablo,谢谢你的回答。我已经知道我需要使用::SUBMIT,但是你是第一个给出答案的人!所以你得到了学分;-)我将在下面添加一个答案,说明我是如何在代码库中解决它的。
class CalculateDayTotalFieldSubscriber implements EventSubscriberInterface
{
private $dayManager;
public function __construct(DayManager $dayManager)
{
$this->dayManager = $dayManager;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::SUBMIT => 'addTotalField',
FormEvents::POST_SET_DATA => 'addTotalField'
);
}
public function addTotalField(FormEvent $event)
{
$form = $event->getForm();
$day = $event->getData();
$total = $this->dayManager->calculateTotal($day);
$form->add('total', TimeType::class, ['mapped' => false, 'data' => $total]);
}
}