2014-12-06 87 views
2

一個div包裹Symfony的表單字段給出的簡單形式構建:在嫩枝

$form = add('a') 
     ->add('b') 
     ->add('c') 
     ->add('d') 
     ->add('e') 
     ->add('f'); 

我想環繞ABC和DEF div標籤,像這樣:

<div class="section1"> 
    <input type="text" name="a" /> 
    <input type="text" name="b" /> 
    <input type="text" name="c" /> 
</div> 
<div class="section2"> 
    <input type="text" name="d" /> 
    <input type="text" name="e" /> 
    <input type="text" name="f" /> 
</div> 

問題是,我只能在這個項目中使用Symfony表單組件。有沒有一種方法用樹枝來渲染上面的組中的表單字段?我需要指定一些邏輯來說明類似於「用'a'開始第1部分並用'd'開始第2部分」的事情,這樣,如果任何字段在其間改變(例如,我們用名字'b'刪除字段)表格仍然有效。

我的樹枝文件看起來像這樣,這顯然是不正確的:

<form action="#" method="POST" {{ form_enctype(form) }}> 
    {% for child in form.children %} 
     <div class="form_row"> 
      {{ form_label(form) }} 
      {{ form_errors(form) }} 
      {{ form_widget(form) }} 
     </div> 
    {% endfor %} 
</form> 
+0

[Symfony2中的組表單字段]的可能重複(http://stackoverflow.com/questions/20600595/group-form-fields-in-symfony2) – 2014-12-06 02:16:06

回答

3

最好的方式做到這一點,我認爲是建築控制器之外的形式(作爲一個階級,延長AbstracType)

所以,你會需要這些文件:

  • 你的控制器(如DefaultController.php)
  • 你的樹枝模板(如指數.html.twig)
  • 你的主要形式(MyFormType.php在這個例子中)每個部分
  • 一種形式(在你的榜樣Section1Type.php和Section2Type.php)

所以,這個想法是構建由許多單獨的部分窗體(Section1Type和Section2Type)創建的單一窗體(MyFormType)。然後在你的控制器中調用這個主窗體並將其渲染到你的模板中(每個部分都有一個「for」循環)。

所以在這裏你的代碼:

你的控制器:

<?php 
# /src/Acme/DefaultBundle/Controller/DefaultController.php 

namespace Acme\DefaultBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Acme\DefaultBundle\Form\MyFormType; 

class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 
     $form = $this->createForm(new MyFormType()); 

     return $this->render('AcmeDefaultBundle:Default:index.html.twig', array(
      'form' => $form->createView() 
     )); 
    } 
} 

您的模板:

{# /src/Acme/DefaultBundle/Resources/views/Default/index.html.twig #} 

{{ form_start(form) }} 
    <div class="section1"> 
     {% for input in form.section1 %} 
      {{ form_label(input) }} 
      {{ form_widget(input) }} 
      <br> 
     {% endfor %} 
    </div> 
    <div class="section2"> 
     {% for input in form.section2 %} 
      {{ form_label(input) }} 
      {{ form_widget(input) }} 
      <br> 
     {% endfor %} 
    </div> 
{{ form_end(form) }} 

的主要形式有:

<?php 
# /src/Acme/DefaultBundle/Form/MyFormType.php 

namespace Acme\DefaultBundle\Form; 

use Acme\DefaultBundle\Form\Section1Type; 
use Acme\DefaultBundle\Form\Section2Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class MyFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // This calls your section forms as many as you need 
     $builder->add('section1', new Section1Type()); 
     $builder->add('section2', new Section2Type()); 

     $builder->add('Send', 'submit'); 
    } 

    public function getName() 
    { 
     return 'myform'; 
    } 
} 

的SECTION1形式:

<?php 
# /src/Acme/DefaultBundle/Form/Section1Type.php 
namespace Acme\DefaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class Section1Type extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('a', 'text'); 
     $builder->add('b', 'text'); 
     $builder->add('c', 'text'); 
    } 

    public function getName() 
    { 
     return 'section1'; 
    } 
} 

而且第2節形式:

<?php 
# /src/Acme/DefaultBundle/Form/Section2Type.php 
namespace Acme\DefaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class Section2Type extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('d', 'text'); 
     $builder->add('e', 'text'); 
     $builder->add('f', 'text'); 
    } 

    public function getName() 
    { 
     return 'section2'; 
    } 
} 

就是這樣,你可以編輯每個單獨的部分(添加和刪除輸入),你會得到所有的人都在你的模板,而無需修改它。