2013-02-01 65 views
10

我正在顯示一個過濾的集合的實體的html表,我想在每一行中顯示一個複選框作爲表單的一部分,將添加選定的實體到會議變種。建立一個表格,爲每個實體在一個學說集合

我在想,每個複選框應該有實體ID作爲它的值,我會從表單字段數據獲得一個ID數組(好吧,所以這個值應該是實體的間接引用,但是爲了簡單起見)。

我試過創建一個表單類型與單個實體類型字段映射到該實體的id屬性,並嵌入到另一個具有集合類型字段的表單類型。

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

# ... 

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

# ... 

和在控制器的形式與實體的集合作爲初始數據創建

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

當表單被呈現有用於單個標籤身份字段,但沒有小部件。

它甚至有可能以這種特定的方式使用實體和集合類型字段? 如果是這樣,我可能會做錯什麼?

回答

8

我認爲這會回答你的問題。

忘記FooEntitySelectionType。一個property_path場選項添加到FooEntitySelectByIdentityType並設置data_class選項null

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

# ... 

,並在你的控制器,打造FooEntitySelectByIdentityType

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

,然後在接收發布數據控制器動作:

$form = $this 
    ->createForm(new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType) 
; 
$form->bind($request); 
if ($form->isValid()) { 
    $data = $form->getData(); 
    $ids = array(); 
    foreach ($data['foo_id'] as $entity) { 
     $ids[] = $entity->getId(); 
    } 
    $request->getSession()->set('admin/foo_list/batch', $ids); 
} 

最後,在你的樹枝模板裏:

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

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

    {# ... #} 
+0

工作!整個方法的缺點是'$ form-> getData()'返回一個包含實體集合而不是純整數ID的數組,但我認爲好處是不能有無效的ID保存到會話中。謝謝@jah! – jah

+1

請注意,如果您嘗試將字符串用作標識符,則此方法不起作用。然後'EntityChoiceList'將爲孩子創建基於整數的索引,並且'form_widget'調用將拋出一個異常。 :( – althaus

+0

我也遇到了這個麻煩。是否有更簡單的方法來解決這個簡單的問題? –

3

如果有人可以尋找的Symfony> = 2.3

你必須改變這種解決方案:

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

這樣:

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

我創建了一個symfony bundle爲以可配置的方式將實體集合呈現爲複選框表格。雖然這個問題已經有一段時間了,但我希望這可以幫助其他人解決同樣的問題。

+0

我正在使用這個Bundle,我不得不說它非常酷!謝謝! – Muc

+0

你試圖一次顯示多達1000條記錄的性能如何?我正在計劃使用數據表服務器端處理來限制在每個頁面加載上顯示的記錄數量,但是當我使用上述其他答案時,我需要使用它可能期望的所有可能的選項來創建我的實體類型,而不僅僅是初始限於第一頁的記錄。我遇到與此相關的性能問題。 – snoop168

相關問題