2015-02-25 6 views
7

Mam problem przez pewien czas i dużo czytałem na ten temat z podobnym problemem, ale nie mogę zaimplementować odpowiedzi w moim przypadku.Zezwalaj na wszystkie wartości w polu wyboru typu w konstruktorze formularzy Symfony2

Mam pole wyboru, które zapełniam Ajaxem. więc w moim formularzu konstruktora Mam ten kod:

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

} 

Ale moja forma nie sprawdza, bo ich nie ma wartość w tym polu wyboru. Ale nie mogę dodać wartości wewnątrz, ponieważ nie wiem z góry, co użytkownik wprowadzi jako wartość.

Moje pytanie brzmi: jak wyłączyć weryfikację na tym polu z Symfony. Lub pozwól mu zaakceptować całą wartość.

Dzięki

EDIT

Tutaj próbowałem nowego podejścia. Używam odbiornika zdarzeń do modyfikowania mojego pola o wartość niż przesłany przez użytkownika.

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

} 

Ale jeszcze jej nie działa, mam następujący błąd:

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

Więc jeśli ktoś wie, jak korzystać z tego sposobu detektor zdarzeń byłoby wspaniale.

Dzięki

+0

podaj więcej szczegółów o zakresie podmiotu nomComplet: Typ pola/ustawień ORM dla tej dziedzinie w swojej jednostce/wartości tego pola (podmiot, text/całkowita) – LPodolski

+0

Niestety do czasu odpowiedzi, można spojrzeć na moja zmiana. Thx :) – LedZelkin

Odpowiedz

11

To powinno działać

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

Cały projekt wykazując tym przypadku: https://github.com/LPodolski/choiceAjaxLoad

kod w akta sprawy jest usuwany/ulegają zmianie w:

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

Nie mam czasu, aby przetestować to teraz, ale wygląda na to, czego potrzebuję, więc tworzę odpowiedź jako zaakceptowaną i udzielę informacji zwrotnej później :) Dzięki – LedZelkin

+0

OK próbowałem i działało jak wdzięk, naprawdę dziękuję ;) – LedZelkin

+0

Działa dobrze, ale teraz możesz dodać ręcznie więcej opcji i będą to prawidłowe wybory, czy jest jakiś sposób, aby temu zapobiec? –

1

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

Zgodnie z Documentation można wyłączyć sprawdzanie formularza za pomocą zdarzenia POST_SUBMIT i uniemożliwić wywołanie ValidationListener.

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