Разрешить все значения по выбору типа поля в конструкторе форм 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, было бы здорово.

Спасибо

7

Решение

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

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');
}
11

Другие решения

Поэтому мой вопрос — как отключить проверку в этом поле от Symfony.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector