2015-10-20 3 views
0

У меня есть метод FormType.Symfony2 Условная проверка

<?php 
class PostType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array    $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('title') 
      ->add('text') 
      ->add('paymentMethod', 'choice', array(
       'required' => true, 
       'choices' => array(
        'cach' => 'Cach', 
        'check'=> 'Check' 
       ) 
      )) 
      ->add('checkId', 'integer', array(
       'required' => true 
      )) 
      ->add('submit', 'submit'); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'AppBundle\Entity\Post', 
     ]); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_post'; 
    } 
} 
?> 

Поле checkId отображает только тогда, когда выбор «проверка» выбран с полем PAYMENTMETHOD.

Вот JavaScript:

PaymentMethod = { 
    hideCheckId: function(){ 
     $('.check-id').hide(); 
    }, 

    showCheckId: function(){ 
     $('.check-id').fadeIn(); 
    }, 

    whenPaymentMethodChange: function(){ 
     $('#appbundle_post_paymentMethod').on('change', function(){ 
      var method = this.value ; 

      if(method == 'check'){ 
       PaymentMethod.showCheckId(); 
      }else{ 
       PaymentMethod.hideCheckId(); 
      } 
     }) 
    } 
}; 
PaymentMethod.hideCheckId(); 
PaymentMethod.whenPaymentMethodChange(); 

Я хотел бы поле «checkId» быть обязательно TRUE, только если выбран вариант проверки. Как я могу это сделать?

+1

Использование обратного вызова (http://symfony.com/doc/current/reference/constraints/Callback.html) или выражение (http://symfony.com/doc/current/reference/constraints/Expression .html) validator –

ответ

0

Ok спасибо, вот это решение для всех:

Добавить функцию обратного вызова метода в классе сущностей.

/** 
    * @param ExecutionContextInterface $context 
    * @Assert\Callback() 
    */ 
    public function isPaymentIsCheck(ExecutionContextInterface $context) 
    { 
     if ($this->getPaymentMethod() == 'check' and $this->getCheckId() == '') { 
      $context->buildViolation('A check ID as to be defined') 
       ->atPath('checkID') 
       ->addViolation(); 
     } 
    } 

Не забудьте добавить Assert и ExecutionContextInterface компонент в вас классе сущностей:

use Symfony\Component\Validator\Constraints as Assert;  
use Symfony\Component\Validator\Context\ExecutionContextInterface; 

И, наконец, не забудьте отобразить ошибки в шаблоне веточку:

{% if form.vars.errors|length %} 
     <div class="alert alert-danger">{{ form_errors(form) }}</div> 
    {% endif %} 

Надеюсь, это поможет вам.

Больше информации здесь: http://symfony.com/doc/current/reference/constraints/Callback.html

0

Что KevinR написал бы определенно решить вашу проблему, но, на мой взгляд, есть даже чистое решение:

http://symfony.com/doc/current/book/validation.html#group-sequence-providers

Представьте объект пользователя, который может быть нормальный пользователь или премиум пользователь. Когда это премиальный пользователь, некоторые дополнительные ограничения должны быть добавлены к пользовательскому объекту (например, кредитная карта ). Чтобы динамически определить, какие группы должны быть активированы, вы можете создать поставщика групповой последовательности. Во-первых, создать объект и новое ограничение группа под названием Premium:

Это именно ваш, как вы бы решить эту проблему вроде проблемы

public function getGroupSequence() 
{ 
    $groups = array('Post'); //Or array('Default') whichever you prefer 

    if ($this->getPaymentMethod() === 'Check') { 
     $groups[] = 'Check'; 
    } 

    return $groups; 
} 

Конечно, вы должны добавить группу проверки PAYMENTMETHOD свойство в сопоставлении объектов. Вот пример аннотации, для большего количества примеров проверьте ссылку выше.

/** 
* @Assert\IsTrue(groups={"Check"}) 
*/ 
private $checkId; 
Смежные вопросы