2012-05-12 18 views
11

Yani buÇoklu formlar - Symfony'nin 2

$task1 = new Task(); 
$form1 = $this->createForm(new MyForm(), $task1); 

$task2 = new Task(); 
$form2 = $this->createForm(new MyForm(), $task2); 

benzer benim denetleyicisi eylemi var Ve benim MyForm iki alan

//... 
$builder->add('name', 'text'); 
$builder->add('note', 'text'); 
//... 

İki şekilleridir beri gibi görünüyor vardır diyelim aynı türden MyForm, görünümlerde işlendiğinde, alanları aynı ada sahip ve ID'leri (iki formun 'isim' alanları aynı adı ve kimliği paylaşır; aynı 'not' alanları için de geçerlidir) Symfony, formların verilerini doğru şekilde bağlayamaz. Bunun için herhangi bir çözüm bilen var mı?

// you controller 

$entity = new Entity(); 
$request = $this->getRequest(); 

$formType = new myType(); 
$formType->setName('foobar'); 
// or new myType('foobar'); if you set it in the constructor 

$form = $this->createForm($formtype, $entity); 

cevap

18
// your form type 
class myType extends AbstractType 
{ 
    private $name = 'default_name'; 
    ... 
    //builder and so on 
    ... 
    public function getName(){ 
     return $this->name; 
    } 

    public function setName($name){ 
     $this->name = $name; 
    } 

    // or alternativ you can set it via constructor (warning this is only a guess) 

    public function __constructor($formname) 
    { 
     $this->name = $formname; 
     parent::__construct(); 
    } 

} şimdi sen sandık .. bu böyle devam <input type="text" id="foobar_field_0" name="foobar[field]" required="required> ve yol açmalıdır formun her örneği için farklı bir kimliği ayarlamak gerekir.

+0

Tam olarak benim düşüncem. Mükemmel cevap! –

7

Ben

// your form type 

    class myType extends AbstractType 
    { 
     private static $count = 0; 
     private $suffix; 
     public function __construct() { 
      $this->suffix = self::$count++; 
     } 
     ... 
     public function getName() { 
      return 'your_form_'.$this->suffix; 
     } 
    } 

Sonra her adını ayarlamak zorunda kalmadan istediğiniz kadar oluşturabilirsiniz Adını oluşturmak için statik kullanmak.

+1

Bu en iyi cevaptır. – Stan

+0

Bu iyi bir cevap, thx. Ama büyük miktarda kullanıcı ile doğru ölçeklendirilip ölçeklenemeyeceğini merak ediyorum. –

+0

@ThomasLeduc Bu tür bir modelle kullanıcıların sayısı sorun olmayacak gibi görünüyor. Değişken $ sayısı, istek başına bir kez başlatılır ve bir istekte oluşturduğunuz formda olduğu kadar artırılır. Binlerce formunuz olsa bile, değişken bir sorun olmamalıdır (ancak tahmin ettiğim başka bir sorunla karşılaşırsınız) – Julien

0

tek bir dinamik adı oluşturmak:

const NAME = "your_name"; 

public function getName() 
{ 
    return self::NAME . '_' . uniqid(); 
} 

adın hep tek

3

DÜZENLEME: Bunu yapma! Bunun yerine bu Bakınız: http://stackoverflow.com/a/36557060/6268862

Symfony 3.0'da:

class MyCustomFormType extends AbstractType 
{ 
    private $formCount; 

    public function __construct() 
    { 
     $this->formCount = 0; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     ++$this->formCount; 
     // Build your form... 
    } 

    public function getBlockPrefix() 
    { 
     return parent::getBlockPrefix().'_'.$this->formCount; 
    } 
} 

Şimdi sayfadaki formu ilk örneği (alanlar adları ve kimlikleri için aynı) onun adı olarak "my_custom_form_0" olacak ikincisi "my_custom_form_1", ​​...

+0

Bunun muhtemelen en iyi fikir olduğuna dikkat etmeliyim çünkü formunuzu ne zaman göndereceğinizden sayım başlatılacak ve bu nedenle form ** aslında sunulmayacaktır (form adı ve talepteki veriler arasındaki fark). One, bunun yerine burada açıklandığı gibi createNamedBuilder yöntemini kullanmalıdır: Symfony3 içinde http://stackoverflow.com/a/36557060/6268862 – peamak

+0

, bir yapıcı – Zwen2012

+0

formNamedBuilder benim için de çalıştı bir formda artık izin verilmiyor – Sam