我有订单和产品实体
class Order {
/**
* @ORM\OneToMany(targetEntity="Product", mappedBy="order", cascade={"persist", "remove"}))
* @Assert\Valid()
* @Assert\Count(
* min = "1"
* )
*/
protected $products;
}
和
class Product
{
/**
* @ORM\ManyToOne(targetEntity="Order", inversedBy="products")
* @ORM\JoinColumn(name="id_order", referencedColumnName="id", onDelete="CASCADE", nullable=false)
*/
protected $order;
/**
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="id_category", referencedColumnName="id", nullable=false)
*/
protected $category;
/**
* @ORM\ManyToOne(targetEntity="Size")
* @ORM\JoinColumn(name="id_size", referencedColumnName="id", nullable=true)
*/
protected $size;
/**
* @Assert\IsTrue(message = "Please enter a size")
*/
public function isSizeValid()
{
if($this->category->getCode() == 1 && is_null($this->size)) {
return false;
}
return true;
}
}
在我的orderType表单中,我添加了一个ProductTypes集合,其中error_bubbling设置为false。但是当我的isSizeValid为false时,我的表单上没有任何错误消息。
但是当我将error_bubbling设置为true时,错误会显示在表单的顶部。
如何在twig模板中显示每个产品旁边的错误?
答案 0 :(得分:1)
您必须设置选项' error_mapping'在你的形式。
http://symfony.com/doc/current/reference/forms/types/form.html#error-mapping
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'error_mapping' => array(
'isSizeValid' => 'product',
),
));
}
答案 1 :(得分:1)
使用Assert \ Callback函数,这样您就可以将域逻辑放在它的实体中。然后使用error_bubbling = false ,以便错误显示在" size"之上。
use Symfony\Component\Validator\Context\ExecutionContextInterface;
//...
class product
{
//...
/**
* @param ExecutionContextInterface $context
*
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context)
{
//someLogic to define $thereIsAnError as true or false
if($this->category->getCode() == 1 && is_null($this->size)) {
$context->buildViolation('Please enter a size.')
->atPath('size')
->addViolation();
}
}
}
详细了解在http://symfony.com/doc/current/reference/constraints/Callback.html
使用Assert \ Callback如果您仍有问题,请同时发布您的Twig模板。