2014-01-08 69 views
0

我已將collection表單字段類型擴展爲CollectionTableExtension。我試圖設置一個變量,FormView::$vars['headers'],這樣當is_tabletrue且沒有用戶定義的頭可用時,collection可以使用默認標頭輸出。默認標題應該與通常應用於集合成員的標籤相同。如何訪問收集擴展中的收集成員標籤

例如

FooType如果有3個字段,foobarfibble,其標籤將是富,酒吧和肥波(具有枝條模板人源化之後)或存儲在每個屬性的屬性label的值。

所以,如果我的DoofusTypeFooType秒的採集,

$builder->add('foos', 'collection', array('type'=>'acc_foo', 'is_table'=>true)); 

應導致視圖,其中用於收集標題將是富,酒吧和肥波或FooType如果標籤屬性的值他們被設置。

這裏是我的collection擴展:

<?php 
namespace ACC\MainBundle\Form; 

use Symfony\Component\Form\AbstractTypeExtension; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormInterface; 
use Symfony\Component\PropertyAccess\PropertyAccess; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class CollectionTableExtension extends AbstractTypeExtension 
{ 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setOptional(array('is_table')); 
     $resolver->setOptional(array('headers')); 
     $resolver->setOptional(array('caption')); 
    } 

    public function getExtendedType() 
    { 
     return 'collection'; 
    } 


    public function buildView(FormView $view, FormInterface $form, array $options) 
    { 
     if (array_key_exists('is_table', $options)) { 
      $view->vars['is_table'] = $options['is_table']; 

      if (array_key_exists('caption', $options)) $view->vars['caption'] = $options['caption']; 

      if (array_key_exists('headers', $options)) { 
       $view->vars['headers'] = $options['headers']; 
      }else{ 
       //harvest labels from collection members, but HOW? 
      } 
     } 
    } 

} 

的問題是,我不知道如何從收集擴展中訪問集合元素類型的屬性。我可以像這樣訪問集合中的第一個元素:

if($form->has('0')) { 
    foreach($form->get('0')->all() as $item) 
     $view->vars['headers'][] = $item->getName(); 
} 

但是,如果集合爲空,則不起作用。如果集合元素類型定義了標籤,它也沒有幫助。有任何想法嗎?

回答

0

經過Symfony源代碼的大肆抨擊之後,我找到了一個辦法。實質上,在::buildView中,必須實例化正確類型的虛擬集合元素,以便可以提取其標籤或屬性。這是我做的:

public function buildView(FormView $view, FormInterface $form, array $options) 
{ 
    if (array_key_exists('is_table', $options)) { 
     $view->vars['is_table'] = $options['is_table']; 

     if (array_key_exists('caption', $options)) $view->vars['caption'] = $options['caption']; 

     if (array_key_exists('headers', $options)) { 
      if($options['headers']===false){ //no headers 
       unset($view->vars['headers']); 
      }else if (is_array($options['headers'])){ //headers passed in 
       $view->vars['headers'] = $options['headers']; 
      } 
     }else { //harvest labels from collection elements 
      $elementtype = $form->getConfig()->getOption('type'); 

      //should be a guard clause here so types that won't supply good headers (e.g. a collection of text fields) will skip the rest 

      $element = $form->getConfig()->getFormFactory()->create($elementtype); //get dummy instance of collection element 
      $fields = $element->all(); 
      $headers = array(); 
      foreach($fields as $field){ 
       $label= $field->getConfig()->getOption('label'); 
       $headers[] = empty($label) ? $field->getName() : $label; 
      } 
      $view->vars['headers'] = $headers; 

     } 
    } 
} 

如果有人有一個更清潔的方法,我全部耳朵。