2012-11-10 29 views
19

Senaryo: 2 seçim içeren bir formum var. Kullanıcı ilk seçenekten bir şey seçtiğinde, ikinci seçim yeni değerlerle doldurulur. Bu bölüm iyi çalışıyor.Symfony2: Ajax ve onaylama ile seçenekleri değiştirin

Ancak form, ilk formda izin verilmeyen bazı seçenekler içerdiğinden doğrulanmadı.

Form:

<?php 

class MyType extends AbstractType 
{ 
    private $category; 

    public function __construct($category = null) 
    { 
     $this->category = $category; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('category', 'choice', array(
      'choices' => array(
       'foo' => 'foo', 
       'bar' => 'bar' 
      ) 
     ); 

     $builder->add('template', 'choice', array(
      'choices' => $this->loadChoices() 
     ); 
    } 

    private function loadChoices() 
    { 
     // load them from DB depending on the $this->category 
    } 
} 

Başlangıçta kategori foo olduğunu. Bu yüzden foo için şablonlar yüklenir ve seçenek olarak ayarlanır. Ancak kullanıcı bar seçerse, çubuk şablonları yüklenir. Ancak form hala foo seçimlerine sahip ve doğrulamıyor.

Bunu çözmenin en iyi yolu nedir?

<?php 

$form = $this->createForm(new MyType()); 

if ($request->getMethod() === 'POST') { 
    if ($request->request->has($form->getName()) 
     && isset($request->request->get($form->getName())['category'])) { 
      $form = $this->createForm(new MyType($request->request->get($form->getName())['category'])); 
    } 

    // ... 
} 

Bu çalışır, ancak değerini ayarlarken IllegalArgumentException atar ve sadece varsayılan varsayar çünkü bunu test edemez: buldum

bir yolu sadece denetleyici formu yeniden başlatmak için oldu. Bunun için daha iyi bir çözüm var mı? Şimdiden teşekkürler!

+0

Eğer doğrulamak zorunda seçeneklerin her set için doğrulama grupları ayarlamak denediniz daha doğru bir yolu olan u bu yönetmek için Etkinlikleri kullanmak zorunda düşünüyorum? Daha sonra, validator hizmetini yalnızca sizin için uygun olan grupta arayabilirsiniz. http://symfony.com/doc/2.0/book/forms.html#validation-groups – Xocoatzin

cevap

20

Ben

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('category', 'choice', array(
     'choices' => array(
      'foo' => 'foo', 
      'bar' => 'bar' 
     ) 
    )); 

    $ff = $builder->getFormFactory(); 

    // function to add 'template' choice field dynamically 
    $func = function (FormEvent $e) use ($ff) { 
     $data = $e->getData(); 
     $form = $e->getForm(); 
     if ($form->has('template')) { 
      $form->remove('template'); 
     } 

     $cat = isset($data['category'])?$data['category']:null; 

     // here u can populate ur choices in a manner u do it in loadChoices 
     $choices = array('1' => '1', '2' => '2'); 
     if ($cat == 'bar') { 
      $choices = array('3' => '3', '4' => '4'); 
     } 

     $form->add($ff->createNamed('template', 'choice', null, compact('choices'))); 
    }; 

    // Register the function above as EventListener on PreSet and PreBind 
    $builder->addEventListener(FormEvents::PRE_SET_DATA, $func); 
    $builder->addEventListener(FormEvents::PRE_BIND, $func); 
} 
+0

Geç yanıt için üzgünüm! Bugün kontrol edeceğim. :) – smottt

+0

Mükemmel çalışıyor, çok teşekkür ederim! – smottt

+0

Bu bağlantıyı çalışmayı denediğim benzer bir sorun için tavsiye edildim (AJAX'ı "onChange" tetikleyicisi ile kullanmak istediğim yer). Bu, her şeyi değiştirmeden önce kontrol etmek istediğim halde iyi görünüyor: Bu, formu gönderilmeden Kategori seçildiğinde "arama" açılır penceresini veritabanı aramasından doldurmak için formu yenileyebilir mi? – Bendy

İlgili konular