我正在使用Symfony 2.0.4中的回调验证器来验证嵌入表单的集合。我正在尝试查看其中一个表单的字段是否以任何形式重复,如果是,则在该字段上添加错误。
这是代码:
/**
* @Assert\Callback(methods={"isPriceUnique"})
*/
class Pricing {
protected $defaultPrice;
protected $prices;
public function isPriceUnique(ExecutionContext $context){
//Get the path to the field that represents the price collection
$propertyPath = $context->getPropertyPath().'.defaultPrice';
$addedPrices = $this->getPrices();
\array_unshift($addedPrices, $this->getDefaultPrice());
for($i=0; $i<\count($addedPrices); $i++){
$price=$addedPrices[$i];
$country=$price->getCountry();
//Check for duplicate pricing options(whose country has been selected already)
if($i<\count($addedPrices)-1){
for($j=$i+1; $j<\count($addedPrices); $j++){
if(\strcmp($country, $addedPrices[$j]->getCountry())==0){
$context->setPropertyPath($propertyPath.'.'.$j.'.country');
$context->addViolation('product.prices.unique', array(), null);
break;
}
}
}
}
}
$ prices字段是Price实体的数组,每个实体都具有country属性。国家/地区也会添加到表单类型中
我想仅在country属性上添加错误,但似乎Symfony不允许我指定比$ propertyPath更复杂的东西。'。field'。
谁能告诉我$ propertyPath的语法是哪个允许我在层次结构的较低层指定字段集?
似乎验证已正确完成,在研究了PropertyPath类构造函数后,我确定我使用的路径是正确的。问题是指定的消息未按预期显示在国家/地区字段中。
答案 0 :(得分:0)
您可以使用$context->addViolationAt()
http://symfony.com/doc/2.2/reference/constraints/Callback.html#the-callback-method