2014-06-30 40 views
0

考慮這段代碼:的Symfony2:訂購表單字段

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name', 'text') 
     ->add('description', 'textarea') 
     ->add('status', 'choice', array('choices' => array('online' => 'online', 'offline' => 'offline'))) 
     ->add('save', 'submit'); 
} 

但是,當我使這個形式我得到它的順序

description 
name 
status 

我怎樣才能改變這種除了寫作之外的表單模板用手。

回答

0

您希望控制PHP的渲染順序,但實際上,您的PHP不應該知道或不關心信息的渲染方式。渲染的順序在模板中處理,最好通過小枝處理,因爲它是模板處理這個問題的責任。這是一個簡單的過程,並給你充分的控制。下面的樹枝模板應該解決您的訂單:

{{form_start(nameOfFormVariablePassedFromController}} 
    {{form_label(nameOfFormVariablePassedFromController.name)}} 
    {{form_widget(nameOfFormVariablePassedFromController.name)}} 

    {{form_label(nameOfFormVariablePassedFromController.description)}} 
    {{form_widget(nameOfFormVariablePassedFromController.description)}} 

    {{form_label(nameOfFormVariablePassedFromController.status)}} 
    {{form_widget(nameOfFormVariablePassedFromController.status)}} 

    {{form_widget(nameOfFormVariablePassedFromController.save)}} 
{{form_end(nameOfFormVariablePassedFromController}} 

這是很容易類添加到這些標籤和窗口小部件的造型,通過添加額外的參數。如果您需要進一步澄清,我可以提供幫助。

+0

我已經是這麼認爲的。嚴格來說你是對的,但仍然感覺有點奇怪。 –

+0

雖然看起來有點長,但從邏輯上分離演示文稿是一個被廣泛認可的最佳實踐,可以輕鬆修改其中的一個,而不會影響其他文件,因此您最好接受它。 – Alex

4

今天與表單元素排序有同樣的問題。

結束了一個特點,這將覆蓋finishView方法和一個FormView的子女財產重新排序項:

trait OrderedTrait 
{ 
    abstract function getFieldsOrder(); 

    public function finishView(FormView $view, FormInterface $form, array $options) 
    { 
     /** @var FormView[] $fields */ 
     $fields = []; 
     foreach ($this->getFieldsOrder() as $field) { 
      if ($view->offsetExists($field)) { 
       $fields[$field] = $view->offsetGet($field); 
       $view->offsetUnset($field); 
      } 
     } 

     $view->children = $fields + $view->children; 

     parent::finishView($view, $form, $options); 
    } 
} 

然後在類型實現getFieldsOrder方法:

use OrderedTrait; 

function getFieldsOrder() 
{ 
    return [ 
     'first', 
     'second', 
     'next', 
     'etc.', 
    ]; 
}