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

时间:2016-01-18 13:37:16

标签: forms symfony twig

我想做一些非常简单的事情,但我无法弄清楚如何管理它。我有一个表格:

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

里面有几个文字字段。我想&#34;插入&#34;两个文本字段之间的一些文本(例如<p>my Text</p>)(让我们在name文本字段和description文本字段之间说出来)。使用表单构建器工具生成表单。我尝试过类似的事情:

$builder
    ->add('stuffName') // works well (text field 1)
    ->add('addedText', 'text', array('label' => 'my Text')) // Trouble here!
    ->add('stuffDescription'); // works well (text field 2)

但它会生成一个文本字段(而不是简单的文本)。我不在乎文本是在表单构建器中设置还是直接在树枝模板中设置...只要它在我的两个文本字段之间。有什么想法吗?

非常感谢!

3 个答案:

答案 0 :(得分:4)

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

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

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

    <p>Your Text</p>

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

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

答案 1 :(得分:1)

此问题中的关键字已生成

让我们假设您在Symfony中构建表单生成器。您有表单,字段和字段项目等实体(选择框的选项或单选按钮字段的按钮)。

因此,您拥有此实体并创建服务以从数据创建表单。在服务中,您构建表单( $ this-&gt; buildedForm - 生成的表单, $ page-&gt; getFormData() - 将数据放入构造的表单中):

$this->buildedForm = $this->formFactory->create(
    'form',
    $page->getFormData(),
    ['action' => '/page/formview/' . $task->getId()]
);

foreach($fields as $field) {
    $fieldBuilderMethod = 'construct' . ucfirst($field->getType()) . 'Field';
    if (method_exists($this, $fieldBuilderMethod)) {
        $this->$fieldBuilderMethod($field);
    }
}
return $this->buildedForm;

你有每种类型的方法,如(Symfony 2的例子):

private function constructInputField(FormField $field)
{
    $this->buildedForm->add(
        $field->getFieldName(),
        'text',
        [
            'label' => $field->getName(),
        ]
    );
}

private function constructTextareaField(FormField $field)
{
    $this->buildedForm->add(
        $field->getFieldName(),
        'textarea',
        [
            'label' => $field->getName(),
        ]
    );
}

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

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

整个魔法出现在模板中。对于自定义表单类型,您需要创建自定义主题(请参阅https://symfony.com/doc/2.7/form/form_customization.html#form-customization-form-themes)。那里:

{% block simpletext_label %}{% endblock %}
{% block simpletext_widget %}
    <p>{{ form.vars.data }}</p>
{% endblock %}
{% block simpletext_errors %}{% endblock %}

请参阅字段小部件中的无标签,无错误(仅文本)和文本。非常方便使用动态模板生成表单。

答案 2 :(得分:0)

这是一个自我解释的示例代码

{{ 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) }}

无论如何,symfony documentation非常清楚并且很好地解释了这一点。