Php Symfony2删除FormType中的空字段
我的Symfony2表单类型中有一个OnPremitPhp Symfony2删除FormType中的空字段,php,symfony,Php,Symfony,我的Symfony2表单类型中有一个OnPremit public function onPreSubmit(FormEvent $event) { $data = $event->getData(); // Avoid sending empty RegisterProduct foreach ($data['registerProducts'] as $key => $registerProduct) { if (empty($regi
public function onPreSubmit(FormEvent $event)
{
$data = $event->getData();
// Avoid sending empty RegisterProduct
foreach ($data['registerProducts'] as $key => $registerProduct) {
if (empty($registerProduct['quantity'])) {
unset($data['registerProducts'][ $key ]);
}
}
$event->setData($data);
}
其目的是在数组中的某个字段为空时删除该数组值(该字段有效)
但是当我设置数据时,我有一个错误:
An exception occurred while executing 'INSERT INTO register_product .....
Integrity constraint violation: 1048 Column 'register_id' cannot be null
我不明白为什么
编辑:我尝试了onPostSubmit,但仍然有相同的错误
public function onPostSubmit(FormEvent $event)
{
/** @var Register $register */
$register = $event->getForm()->getData();
foreach ($register->getRegisterProducts() as $registerProduct) {
if ($registerProduct->getQuantity() < 1) {
$register->removeRegisterProduct($registerProduct);
}
}
}
公共函数onPostSubmit(FormEvent$event)
{
/**@var寄存器$Register*/
$register=$event->getForm()->getData();
foreach($register->getRegisterProducts()作为$registerProduct){
如果($registerProduct->getQuantity()<1){
$register->removeRegisterProduct($registerProduct);
}
}
}
正如评论中所说,你应该在
postSubmit
中完成,而不是preSubmit
例如:
public function onPostSubmit(FormEvent $event) {
$data = $event->getData();
foreach ($data['registerProducts'] as $key => $registerProduct) {
if (empty($registerProduct['quantity'])) {
unset($data['registerProducts'][$key]);
}
}
});
如果SQL错误仍然存在,请尝试将$event->getData()
替换为$event->getForm()->getData()
,第一个从客户端返回数据
编辑
不幸的是,FormEvent不起作用
此外,我还建议在您的实体中使用prePersist和preUpdate挂钩。如果您的问题只是关于表单上下文,那么它可能不是您的备选方案 用法:
/**
* @ORM\HasLifecycleCallbacks
* @ORM\Entity
*/
class YourEntity
{
// ...
/**
*
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function manageProducts()
{
foreach ($this->getRegisterProducts() as $registerProduct) {
if ($registerProduct->getQuantity() < 1) {
$this->removeRegisterProduct($registerProduct);
}
}
}
}
/**
*@ORM\HasLifecycleCallbacks
*@ORM\Entity
*/
将您的实体分类
{
// ...
/**
*
*@ORM\PrePersist
*@ORM\PreUpdate
*/
公共职能管理产品()
{
foreach($this->getRegisterProducts()作为$registerProduct){
如果($registerProduct->getQuantity()<1){
$this->removeRegisterProduct($registerProduct);
}
}
}
}
参见条令文件部分
我希望您可以使用此解决方案,并且它能够正常工作。难道不应该在PostSubmit上执行此操作吗?我尝试按照您所说的那样执行此操作,但仍然存在相同的错误。我编辑了我的帖子。您是否尝试过
$event->getData()
和取消设置
?是的,我使用了$event->getData()
。使用onPostSubmit$event
不再向我发送数组,而是发送对象。所以没有unset
。这就是为什么我使用了removeRegisterProduct
@Chalasr您可以尝试与上次编辑相同的代码,但只需将$event->getForm->getData()
替换为$event->getData
?谢谢你告诉我们。