【发布时间】:2014-02-12 03:23:04
【问题描述】:
[Documentation about collection] 当嵌入表单(集合类型)可以根据当前项目为每个项目指定验证组时? ATM 好像不行。
TaskType 表单添加标签集合:
// src/Acme/TaskBundle/Form/Type/TaskType.php
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
// ...
$builder->add('tags', 'collection', array(
// ...
'by_reference' => false,
));
}
例如,我们有两个标签(标签 1 和标签 2),并使用“添加”按钮(通过 JavaScript)添加了一个新标签:
-----------
| add tag |
-----------
- tag 1 (existing)
- tag 2 (added clicking the "add tag" button)
标签 1 应针对 Default、Edit 组进行验证,而标签 2 仅针对 Default 组进行验证。
TagType 定义动态验证组的表单
根据基础数据,如果标签是新的,它得到Default组,如果存在Default,Create组:
// ...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function (FormInterface $form) {
$tag = $form->getData();
$groups = array('Default');
if (null !== $tag && null !== $tag->getId()) {
$groups[] = 'Edit';
}
return $groups;
}
));
}
// ...
Tag“编辑”组中具有约束的实体
Tag 定义两个属性的示例(省略了访问器):
class Tag
{
/**
* @Assert\NotBlank()
*/
protected $name;
/**
* @Assert\NotBlank(groups={"Edit"})
* @Assert\Length(max="255")
*/
protected $description;
// ...
}
对于现有标签:描述不应为空。对于新标签:描述可以为空。
证明形式有效,验证器显示错误(错误!)
只需编辑现有标签并将说明留空即可。 表单验证,但验证器服务显示错误:
$form = $this->createForm('task', $task)
->handleRequest($request);
$validator = $this->get('validator');
if ($form->isValid()) {
foreach ($task->getTags() as $tag) {
// Validate against Default, Edit groups
$errors = $validator->validate($tag, array('Default', 'Edit'));
if (null !== $tag && null !== $tag->getId()) {
echo 'Existing tag #'.$tag->getId();
} else {
echo 'New tag';
}
echo ', errors: '.count($errors).'<br>';
}
die('Form is valid.')
// ...
}
输出:
Existing tag #863, errors: 1
Form is valid.
更新 1:我已经尝试(但没有成功)使用静态方法 determineValidationGroups 建议 here:
public static function determineValidationGroups(FormInterface $form)
{
$groups = array('Default');
if ($form->getData() !== null && null !== $form->getData()->getId())
{
$groups = array('Edit');
}
var_dump($groups);
return $groups;
}
以TagType 形式:
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
// ...
'validation_groups' => array(
'Acme\TaskBundle\Entity\Tag',
'determineValidationGroups'
),
));
}
只有一个现有标签和一个使用“添加标签”链接创建的输出似乎是正确的。但是现有标签没有错误,将描述留空:
array (size=1)
0 => string 'Edit' (length=4)
array (size=1)
0 => string 'Edit' (length=4)
rray (size=1)
0 => string 'Default' (length=7)
rray (size=1)
0 => string 'Default' (length=7)
【问题讨论】:
-
请显示您为实体设置验证组的代码
-
@forgottenbas 您好,感谢您的帮助。我已经更新了我的问题。
-
编辑了我的答案以使其更清晰。
标签: php symfony doctrine-orm symfony-forms symfony-2.3