我有一个常规的formType,带有一些非必需的,可空的元素,如:
->add('mytime', TimeType::class, array(
'input' => 'datetime',
'widget' => 'single_text',
"required" => false
))
在实体中:
/**
* @var \DateTime
*
* @ORM\Column(name="mytime", type="time", nullable=true)
*/
private $mytime = null;
如果我在插入新记录时没有定义它,它可以工作 - 它是NULL
。但是如果我确定它并稍后尝试通过更新表单来删除它,它就不会更新并保持它的价值。
在我检查的isValid()
区块中:
$data = $editForm->all();
print_r($data['mytime']->getData());
它实际上是空的。在实体中相同:
$entity->getMyTime()
是空的。但是当我
$em->persist($entity);
$em->flush();
mytime
仍有其旧值。
我错过了什么?
[编辑]按要求,完整的控制器代码:
public function myFunctionAction(Request $request ,$id, $to) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository(Day::class)->find($id);
$editForm = $this->createForm(new DayType(), $entity);
$editForm->add('submit', 'submit', array('label' => 'Update'));
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
$em->persist($entity);
$em->flush();
}
return array(
'entity' => $entity,
'to' => $to,
'edit_form' => $editForm->createView(),
);
}
[EDIT2]
在对我从答案中得到的想法进行一些测试之后,我在isValid()
部分尝试了这个:
if(is_null($entity->getMyTime()) || empty($entity->getMyTime()))
$entity->SetMyTime((new \DateTime())->setTime(00, 00));
所以,它将时间设置为00,我可能会使用它......但是:
- 重新加载时的页面仍显示旧值。我认为这是正常的,因为$editForm
在isValid()
之前被宣布(显然)并且没有更新。
- 它远非理想,因为在DB中存储00:00与NULL无关。
答案 0 :(得分:1)
你能尝试(第二次编辑):
...
$editForm->get('mytime')->setData(new \DateTime());
...
if ($editForm->isSubmitted() && $editForm->isValid()) {
$em->persist($entity);
$em->flush();
}
我认为这是正确的代码。目前在您发布的代码中,您不对表单或实体执行任何操作,因此没有任何更改。您需要对表单或实体执行某些操作,然后保留并刷新它以查看数据库中的任何内容。
上面的代码可能不起作用,但试一试,希望你能得到这个想法。
答案 1 :(得分:1)
if ($editForm->isSubmitted() && $editForm->isValid()) {
if(is_null($entity->getmytime()) || empty($entity->getmytime())) {
$entity->setMytime(null);
}
$em->persist($entity);
$em->flush();
}
我认为上面的代码可能有效。试试吧。希望它有效。
谢谢&问候。