我想在Symfony中自定义表单渲染。我检查了docs,发现可以通过{{ form_theme }}
标签设置主题以进行渲染。如果一次仅显示一个表单,则此方法非常有效,但是如果同一模板中有多个表单,则无法使用。
我的 index.html.twig 中的一个简单示例
{% extends 'base.html.twig' %}
{% block body %}
<h1>Hello Form 1</h1>
{% form_theme form1 'bootstrap_3_layout.html.twig' %}
{{ form_start( form1 ) }}
{{ form_end( form1 ) }}
<h1>Hello Form 2</h1>
{% form_theme form2 'bootstrap_3_horizontal_layout.html.twig' %}
{{ form_start( form2 ) }}
{{ form_end( form2 ) }}
{% endblock %}
如您所见,有两个表单变量,我希望
form1
用'bootstrap_3_layout.html.twig'
呈现,form2
用'bootstrap_3_horizontal_layout.html.twig'
呈现。我不了解Twig的内部原理,但我认为主题覆盖了它们的块定义。结果看起来像这样
所以我的问题是,如何以给定的主题渲染表格而不互相干扰。有什么方法可以在单独的干净 Twig 过程中呈现表单?
我尝试了使用自定义函数的Twig扩展,但似乎该函数使用的是相同的Twig_Environment。我也尝试了一个{%render}%的子请求,但这也不起作用。
最佳答案
Twig 解决方案
如果只想将horizontal
类用于表单,则可以将其添加到form_start()
中:
{% extends 'base.html.twig' %}
{% block body %}
<h1>Hello Form 1</h1>
{% form_theme form1 'bootstrap_3_layout.html.twig' %}
{{ form_start( form1 ) }}
{{ form_end( form1 ) }}
<h1>Hello Form 2</h1>
{% form_theme form2 'bootstrap_3_horizontal_layout.html.twig' %}
{{ form_start(form2, {'class': 'horizontal', 'attr': {'class': 'horizontal'}}) }}
{{ form_end( form2 ) }}
{% endblock %}
谢谢艾哈迈德•斯瓦尼(Ahmed Siouani)的answer。
HTML + CSS解决方案
我建议您将每个Twig标签
{{ form() }}
括在<div>
中,并附上一个类,这将允许您添加特定的CSS规则。请参见下面的示例:/* display the <label> in div.form_1 as red */
div.form_1 label {
color: Red;
}
/* Email field in div.form_2 will only have a width of 50% */
div.form_2 input[type=email] {
width: 50%;
}
/* Password field in div.form_2 will have a left margin and will be narrower */
div.form_2 input[type=password] {
margin-left: 5em;
width: 30%;
}
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet" />
<div class="well">
<h2>Default form</h2>
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
</form>
</div>
<div class="form_1 well">
<h2>Form 1</h2>
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
</form>
</div>
<div class="form_2 well">
<h2>Form 2</h2>
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
</form>
</div>
关于symfony - 如何在Symfony 2的同一模板中呈现具有不同主题的表单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28334110/