我遇到了FormType中的问题。 基于“Product”实体,this from有一个名为“ProductCriteria”的字段,它是一个基于“ProductCriteriaType”(Form)的集合。
我的productCriteria Model包含一个“已删除”属性,用于处理此实体的逻辑抑制。如果设置为true,那么我不希望productCriteria表单类型显示在产品表单类型中。如果它设置为false,那么我想在产品表单类型中显示它,你得到它。
我已经在我的表格的PRE_SET_DATA事件中写了这个,这非常有效:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
$product = $event->getData();
/** @var PersistentCollection $productCriteriasFields */
$productCriteriasFields = $product->getProductCriterias();
/** @var ProductCriteria $productCriteria */
foreach($productCriteriasFields as $productCriteria){
if($productCriteria->getDeleted()){
$productCriteriasFields->removeElement($productCriteria);
}
}
});
我的字段在表单中设置为true / false,当我访问FormType时,它不会按预期显示delete-true。
唯一的问题是: 当我刚修改'已删除'值时,控制器在表单isValid()时不会重定向到另一个页面。它只是再次呈现FormType,表单DOESNT包含我的修改(但它们在DB中!)。如果我刷新页面(F5),我就有了我想要的修改。 怎么解决这个?我尝试添加一个'POST_SUBMIT'函数,处理这样的表单字段:
$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event){
/** @var Product $data */
$product = $event->getForm()->getData(); //this was supposed to do the trick
$form = $event->getForm();
/** @var ProductCriteria $productCriteria */
for($i = 0; $i < count($product->getProductCriterias()); $i++){
if($product->getProductCriterias()[$i]->getDeleted()){
ladybug_dump("unsetting one field ! ");
unset($form->get('productCriterias')[$i]);
}
}
但没有任何作用。任何的想法?非常感谢。
EDIT 控制器的代码(它是一个抽象的代码:我的项目的archi,而不是一个选择):
/** @var EditableEntityInterface $entity */
$entity = $this->entityService->getEntityById($itemId);
$form = $this->createForm('admin' . $this->entityService->getEntityName(), $entity);
$form->handleRequest($this->get('request'));
$submitSuccess = false;
if ($form->isValid()) {
$this->entityService->save($form->getData());
$submitSuccess = true;
}
$template = $this->getActionTemplate($this->entityService->getEditTemplate());
return $this->render($template, array(
'item' => $entity,
'form' => $form->createView(),
'entityService' => $this->entityService,
'submitSuccess' => $submitSuccess
));
答案 0 :(得分:0)
好的,所以我终于有了工作!问题出在我修改的控制器代码中:
$form->handleRequest($this->get('request'));
$submitSuccess = false;
if ($form->isValid()) {
$this->entityService->save($form->getData());
$submitSuccess = true;
// Data sync hardened !
$entity = $this->entityService->getEntityById($itemId);
$form = $this->createForm('admin' . $this->entityService->getEntityName(), $entity);
}
我强制表单由我们保存的实体重新补充,以确保它不会占用前一个$请求中的先前数据。 但仍然......这是令人难以置信的,我无法通过使用表单事件来实现这一点。该文档非常糟糕,只展示了非常简单的例子。对于那些可能会在表格事件上找到更多信息的人,我可以推荐这个: http://symfony.com/doc/current/components/form/form_events.html#component-form-event-table 并看看核心中的这个类: Symfony的\分量\表格\延期\核心\事件监听\ ResizeFormListener.php 这就是你可以在主FormEvents的表单上做的所有事情。