【问题标题】:Wrap Symfony form fields in a div in Twig在 Twig 的 div 中包装 Symfony 表单字段
【发布时间】:2023-04-05 03:43:01
【问题描述】:

给定简单的表单构建:

$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'的字段)表单仍然有效。

我的twig文件长这样,明显不正确:

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

【问题讨论】:

标签: php forms symfony twig


【解决方案1】:

我认为最好的方法是在控制器外部构建表单(作为一个类,扩展 AbstracType)

因此,您将需要这些文件:

  • 您的控制器(作为 DefaultController.php)
  • 您的树枝模板(如 index.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';
    }
}

和Section2形式:

<?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';
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-29
    • 2012-12-04
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多