2015-02-25 12 views
7

Ich habe ein Problem für eine Weile, und ich habe viel zu diesem Thema mit ähnlichen Problem gelesen, kann aber die Antworten in meinem Fall nicht implementieren.Erlauben Sie alle Wert auf Auswahl Feldtyp in Symfony2 Formularerstellung

Ich habe ein Auswahlfeld, das ich mit Ajax füllen. so in meinen Formular-Builder habe ich diesen Code:

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

} 

Aber meine Form bestätigt nie, weil sie keinen Wert in diesem Auswahlfeld ist. Aber ich kann den Wert nicht hinzufügen, da ich vorher nicht weiß, was der Benutzer als Wert eingeben wird.

Also meine Frage ist, wie die Überprüfung für dieses Feld von Symfony zu deaktivieren. Oder erlauben Sie es, alle Werte zu akzeptieren.

Dank

EDIT

Hier habe ich versucht, einen neuen Ansatz. Ich verwende den Event Listener, um mein Feld mit dem Wert zu ändern, den der Benutzer gesendet hat.

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; 
} 

} 

Aber es ist immer noch nicht funktioniert, habe ich Fehler folgende:

You cannot add children to a simple form. Maybe you should set the option "compound" to true?

Also, wenn jemand weiß, wie man auf diese Weise es wäre toll mit Event-Listener verwenden.

Dank

+0

bitte geben Sie uns mehr Details über nomComplet Einheit Feld: Feldtyp/ORM-Einstellungen für dieses Feld in Ihrem Unternehmen/Werte dieses Feldes (Einheit, text/integer) – LPodolski

+0

Sorry für die Antwort Zeit kann man sich meine Bearbeitung. Thx :) – LedZelkin

Antwort

11

Diese

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

Gesamtes Projekt demonstriert diesen Fall funktionieren sollte: https://github.com/LPodolski/choiceAjaxLoad

-Code, falls Datei entfernt/geändert:

/** 
* @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'); 
} 
+0

Ich habe nicht die Zeit, das jetzt zu testen, aber es sieht aus, was ich brauche, also mache ich Ihre Antwort als akzeptiert und wird später ein Feedback geben :) Danke – LedZelkin

+0

OK ich versuchte und es funktionierte wie ein Charme, wirklich danke ;) – LedZelkin

+0

Funktioniert gut, aber jetzt können Sie manuell weitere Optionen hinzufügen, und sie werden gültige Entscheidungen sein, gibt es eine Möglichkeit, dies zu verhindern? –

1

So my question is how to disable verification on this field from Symfony.

Gemäß Documentation können Sie die Formularüberprüfung unterdrücken, indem Sie das POST_SUBMIT-Ereignis verwenden und verhindern, dass der ValidationListener aufgerufen wird.

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