2015-02-25 9 views
7

Ho un problema per un po 'e ho letto molto su questo argomento con problemi simili ma non riesco a implementare le risposte nel mio caso.Consentire tutto il valore sul tipo di campo scelta nel generatore di forme Symfony2

Ho un campo di selezione che popolamento con Ajax. quindi nel mio costruttore di form ho questo codice:

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

} 

Ma la mia forma non convalida perché il loro non è un valore in questo campo scelta. Ma non posso aggiungere il valore all'interno perché non so in anticipo quale utente inserirà come valore.

Quindi la mia domanda è come disabilitare la verifica su questo campo da Symfony. O permettergli di accettare tutto il valore.

Grazie

EDIT

Ecco, ho provato un nuovo approccio. Uso il listener dell'evento per modificare il mio campo con il valore rispetto all'utente inviato.

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

} 

Ma ancora la sua non funziona, ho seguente errore:

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

Quindi, se qualcuno sa come usare questo modo con ascoltatore di eventi, sarebbe fantastico.

Grazie

+0

preghiamo di fornirci ulteriori dettagli sul campo entità nomComplet: tipo di campo/impostazioni ORM per quel campo nel soggetto/i valori di quel campo (entità, text/interi) – LPodolski

+0

Ci scusiamo per il tempo di risposta, si può guardare la mia modifica. Thx :) – LedZelkin

risposta

11

questo dovrebbe funzionare

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

Tutto il progetto dimostrando questo caso: https://github.com/LPodolski/choiceAjaxLoad

codice nel fascicolo viene rimosso/Altered:

/** 
* @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

Non ho il tempo di provarlo adesso ma sembra che io abbia bisogno quindi faccio la tua risposta come accettata e darò un feedback più tardi :) Grazie – LedZelkin

+0

OK ho provato e ha funzionato come un incantesimo, davvero grazie ;) – LedZelkin

+0

Funziona bene ma ora puoi aggiungere manualmente più opzioni, e saranno scelte valide, c'è un modo per prevenirle? –

1

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

In base allo Documentation è possibile sopprimere la convalida del modulo utilizzando l'evento POST_SUBMIT e impedire la chiamata di ValidationListener.

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