2015-02-25 15 views
7

Tôi có một vấn đề trong một thời gian và tôi đã đọc rất nhiều về chủ đề này với vấn đề tương tự nhưng không thể thực hiện các câu trả lời trong trường hợp của tôi.Cho phép tất cả giá trị vào loại lĩnh vực lựa chọn trong Symfony2 hình thức xây dựng

Tôi có một trường chọn mà tôi điền với Ajax. như vậy trong xây dựng hình thức của tôi, tôi có mã này:

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

} 

Nhưng hình thức của tôi không bao giờ xác nhận vì họ không có giá trị trong lĩnh vực lựa chọn này. Nhưng tôi không thể thêm giá trị bên trong vì tôi không biết trước những gì người dùng sẽ nhập dưới dạng giá trị.

Vì vậy, câu hỏi của tôi là cách vô hiệu xác minh trên trường này từ Symfony. Hoặc cho phép nó chấp nhận tất cả giá trị.

Cảm ơn

EDIT

Ở đây, tôi đã cố gắng một cách tiếp cận mới. Tôi sử dụng Trình xử lý sự kiện để sửa đổi trường của tôi bằng giá trị so với người dùng đã gửi.

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

} 

Nhưng nó vẫn không làm việc, tôi đã lỗi sau:

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

Vì vậy, nếu có ai biết làm thế nào để sử dụng cách này với Event Listener nó sẽ là tuyệt vời.

Cảm ơn

+0

xin vui lòng cho chúng tôi biết thêm chi tiết về lĩnh vực tổ chức nomComplet: kiểu trường/cài đặt ORM cho lĩnh vực đó trong tổ chức của bạn/giá trị của lĩnh vực đó (tổ chức, văn bản/số nguyên) – LPodolski

+0

Xin lỗi vì thời gian trả lời, bạn có thể nhìn vào chỉnh sửa của tôi. Thx :) – LedZelkin

Trả lời

11

này nên làm việc

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

Toàn bộ dự án chứng minh trường hợp này: https://github.com/LPodolski/choiceAjaxLoad

Mã trong hồ sơ vụ án được lấy ra/thay đổi:

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

Tôi không có thời gian để kiểm tra rằng bây giờ nhưng nó trông giống như những gì tôi cần vì vậy tôi làm cho câu trả lời của bạn là chấp nhận và sẽ cung cấp một thông tin phản hồi sau :) Cảm ơn – LedZelkin

+0

OK tôi đã cố gắng và nó làm việc như một nét duyên dáng, thực sự cảm ơn ;) – LedZelkin

+0

Hoạt động tốt nhưng bây giờ bạn có thể thêm nhiều tùy chọn theo cách thủ công và chúng sẽ là lựa chọn hợp lệ, có cách nào để ngăn chặn điều này không? –

1

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

Theo Documentation bạn có thể ngăn chặn hình thức xác nhận bằng cách sử dụng sự kiện POST_SUBMIT và ngăn chặn sự ValidationListener khỏi bị gọi.

$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { 
    $event->stopPropagation(); 
}, 900); // Always set a higher priority than ValidationListener 
Các vấn đề liên quan