2016-12-18 5 views
0

У меня есть простой вид MyForm1:Как изменить порядок элементов формы symfony?

class MyForm1 extends Symfony\Component\Form\AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     $builder->add('field1', TextType::class, [ 
      'label' => 'Field1' 
     ]) 

     $builder->add('save', SubmitType::class, [ 
      'label' => 'Save', 
     ]); 
    } 
} 

и форма MyForm2, унаследованная от MyForm1

class MyForm2 extends MyForm1 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     $builder->add('field2', TextType::class, [ 
      'label' => 'Field2' 
     ]) 
    } 
} 

и шаблона

{{ form(form) }} 

Когда я показываю MyForm2, save кнопки отображаются перед тем field2 , Как я могу изменить порядок элементов? Я знаю, что я могу удалить и снова добавить эту кнопку. Или вызвать функцию рендеринга для каждого элемента в шаблоне. Но я хочу просто установить индексы рендеринга для элементов. Предположим, что это займет меньше времени. Является ли это возможным?

Благодаря

ответ

2

На мой взгляд, порядок ваших полей формы является то, что связано с точки зрения, а не модель. Таким образом, вы должны отображать вручную свою форму в своем представлении, поля по полям.

{{ form_start(form) }} 
    {{ form_row(form.field1) 
    {{ form_row(form.field2) 
    {{ form_row(form.save) 
{{ form_end(form) }} 
+0

Да, я знаю об этом. Это моя лень, это потребует внести изменения в форму и шаблон :) –

2
class MyForm1 extends Symfony\Component\Form\AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     $this->buildFields($builder, $options); 

     $builder->add('save', SubmitType::class, [ 
      'label' => 'Save', 
     ]); 
    } 

    public function buildFields(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('field1', TextType::class, [ 
      'label' => 'Field1' 
     ]) 
    } 
} 

class MyForm2 extends MyForm1 
{ 
    // You can actually completely skip this method 
    /*public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 
    }*/ 

    public function buildFields(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildFields(FormBuilderInterface $builder, array $options); 
     $builder->add('field2', TextType::class, [ 
      'label' => 'Field2' 
     ]); 
    } 
} 

Вы также можете добавить buildSubmit таким же образом, если вам нужно.

Смежные вопросы