我有一个问题已经有一段时间了,我在这个话题上读了很多类似问题的文章,但是无法在我的情况下实现答案。
我有一个使用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;
}
}
但是它仍然不能正常工作,我遇到了以下错误:
您无法向简单表单添加子级。也许您应该将选项“compound”设置为true?
如果有人知道如何使用事件监听器来解决这个问题,那就太好了。
谢谢