Подтвердить что ты не робот

Symfony2 - выбор динамической формы - проверка удаления

У меня есть раскрывающийся элемент формы. Первоначально он начинается пустым, но заполняется значениями через javascript после того, как пользователь совершил некоторые взаимодействия. Все работает нормально. Однако, когда я отправляю его, он всегда возвращает ошибку проверки This value is not valid..

Если я добавлю элементы в список выбора в коде формы, он будет проверять ОК, но я пытаюсь занести его динамически, и предварительное добавление элементов в список выбора не будет работать.

Проблема, о которой я думаю, состоит в том, что форма проверяется на пустой список элементов. Я не хочу, чтобы это проверялось против списка вообще. Я установил проверку, требуемую для false. Я переключил тип chocie на текст и всегда проверял.

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

$builder->add('verified_city', 'choice', array(
  'required' =>  false
));

Аналогичный вопрос здесь не ответил.
Проверка динамически загружаемых вариантов в Symfony 2

Скажите, что вы не знаете, что все доступные варианты. Он может быть загружен из внешнего веб-источника?

4b9b3361

Ответ 1

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

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;


public function buildForm(FormBuilderInterface $builder, array $options)
{

  // .. create form code at the top

    $ff = $builder->getFormFactory();

    // function to add 'template' choice field dynamically
    $func = function (FormEvent $e) use ($ff) {
      $data = $e->getData();
      $form = $e->getForm();
      if ($form->has('verified_city')) {
        $form->remove('verified_city');
      }


      // this helps determine what the list of available cities are that we can use
      if ($data instanceof  \Portal\PriceWatchBundle\Entity\PriceWatch) {
        $country = ($data->getVerifiedCountry()) ? $data->getVerifiedCountry() : null;
      }
      else{
        $country = $data['verified_country'];
      }

      // here u can populate choices in a manner u do it in loadChoices use your service in here
      $choices = array('', '','Manchester' => 'Manchester', 'Leeds' => 'Leeds');

      #if (/* some conditions etc */)
      #{
      #  $choices = array('3' => '3', '4' => '4');
      #}
      $form->add($ff->createNamed('verified_city', 'choice', null, compact('choices')));
    };

    // Register the function above as EventListener on PreSet and PreBind

    // This is called when form first init - not needed in this example
    #$builder->addEventListener(FormEvents::PRE_SET_DATA, $func); 

    // called just before validation 
    $builder->addEventListener(FormEvents::PRE_BIND, $func);  

}

Ответ 2

Проверка выполняется компонентом Validator: http://symfony.com/doc/current/book/validation.html.

Параметр required на уровне формы используется для управления атрибутом HTML5 required, поэтому он ничего не изменит для вас, и это нормально.

Что вам нужно сделать, так это настроить уровень проверки в соответствии с приведенной выше документацией.

Ответ 3

Нашел лучшее решение, которое я разместил здесь: Отключить проверку подлинности для поля выбора в Symfony 2 Тип

Старый ответ:

Просто потратил несколько часов на решение этой проблемы. Этот тип выбора действительно раздражает. Мое решение похоже на ваше, может быть, немного короче. Конечно, это взлом, но что вы можете сделать...

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('place', 'choice'); //don't validate that

    //... more form fields

   //before submit remove the field and set the submitted choice as
   //"static" choices to make "ChoiceToValueTransformer" happy
   $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $data = $event->getData();
        $form = $event->getForm();
        if ($form->has('place')) {
            $form->remove('place');
        }

        $form->add('place', 'choice', array(
            'choices' => array($data['place']=>'Whatever'),
        ));
    });
}

Ответ 4

Обновление в Validations.yml

Просьба обновить файл Validation.yml в следующем формате: установка имен групп в каждом поле

 
         password:
            - NotBlank: { message: Please enter password ,groups: [Default]}
Update in Form Type /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'RegistrationBundle\Entity\sf_members', 'validation_groups' => function(FormInterface $form){
$data = $form->getData();
$member_id = $data->getMemberId();

// Block of code; // starts Here :

if( condition == 'edit profile') { return array('edit'); } else { return array('Default'); } },

код >

Обновление в сущности /** * @var string * * @ORM\Column(name="password", type="text") * @Assert\Regex( * pattern="/(?i)^(?=.[a-zA-Z])(?=.\d).{8,}$/", * match=true, * message="Your password must be at least 8 characters, including at least one number and one letter", * groups={"Default","edit"} * ) */
private $password;

Ответ 5

Добавьте этот метод внутри buildForm в свой класс типа формы, чтобы вы могли проверить значение поля ввода, а не выбор из значения поля выбора;

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,

    function (FormEvent $event) {
        $form = $event->getForm();

        if ($form->has('verified_city')) {
            $form->remove('verified_city');
            $form->add(
                'verified_city', 
                'text', 
                ['required' => false]
            )
        }
    }
);