Динамические валидационные группы в Symfony2 - PullRequest
1 голос
/ 14 февраля 2012

Мне нужно реализовать проверку формы в зависимости от представленных данных. Хотя свойство invoice объекта данных имеет значение true, массив validation_groups должен содержать не только проверку «add», но и «company».

Я нашел главу "Группы на основе предоставленных данных" в Symfony Docs https://github.com/symfony/symfony-docs/blob/master/book/forms.rst.

Проблема в том, что:

public function getDefaultOptions(array $options)
{
    return array(
        'data_class' => 'Strict\PublicBundle\Entity\Booking',
        'validation_groups' => function(FormInterface $form)
        {
              return array('booking');
        },
    );
}

выдает эту ошибку:

Предупреждение. Недопустимый тип смещения в /var/www/vendor/symfony/src/Symfony/Component/Validator/GraphWalker.php строке 101 500 Внутренняя ошибка сервера - ErrorException

Есть идеи, что может быть не так?

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Согласно этот запрос на получение с использованием обратных вызовов для validation_groups будет возможен в Symfony 2.1 (еще не выпущен, в настоящее время master ответвление).

Вы уверены, что используете основную ветку? Если вы используете текущую стабильную версию (2.0.x), она не поддерживает групп на основе представленных данных , вам нужно использовать только массивы. См. Соответствующую документацию на http://symfony.com/doc/current/book/forms.html#book-forms-validation-groups.

2 голосов
/ 24 мая 2012

У меня есть альтернатива: если вы можете определить условие до привязки формы, вы можете просто переопределить список групп проверки по умолчанию при создании формы.

В моем случае у меня есть объект заказа в сеансе, который обновляется на нескольких страницах формы. Заказ может быть «Доставка» или «Самовывоз», и если доставка была выбрана на предыдущем экране, мне нужно проверить детали адреса на этом экране:

if ($order->getOrderType() == "Delivery")
    {
        $validationGroups = array('step3', 'delivery');
    }
    else
    {
        $validationGroups = array('step3');
    }

    $formType = new Form\Order3Type();
    $form = $this->createForm($formType, $order, array("validation_groups" => $validationGroups));
    $form->bindRequest($request);

Если ваше условие в форме, а не в сеансе, вы всегда можете просто извлечь значение прямо из объекта запроса.

1 голос
/ 12 июля 2016
// MyFormType.php
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => 'Strict\PublicBundle\Entity\Booking',
        'validation_groups' => function (FormInterface $form) {
            $data = $form->getData();

            $groups = ['booking'];

            if ($data->invoice) {
                $groups[] = 'company';
            }

            return $groups;
        },
    ]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...