Symfony 2集合类型,验证不起作用和“加法”方法调用NULL值?

时间:2014-01-21 12:28:43

标签: symfony doctrine-orm symfony-forms symfony-2.3

我的Product 实体有一个“加法器”方法(解释为here),用于添加ProductVariant类型的实体:

/**
 * @ORM\OneToMany(targetEntity="ProductVariant", mappedBy="product", 
 *     cascade={"persist"})
 * @Assert\Valid()
 *
 * @var ArrayCollection
 */
protected $variants;

/**
 * @param ProductVariant $variant
 * @return $this
 */
public function addVariant(ProductVariant $variant)
{
    if (!$this->variants->contains($variant)) {
        $this->variants->add($variant->setProduct($this));
    }

    return $this;
}

ProductType 表单类型正在添加ProductVariantType的集合:

$builder->add('variants', 'collection', array(
    'type' => new ProductVariantType(),
    'allow_add'    => true,
    'allow_delete' => true,
    'by_reference' => false, // ensure addVariant and removeVariant calls
));

问题#1(验证):当我添加新变体(使用添加按钮/ JavaScript)时,不会验证新的嵌入表单。如果我留空所有字段(即其中一些是必需的)验证通过。 验证只会填充某些字段

问题#2(addVariant来电):使用addVariant调用NULL,可能是因为问题#1。

一些ProductVariant字段:

/**
 * @ORM\Column(unique=true)
 * @Assert\NotBlank()
 *
 * @var string
 */
protected $code;

/**
 * @ORM\Column(type="integer")
 * @Assert\NotBlank()
 * @Assert\Range(min=0, max=2147483647)
 *
 * @var string
 */
protected $quantity;

我正在使用以下JavaScript添加/删除变体:

<script>
    $(function () {  
        $('.btn-add').click(function(e) {
            e.preventDefault();

            var holder = $('#' + $(this).attr('data-target')),
                proto  = holder.attr('data-prototype')
                            .replace(/__name__/g, holder.children().length - 1);

           holder.append(proto);
        });

    });
</script>

当然,原型:

<div class="tab-pane" id="variants" 
    data-prototype="{{ form_widget(form.variants.vars.prototype)|e }}">
    <div class="panel">
        <div class="panel-body">
            <a href="#" class="btn-add" data-target="variants">Add variant</a>
        </div>
    </div>

    {% for variant in form.variants %}
        {{ form_widget(variant) }}
    {% endfor %}
</div>

最后(简单)控制器代码:

public function editAction(Request $request, Product $product)
{
    $form = $this->createForm('product', $product)
        ->handleRequest($request);

    if ($form->isValid()) {
        $this->getDoctrine()->getManager()
            ->flush();

        return $this->redirect(
            $this->generateUrl(
                'me_test_product_edit',
                array('id' => $product->getId())
            )
        );
    }

    return array('form' => $form->createView());
}

1 个答案:

答案 0 :(得分:0)

为了确保嵌套验证,我们需要将Valid约束添加到包含集合的属性中。 (你已经做过)

进一步请注意:

  

默认情况下,为集合启用error_bubbling选项   字段类型,将错误传递给父表单。如果你想   将错误附加到您实际发生的位置   将error_bubbling设置为false

documentation

请不要忘记在引入新注释后清除缓存(symfony和您的操作码缓存)。