**更新**
我已经找到了一种方法来设置选择验证器的回调选项:
我的FormType.php的一部分:
\\ ABCFormType.php
$builder
->add('categories', 'entity', array(
'class' => 'ABCCommonBundle:Category',
'query_builder' => function(\path\to\my\custom\repository\CategoryRepository $repo) {
return $repo->findBaseLevel();
},
'expanded' => true,
'multiple' => true, ));
我的自定义存储库的一部分:
\\ CategoryRepository.php
class CategoryRepository extends NestedTreeRepository
{
private static $baseLevel = null;
public function findCategoriesOfLevel($level = 0)
{
return $this->createQueryBuilder('p')
->where('p.lvl = :level')
->setParameter('level', $level)
->orderBy('p.id', 'ASC');
}
public function __construct(EntityManager $em, ClassMetadata $class)
{
parent::__construct($em, $class);
if (null == self::$baseLevel) {
self::$baseLevel = $this->findBaseLevel()->getQuery()->getResult();
}
}
public function findBaseLevel()
{
return $this->findCategoriesOfLevel(0);
}
public static function getBaseLevel()
{
return self::$baseLevel;
}
现在我有一个静态方法,所以我在选择验证器的回调选项中设置它:
/**
* @ORM\ManyToMany(targetEntity="path\to\Entity\Category")
* @Assert\Choice(callback="\path\to\CategoryRepository::getBaseLevel", min="1")
*
* @var Category
*/
protected $categories;
现在确认已从数据库中提取了正确的“英语”数组,但由于我通过symfony翻译服务将英语类别名称翻译成中文,所以虽然我确实选择了一些选项,但验证总是失败! ! 请帮忙。
答案 0 :(得分:1)
实际上,不需要将Choice约束添加到模型的属性中。 NotBlank约束足以完成这项工作。如果您有一个选择字段类型或从中继承的任何其他类型(实体字段类型继承自选项),那么它将自动验证所选实体是否在给定选项中。
/**
* @ORM\ManyToMany(targetEntity="path\to\Entity\Category")
* @Assert\NotBlank()
*
* @var Category
*/
protected $categories;
所以你的表单看起来像这样:
$builder
->add('categories', 'entity', array(
'class' => 'ABCCommonBundle:Category',
'query_builder' => function(\path\to\my\custom\repository\CategoryRepository $repo) {
return $repo->findBaseLevel();
},
'expanded' => true,
'multiple' => true,
'property' => 'title',
)
);
您可以在此处详细了解 property 选项:http://symfony.com/doc/current/reference/forms/types/entity.html#choice-label
现在呈现的复选框将如下所示:
<input type="checkbox" value="1" /> CategoryTitle
其中value属性将包含类别主键(可能是ID),而不是CategoryTitle,您将看到已翻译的类别::标题值。