2015-05-06 3 views
3

Это моя форма настройки сущности,Как выполнить проверку условной формы, которая основана на данных пользователя, представленных в symfony2?

class SettingType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('key') 
      ->add('values', 'collection', array(
       'allow_add' => true, 
       'allow_delete' => true, 
      )) 
      ->add('parent') 
      ->add('settingCategory') 
      ->add('user') 
      ->add('settingOption') 
     ; 


     $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { 

      $setting = $event->getData(); 

      if ($parent = $setting->getParent()) { 
       $setting->setKey($parent->getKey()); 
       $setting->setSettingCategory($parent->getSettingCategory()); 
       $event->setData($setting); 
      } 
     }); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\SettingBundle\Entity\Setting', 
      'csrf_protection' => false 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'setting'; 
    } 
} 

Я вношу данные формы запроса REST POST. например для установки приложений по умолчанию,

{ 
    "setting" : 
    { 
     "key": "setting1", 
     "values": ["setting1va1", "setting1va2"], 
     "settingCategory": 1 
    } 
} 

Теперь переопределяет этот параметр для пользователя, чтобы выбрать другое значение

{ 
    "setting" : 
    { 
     "values": ["setting1va1"], 
     "user":44319, 
     "parent": 1 
    } 
} 

так вот, как вы можете видеть в форме, если родитель установлен, ключ и settingCategory унаследован от родительский объект установки.

Я хочу «ключ» и «settingCategory» required (NotBlank), если parent имеет значение NULL, но если родитель установлен, тогда «ключ» и «установка категории» не являются обязательными.

Как это сделать в symfony?

ответ

3

Я предлагаю вам использовать callback validator

В качестве примера в своем классе сущностей:

<?php 

use Symfony\Component\Validator\Constraints as Assert; 

/** 
* @Assert\Callback(methods={"validateParent"}) 
*/ 
class Setting { 



    public function validateParent(ExecutionContextInterface $context) 
    { 
     if (
       $this->getParent() // NOT NULL 
       && 
       (// ONE OF THIS IS BLANK 
        ($parent->getSettingCategory() && trim($parent->getSettingCategory()=='')) 
         || 
        ($parent->getKey() && trim($parent->getKey()=='')) 
       ) 
      ) 
     { 
      $context->addViolation('mandatory params'); 
     } 
    } 
} 

В противном случае вы можете создать свой собственный валидатор как описано here.

Сообщите мне, что вам нужно больше информации.

Надеюсь, что эта помощь

+0

Отлично, это сработало! – vishal

+0

Спасибо @vishal в большинстве случаев - это быстрые решения (вы можете объединить его с группой валидатора и т. Д.), Когда-нибудь лучше построить пользовательский валидатор, но не кажется вашей ситуацией – Matteo

0

docs Предоставить все необходимое, включая код. В вашем типе вы можете сделать что-то вроде:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'validation_groups' => function(FormInterface $form) { 
      $data = $form->getData(); 
      if (Client::TYPE_PERSON == $data->getType()) { 
       return array('person'); 
      } 

      return array('company'); 
     }, 
    )); 
} 
Смежные вопросы