Symfony2删除FormType中的空字段

时间:2016-02-09 14:52:05

标签: php symfony

我的Symfony2 FormType中有一个onPreSubmit。

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);
}

目的是删除一个数组值,如果这个中的某个fiels为空(有效)

但是当我设置数据时,我有这个错误:

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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

正如评论中所说,您应该在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);
            }
        }
    }
}

请参阅学说文档的Events部分。

我希望你能使用这个解决方案,并确保它有效。