我正在尝试验证Collection中的字段。
集合涉及公司区域并与公司字段集绑定
验证需要检查数据库中该公司的“区域名称”是否存在。
我正在尝试使用我的集合元素'area_name'中的Callback验证器来实现这一点,我的问题是集合只知道它自己的上下文,这意味着所有与Area相关的字段但不知道公司上下文,所以我无法通过公司的父母过滤我的验证人。
有没有办法访问集合的父上下文?或者我是否需要初始化我的表单,在验证之前将公司对象传递给集合?
编辑:我忘了提到我正在使用Doctrine2所以我不确定是否可以使用与ZF2捆绑的Db_NoRecordExists Validator
答案 0 :(得分:0)
这是一个老问题,你可能已经解决了这个问题,但最近我遇到了类似的问题。
您可以在区域模型/服务中创建一个函数:validateAreaCompanyRelation(area,company),在您的fieldset中使用回调来使用它:
AreaService类: 添加一个方法,根据限制为1行的查询返回true或false。 就我而言,它是这样的:
public function validateAreaCompanyRelation($company, $area)
{
$result = false;
$count = $this->getRepository()
->createQueryBuilder('q')
->select('q')
->innerJoin('q.company', 'c')
->innerJoin('q.area','b')
->where('b.id = :area and c.company = :company')
->setParameter('area',$area)
->setParameter('company',$area)
->setMaxResults( 1 )
->getQuery()
->getArrayResult();
if(count($count) <>1){
$result=true;
}
return $result;
}
区域字段设置: 将AreaService注入字段集(将其传递给工厂中的构造)
class AreaFieldset extends Fieldset implements InputFilterProviderInterface
{
private $areaService;
public function __construct(areaServiceEntityService $areaService)
{
$this->areaService = $areaService;
}
public function init()
{
$this->add(
array(
'name' => 'area',
'filters' => array(),
'validators' => array (
array(
'name' => 'Zend\Validator\Callback',
'options' => array(
'messages' => array(
\Zend\Validator\Callback::INVALID_VALUE => 'Your custom error message',
),
'callback' => array($this,'vlidateUniqueRelation'),
),
),
)
)
);
array(
'name' => 'company',
'filters' => array(),
'validators' => array (
array(
'name' => 'Zend\Validator\Callback',
'options' => array(
'messages' => array(
\Zend\Validator\Callback::INVALID_VALUE => 'Your custom error message',,
),
'callback' => array($this,'vlidateUniqueRelation'),
),
),
)
)
);
}
public function vlidateUniqueRelation($value, $context)
{
// $value = value
// $context['xxxx'] = xxxxx value
// Logic to validate goes here
$context["company"]
$context["area"]
return $this->AreaService->validateAreaCompanyRelation($context["company"], $context["Area"]);
}