我想做一些非常简单的事情,但我无法弄清楚如何管理它。我有一个表格:
{{ 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)
但它会生成一个文本字段(而不是简单的文本)。我不在乎文本是在表单构建器中设置还是直接在树枝模板中设置...只要它在我的两个文本字段之间。有什么想法吗?
非常感谢!
答案 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非常清楚并且很好地解释了这一点。