2012-02-14 2 views
1

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

Я нашел раздел «Группы на основе отправленных данных» в документе 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'); 
     }, 
    ); 
} 

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

Warning: Illegal offset type in /var/www/vendor/symfony/src/Symfony/Component/Validator/GraphWalker.php line 101 500 Internal Server Error - ErrorException

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

ответ

3

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

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

2

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

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

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
// 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; 
     }, 
    ]); 
} 
Смежные вопросы