Разрешить все значения для выбранного типа поля в конструкторе форм Symfony2

У меня есть проблема на некоторое время, и я много читал по этой теме с похожей проблемой, но не могу реализовать ответы в моем случае.

У меня есть поле выбора, которое я заполняю с помощью Ajax. поэтому в моем конструкторе форм у меня есть этот код:

VilleType.php

/**
 * @ORM\Entity(repositoryClass="MDB\AnnonceBundle\Entity\RegisterRepository")
 */
class VilleType extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('nomComplet', 'choice'
        );
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'MDB\AdresseBundle\Entity\Ville'
        ));
    }

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

}

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

Итак, мой вопрос заключается в том, как отключить проверку этого поля в Symfony. Или позвольте ему принимать все значения.

Спасибо

ИЗМЕНИТЬ

Здесь я попробовал новый подход. Я использую прослушиватель событий, чтобы изменить свое поле со значением, отличным от отправленного пользователем.

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

        $builder
                ->add('nomComplet', 'choice');


        $builder->get('nomComplet')->addEventListener(
                FormEvents::PRE_SUBMIT, function(FormEvent $event) /* use ($formModifier) */ {

                    $ville = $event->getData();
                    $event->getForm()->add('nomComplet', 'choice', array('choices' => $ville));
                    // $formModifier($event->getForm()->getParent(), $ville);
                }
        );
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'MDB\AdresseBundle\Entity\Ville'
        ));
    }

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

}

MDB\AdresseBundle\Entity\Ville.php

<?php

namespace MDB\AdresseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Ville
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="MDB\AdresseBundle\Entity\VilleRepository");
 */
class Ville
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nomComplet", type="string", length=255)
     */
    private $nomComplet;

    /**
     * @var string
     *
     * @ORM\Column(name="nomClean", type="string", length=255)
     */
    private $nomClean;


    /**
     * @var array
     *
     * @ORM\Column(name="cp", type="simple_array")
     */
    private $cp;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nomComplet
     *
     * @param string $nomComplet
     * @return Ville
     */
    public function setNomComplet($nomComplet)
    {
        $this->nomComplet = $nomComplet;

        return $this;
    }

    /**
     * Get nomComplet
     *
     * @return string 
     */
    public function getNomComplet()
    {
        return $this->nomComplet;
    }

    /**
     * Set nomClean
     *
     * @param string $nomClean
     * @return Ville
     */
    public function setNomClean($nomClean)
    {
        $this->nomClean = $nomClean;

        return $this;
    }

    /**
     * Get nomClean
     *
     * @return string 
     */
    public function getNomClean()
    {
        return $this->nomClean;
    }


    /**
     * Set cp
     *
     * @param array $cp
     * @return Ville
     */
    public function setCp($cp)
    {
        $this->cp = $cp;

        return $this;
    }

    /**
     * Get cp
     *
     * @return array 
     */
    public function getCp()
    {
        return $this->cp;
    }

    public function __toString()
{
    return $this->nomComplet;
}

}

Но все равно не работает, у меня следующая ошибка:

Вы не можете добавлять детей в простую форму. Может быть, вам стоит установить для параметра «составной» значение true?

Так что, если кто-то знает, как использовать этот способ с Event Listener, это было бы здорово.

Спасибо


person LedZelkin    schedule 25.02.2015    source источник
comment
пожалуйста, предоставьте нам более подробную информацию о поле сущности nomComplet: тип поля / настройки ORM для этого поля в вашей сущности / значения этого поля (сущность, текст / целое число)   -  person LPodolski    schedule 01.03.2015
comment
Извините за время ответа, вы можете посмотреть на мое редактирование. Спасибо :)   -  person LedZelkin    schedule 02.03.2015


Ответы (2)


Это должно работать

https://github.com/LPodolski/choiceAjaxLoad/blob/master/src/AppBundle/Form/ItemType.php

Весь проект, демонстрирующий этот случай: https://github.com/LPodolski/choiceAjaxLoad

Код в случае удаления/изменения файла:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('choiceField', 'choice', array(
            'attr' => array(
                'class' => 'choiceField'
            )
        ))
    ;

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
        $form = $event->getForm();
        $data = $event->getData();
        $form->remove('choiceField');
        $form->add('choiceField', 'choice', array(
            'attr' => array(
                'class' => 'choiceField',
            ),
            'choices' => array(
                $data['choiceField'] => $data['choiceField'],
            )
        ));
    });

    $builder->add('save', 'submit');
}
person LPodolski    schedule 05.03.2015
comment
У меня нет времени проверять это сейчас, но это похоже на то, что мне нужно, поэтому я делаю ваш ответ принятым и дам отзыв позже :) Спасибо. - person LedZelkin; 06.03.2015
comment
Хорошо, я попробовал, и это сработало как шарм, действительно спасибо;) - person LedZelkin; 07.03.2015
comment
Работает нормально, но теперь вы можете добавить вручную дополнительные параметры, и они будут допустимыми вариантами, есть ли способ предотвратить это? - person Manuel Garcia; 27.04.2016

Итак, мой вопрос заключается в том, как отключить проверку этого поля в Symfony.

Согласно документации, вы можете отключить проверку формы. с помощью события POST_SUBMIT и предотвратить вызов ValidationListener.

$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
    $event->stopPropagation();
}, 900); // Always set a higher priority than ValidationListener
person Greg    schedule 05.04.2015