2013-02-01 27 views
10

Filtrelenmiş varlık topluluğu için bir html tablosu görüntülüyorum ve seçili varlıkları ekleyecek bir formun parçası olarak her satırda bir onay kutusu görüntülemek istiyorum bir oturum var.Bir doktrin koleksiyonundaki her varlık için bir onay kutusu olan bir form oluşturma

Her onay kutusunun varlık kimliğinin değeri olarak olması gerektiğini düşünüyorum ve form alanı verilerinden bir dizi ids alacağım (tamam, bu nedenle değer, varlığa dolaylı bir ref; basitlik uğruna).

Tek bir varlık türü alanına sahip, varlığın id özelliği ile eşlenen ve bir koleksiyon türü alanına sahip başka bir form türü içine yerleştirilmiş bir form türü oluşturmayı denedim.

class FooEntitySelectByIdentityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('foo_id', 'entity', array(
      'required' => false, 
      'class' => 'MeMyBundle:FooEntity', 
      'property' => 'id', 
      'multiple' => true, 
      'expanded' => true 
     )); 
    } 

# ... 

ve

class FooEntitySelectionType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('identity', 'collection', array(
      'type' => new FooEntitySelectByIdentityType, 
      'options' => array(
       'required' => false, 
       'multiple' => true, 
       'expanded' => true, 
       'attr'  => array('class' => 'foo') 
      ), 
     )); 
    } 

# ... 

ve bir kontrol olarak

bir şekilde ilk veri gibi unsurlardan topluluğu ile oluşturulur

formu, tek bir etiket için orada oluşturulur
$form = $this 
    ->createForm(
     new \Me\MyBundle\Form\Type\FooEntitySelectionType, 
     $collection_of_foo 
    ) 
    ->createView() 
; 

kimlik alanı, ancak hiçbir widget.

Bu şekilde, varlık ve koleksiyon tipi alanlarını kullanmak mümkün mü? Eğer öyleyse, yanlış ne yapabilirim?

cevap

8

Bu sorunun cevabını alacağını düşünüyorum.

FooEntitySelectionType'u unutun. data_class seçenek null için FooEntitySelectByIdentityType bir property_path saha seçeneği ekleyin ve ayarlayın:

class FooEntitySelectByIdentityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('foo_id', 'entity', array(
      'required'  => false, 
      'class'   => 'MeMyBundle:FooEntity', 
      'property'  => 'id', 
      'property_path' => '[id]', # in square brackets! 
      'multiple'  => true, 
      'expanded'  => true 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => null, 
      'csrf_protection' => false 
     )); 
    } 

# ... 

ve denetleyici içinde inşa FooEntitySelectByIdentityType:

$form = $this 
    ->createForm(
     new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType, 
     $collection_of_foo 
    ) 
    ->createView() 
; 

ve sonra POSTed verileri alır denetleyicisi eylem:

ve son olarak, dal şablonunuzda:

{# ... #} 
{% for entity in foo_entity_collection %} 
    {# ... #} 

    {{ form_widget(form.foo_id[entity.id]) }} 

    {# ... #} 
+0

işe yarar! Bu yöntemin olumsuz tarafı, $ form-> getData() 'nın, düz tamsayı kimlikleri yerine bir varlıklar topluluğunu içeren bir dizi döndürmesidir, ancak üst tarafın, oturuma kaydedilen geçersiz bir kimliğin olmaması gerektiğine inanıyorum. teşekkürler @jah! – jah

+1

Dizeleri tanımlayıcı olarak kullanmaya çalışırsanız, bu yaklaşımın çalışmadığından haberiniz olsun.'EntityChoiceList' daha sonra çocuklar için tamsayı tabanlı indeksler oluşturacak ve 'form_widget' çağrısı bir istisna atar. :( – althaus

+0

Ben de bu sıkıntı içine koşuyorum.Bu basit sorunu çözmek için daha basit bir yolu var mı? –

3

birisi Symfony'nin> = 2.3

Bunu değiştirmek zorunda için çözüm arayan varsa: Buna

$data = $form->getData(); 
    $ids = array(); 
    foreach ($data['foo_id'] as $entity) { 
     $ids[] = $entity->getId(); 
    } 

: için

$data = $form['foo_id']->getData(); 
    $ids = array(); 
    foreach ($data as $entity) { 
     $ids[] = $entity->getId(); 
    } 
2

oluşturacağım symfony bundle Varlıkların bir koleksiyonunu, bir onay kutusu tablosu olarak yapılandırılabilir şekilde işleyin. Bu sorunun sorulmasından beri bir süre olmasına rağmen, umarım bu, aynı türden bir problemle başkalarına yardımcı olabilir.

+0

Bu Bundle kullanıyorum ve çok güzel olduğunu söylemeliyim! Teşekkürler! – Muc

+0

Bir kerede 1000 adede kadar kayıt görüntülemeye çalışırken paketinizin performansı nasıl? Veri kümelerini kullanmayı planlıyorum her bir sayfa yükünde kaç kayıt gösterileceğini sınırlamak için sunucu tarafı işlemesi yapılır, ancak yukarıdaki diğer yanıtları kullandığım zaman, yalnızca ilk sayfa ile sınırlı olmamakla birlikte, olası tüm seçenekleri içeren varlık türümü oluşturmam gerekiyor gibi görünüyor Kayıtlarla ilgili performans sorunları yaşıyorum. – snoop168

İlgili konular