2014-10-24 3 views
3

У меня есть форма, которая содержит три объекта:Symfony Embedded форма условного Validation

$builder 
    ->add('customer', new CustomerType()) 
    ->add('shippingAddress', new AddressType()) 
    ->add('billingAddress', new AddressType()) 
    ->add('sameAsShipping', 'checkbox', ['mapped' => false]) 
; 

Каждые из вложенных форм имеют свои собственные ограничения проверки, и они работают. В моей основной форме у меня есть cascade_validation => true, так что применяются все встроенные ограничения проверки формы. Это также работает.

У меня возникла проблема «отключение» проверки в форме billingAddress, если включен флажок sameAsShipping10. Я не могу сделать валидацию в форме AddressType условной, потому что ее всегда необходимо применять для формы shippingAddress.

ответ

0

Я решил эту же проблему, используя группы проверки.

Во-первых, это важно: использовать опцию validation_groups в вашем AddressType, чтобы установить группы проверки каждого ограничения каждого поля в типе:

<?php 

use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Form\FormBuilderInterface; 

class AddressType extends \Symfony\Component\Form\AbstractType 
{ 
    function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $groups = $options['validation_groups']; 

     $builder->add('firstName', 'text', ['constraints' => new Assert\NotBlank(['groups' => $groups])]); 
     $builder->add('lastName', 'text', ['constraints' => new Assert\NotBlank(['groups' => $groups])]); 
    } 
} 

Тогда, в родительском виде прохода различные группы валидации для двух полей:

<?php 

$formBuilder = $this->get('form.factory') 
    ->createNamedBuilder('checkout', 'form', null, [ 
     'cascade_validation' => true, 
    ]) 
    ->add('billingAddress', 'address', [ 
     'validation_groups' => 'billingAddress' 
    ]) 
    ->add('shippingAddress', 'address', [ 
     'validation_groups' => 'shippingAddress' 
    ]); 

Затем определите, что вы определяете ваши группы проверки по looki ng при значении флажка.

if ($request->request->get('sameAsShipping')) { 
    $checkoutValidationGroups = ['Default', 'billingAddress']; 
} else { 
    $checkoutValidationGroups = ['Default', 'billingAddress', 'shippingAddress']; 
} 

Вы можете подтвердить только либо billingAddress или shippingAddress, или как с помощью механизма групп проверки.

Я решил использовать кнопку:

$formBuilder->add('submitButton', 'submit', ['validation_groups' => $checkoutValidationGroups]); 
0

Создать форму модели (я использую его в почти каждой форме, но этот код здесь не проверялась):

/** 
* @Assert\GroupSequenceProvider() 
*/ 
class YourForm implements GroupSequenceProviderInterface { 
    /** 
    * @Assert\Valid() 
    */ 
    private $customer; 

    /** 
    * @Assert\Valid() 
    */ 
    private $shippingAddress; 

    /** 
    * @Assert\Valid(groups={'BillingAddressRequired'}) 
    */ 
    private $billingAddress; 

    private $billingSameAsShipping; 

    public function getGroupSequence() { 
    $groups = ['YourForm']; 

    if(!$this->billingSameAsShipping) { 
     $groups[] = 'BillingAddressRequired'; 
    } 

    return $groups; 
    } 
} 

Попробуйте использовать значащие имена. sameAsShipping трудно понять. Прочтите if-условие в getGroupSequence: если нет биллинга (адрес), то такой же, как и доставка (адрес), тогда необходимо указать платежный адрес.

Вот и все, ясный код, на мой взгляд.