Как проверить правильность выбора, извлеченного из базы данных, а затем переведенного в symfony2? - PullRequest
3 голосов
/ 19 марта 2012

** обновление **

Я каким-то образом нашел способ установить опцию обратного вызова выбора валидатора:

Часть моего 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 Ответ

1 голос
/ 22 октября 2015

На самом деле нет необходимости добавлять ограничение 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 вы увидите переведенное Category :: title value.

...