如何验证从数据库中获取的选项,然后在symfony2中进行翻译?

时间:2012-03-19 15:26:47

标签: symfony symfony-forms

**更新**

我已经找到了一种方法来设置选择验证器的回调选项:

我的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翻译服务将英语类别名称翻译成中文,所以虽然我确实选择了一些选项,但验证总是失败! ! 请帮忙。

1 个答案:

答案 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,您将看到已翻译的类别::标题值。