将Symfony表单字段封装在Twig中的div中

鉴于简单的表单构建:

$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> 

最好的办法,我认为是建立在控制器之外的形式(作为一个类,扩展AbstracType)

所以,你需要这些文件:

  • 你的控制器(作为DefaultController.php)
  • 你的树枝模板(如index.html.twig)
  • 你的主窗体(这个例子中的MyFormType.php)
  • 每个部分的一种形式(在您的示例Section1Type.php和Section2Type.php中)
  • 所以,这个想法是通过许多单独的部分窗体(Section1Type和Section2Type)创建一个单一窗体(MyFormType)。 然后在你的控制器中调用这个主窗体并将其渲染到你的模板中(每个部分都有一个“for”循环)。

    所以在这里你有代码:

    你的控制器:

    <?php
    # /src/Acme/DefaultBundle/Controller/DefaultController.php
    
    namespace AcmeDefaultBundleController;
    use SymfonyBundleFrameworkBundleControllerController;
    use AcmeDefaultBundleFormMyFormType;
    
    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 AcmeDefaultBundleForm;
    
    use AcmeDefaultBundleFormSection1Type;
    use AcmeDefaultBundleFormSection2Type;
    
    use SymfonyComponentFormAbstractType;
    use SymfonyComponentFormFormBuilderInterface;
    
    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 AcmeDefaultBundleForm;
    
    use SymfonyComponentFormAbstractType;
    use SymfonyComponentFormFormBuilderInterface;
    
    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';
        }
    }
    

    和Section2形式:

    <?php
    # /src/Acme/DefaultBundle/Form/Section2Type.php
    namespace AcmeDefaultBundleForm;
    
    use SymfonyComponentFormAbstractType;
    use SymfonyComponentFormFormBuilderInterface;
    
    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';
        }
    }
    

    就这样,您可以编辑每个单独的部分(添加和删除输入),并且您将在模板中获取所有这些部分,而无需对其进行修改。

    链接地址: http://www.djcxy.com/p/81395.html

    上一篇: Wrap Symfony form fields in a div in Twig

    下一篇: Symfony 2 Form collection field with type file