【发布时间】:2014-11-18 15:58:14
【问题描述】:
我有 3 个未映射到 FormType 的下拉菜单,我正在绘制这些表单元素。
ContentType - 区域 - 语言
ContentType 可以采用 2 个值 - 标准或区域。当我选择标准时,我不希望验证区域下拉列表。但选择区域ContentType时应验证。区域和语言是动态填充的。
我无法遵循条件验证,我认为这不是我的方案的解决方案。
$brandId = $options['brandId'];
$builder
->add('contentType', 'choice', array(
'mapped' => false,
'empty_value' => 'Select Content Type',
'choices' => array(
'standard' => 'Standard',
'regional' => 'Regional'
),
'required' => true,
'multiple' => false,
'expanded' => false
))
->add('language', 'entity', array(
'required' => false,
'mapped' => false,
'empty_value' => 'Select Language',
'multiple' => false,
'class' => 'Bundle:Language',
'property' => 'title',
'query_builder' => function(EntityRepository $er) use($brandId) {
return $er->createQueryBuilder('l')
->join('l.regions', 'lr')
->join('lr.brands', 'lrb')
->where('lrb.id = :currentBrandId')
->setParameter('currentBrandId', $brandId);
}
))
->add('regionSelection', 'entity', array(
'required' => false,
'mapped' => false,
'empty_value' => 'Select Region',
'empty_data' => null,
'multiple' => false,
'class' => 'Bundle:Region',
'property' => 'title',
'query_builder' => function(EntityRepository $er) use($brandId) {
return $er->createQueryBuilder('r')
->join('r.brands', 'rb')
->where('rb.id = :currentBrandId')
->setParameter('currentBrandId', $brandId);
}
));
我们将不胜感激。
编辑
所以我尝试通过回调向表单生成器添加约束:
->add('regionSelection', 'entity', array(
'constraints' => array(
new Assert\Callback(array(array($this, 'validateRegion')))
),
'mapped' => false,
'empty_value' => 'Select Region',
'empty_data' => null,
'multiple' => false,
'class' => 'Bundle:Region',
'property' => 'title',
'query_builder' => function(EntityRepository $er) use($brandId) {
return $er->createQueryBuilder('r')
->join('r.brands', 'rb')
->where('rb.id = :currentBrandId')
->setParameter('currentBrandId', $brandId);
}
));
调用如下:
public function validateRegion($value, ExecutionContextInterface $context)
{
//I am trying to check here if the contentType's selected value = 'regional' and no //region is selected then the following code executes.
$context->addViolationAt('regionSelection', 'There is already an event during this time!');
}
我现在的问题是因为我将 $this 传递给回调函数,所以我找不到如何访问 contentFormType 字段。
【问题讨论】:
-
这些示例都显示了对实体字段等的验证。如果您在上面看到我的代码片段,我正在尝试自定义验证未映射的字段。无论我看到什么,fr 都无济于事。
标签: validation symfony symfony-forms symfony-2.3