我的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());
}
答案 0 :(得分:0)
为了确保嵌套验证,我们需要将Valid
约束添加到包含集合的属性中。 (你已经做过)
进一步请注意:
默认情况下,为集合启用error_bubbling选项 字段类型,将错误传递给父表单。如果你想 将错误附加到您实际发生的位置 将error_bubbling设置为false
请不要忘记在引入新注释后清除缓存(symfony和您的操作码缓存)。