Forms Symfony-以生成的形式添加文本

Forms Symfony-以生成的形式添加文本,forms,symfony,twig,Forms,Symfony,Twig,我想做一些非常简单的事情,但我不知道如何管理它。我有一张表格: {{ form_start(form) }} {{ form_widget(form) }} {{ form_end(form) }} 其中有几个文本字段。我想在两个文本字段(比如在名称文本字段和描述文本字段之间)之间“插入”一些文本(比如我的文本)。表单是使用表单生成器工具生成的。我试过这样的方法: $builder ->add('stuffName') // works well (text field 1)

我想做一些非常简单的事情,但我不知道如何管理它。我有一张表格:

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
其中有几个文本字段。我想在两个文本字段(比如在
名称
文本字段和
描述
文本字段之间)之间“插入”一些文本(比如
我的文本

)。表单是使用表单生成器工具生成的。我试过这样的方法:

$builder
    ->add('stuffName') // works well (text field 1)
    ->add('addedText', 'text', array('label' => 'my Text')) // Trouble here!
    ->add('stuffDescription'); // works well (text field 2)
但它会生成一个文本字段(而不是简单的文本)。我不在乎文本是在form builder中设置还是直接在twig模板中设置。。。只要它在我的两个文本字段之间。有什么想法吗

非常感谢

Symfony表单只包含表单字段。您需要的任何其他内容都必须由模板添加

这意味着您必须逐个字段输出表单。例如,您的表单可能如下所示:

{{ form_start(form) }}
    {{ form_row(form.stuffName) }}

    <p>Your Text</p>

    {{ form_row(form.stuffDescription) }}
{{ form_end(form) }}
{{form_start(form)}
{{form_行(form.stuffName)}}
你的文字

{{form_row(form.stuffDescription)} {{form_end(form)}}

有关如何自定义表单呈现的更多信息,请参阅Symfony文档中的。

这里是一个示例代码,可以自我解释

{{ form_start(form, { 'attr': { 'class': 'form-horizontal form-bordered'} }) }}
<div class="form-group">
    <div class="col-md-3 ">
        {{ form_label(form.User, 'Label text', { 'attr': {'class': 'control-label'} }) }}
    </div>
    <p>You are free to add whatever you want here</p>
    <div class="col-md-9">
        {{ form_widget(form.User, { 'attr': {'class': 'form-control'} }) }}
    </div>
</div>
{{ form_rest(form) }}
{{ form_end(form) }}
{{form_start(form,{'attr':{'class':'form horizontal form bordered'}}}}
{{form_label(form.User,'label text',{'attr':{'class':'control label'}}}}}
你可以在这里随意添加任何你想要的内容

{{form_小部件(form.User,{'attr':{'class':'form control'}}}} {{form_rest(form)} {{form_end(form)}}

在任何情况下,这个问题都非常清楚,并且很好地解释了这一点。

这个问题中的关键字是生成的

假设您在Symfony中构建了一个表单生成器。您有表单、字段和字段项等实体(选择框的选项或单选按钮字段的按钮)

因此,您有了这些实体,并创建了一个服务来从数据创建表单。在构建表单的服务中($this->buildedForm-generated form,$page->getFormData()-将数据放入构建的表单):

$this->buildedForm=$this->formFactory->create(
“形式”,
$page->getFormData(),
['action'=>'/page/formview/。$task->getId()]
);
foreach($fields作为$field){
$fieldBuilderMethod='construct'.ucfirst($field->getType())'field';
如果(方法_存在($this$fieldBuilderMethod)){
$this->$fieldBuilderMethod($field);
}
}
返回$this->buildedForm;
每种类型都有相应的方法,例如(Symfony 2的示例):

现在,您可以创建自定义表单类型,将文本粘贴到生成的表单中(它可以放置在捆绑包的表单文件夹中,并使用名称空间“use”检索):

这个自定义字段中有什么

namespace Myproject\MyBundle\Form\TaskTypes;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SimpletextType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'disabled' => true,
            'required' => false,
            'mapped' => false,
        ]);
    }

    public function getParent()
    {
        return 'text';
    }

    public function getName()
    {
        return 'simpletext';
    }
}
整个魔法都在模板中显现出来。对于自定义表单类型,需要创建自定义主题(请参见)。在那里:

{%block simpletext_label%}{%endblock%}
{%block simpletext_widget%}
{{form.vars.data}

{%endblock%} {%block simpletext_errors%}{%endblock%}

请参阅,字段小部件中没有标签,没有错误(它只是一个文本),只有文本。使用动态模板生成表单非常方便。

不知道我怎么会错过这一点。。谢谢,我在看“定制表单”文件。
private function constructSimpletextField(FormField $field)
{
    $this->buildedForm->add(
        $field->getFieldName(),
        new SimpletextType(),
        [
            'label' => $field->getName(),
            'data' => $field->getPlaceholder(),
        ]
    );
}
namespace Myproject\MyBundle\Form\TaskTypes;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SimpletextType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'disabled' => true,
            'required' => false,
            'mapped' => false,
        ]);
    }

    public function getParent()
    {
        return 'text';
    }

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