Ral*_*sch 10 forms symfony twig silex twitter-bootstrap-3
如何使用Symfony Form Factory和Twig 创建一个格式化的复选框组,如Bootstrap文档中所述?
使用类似的东西
<div class="row">
<div class="col-lg-4">
{{ form_label(form.sample) }}
</div>
<div class="col-lg-8">
{{ form_widget(form.sample) }}
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
不会产生所需的输出:
a)Bootstrap 3结构中的每个复选框,如:
<div class="radio">
<label>
<input type="radio" ... />Option one
</label>
</div>
Run Code Online (Sandbox Code Playgroud)
b)另外,如果需要,可以在两列或更多列中输出复选框:
<div class="row">
<div class="col-lg-6 col-md-6">
<div class="radio"> ... </div>
</div>
<div class="col-lg-6 col-md-6">
<div class="radio"> ... </div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
Jea*_*hef 11
正确的方法是创建自己的表单主题.我不会写这里的全部内容,但重要的是那些:
{% block choice_widget_expanded %}
{% spaceless %}
<div {{ block('widget_container_attributes') }} class="my-form-choices">
{% for child in form %}
{{ form_widget(child) }}
{% endfor %}
</div>
{% endspaceless %}
{% endblock choice_widget_expanded %}
{% block checkbox_widget %}
{% spaceless %}
<div class="checkbox">
<label for="{{ id }}"><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans({}, translation_domain) }}</label>
</div>
{% endspaceless %}
{% endblock checkbox_widget %}
Run Code Online (Sandbox Code Playgroud)
我删除了标签渲染,choice_widget_expanded
因此我可以在标签标签内部使用复选框,就像您在解决方案中所拥有的一样.但你基本上可以在表单主题中做任何你想做的事情.radio_widget
如果您愿意,也可以覆盖.
如果仔细查看复选框周围的div,我就给它了" my-form-choices
" 类.你可以给它你想要的课程.它可能是" col-lg-8
",就像你一样,但对我来说,拥有一个通用的类名更有意义,然后在你自己的less文件中使用mixins.您的较少文件将如下所示:
@import '../../../../../../vendor/twitter/bootstrap/less/bootstrap.less';
.my-form-row {
.make-row();
}
.my-form-choices {
.make-lg-column(8);
}
.my-form-row-label {
.make-lg-column(4);
}
Run Code Online (Sandbox Code Playgroud)
但这取决于你.如果您不想这样做,则不必这样做.最后,您可以通过启动页面的树枝来使用您的主题,如下所示:
{% extends 'MyOwnBundle::layout.html.twig' %}
{% form_theme form 'MyOwnBundle:Component:formtype.html.twig' %}
Run Code Online (Sandbox Code Playgroud)
你就像那样显示行(我在测试中使用的字段是可用性,你的是样本):
{{ form_row(form.availability) }}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过(使用Symfony 2.4),它可以工作.输出是这样的:
<div class="my-form-row">
<div class="my-form-row-label">
<label class="required">Availability</label>
</div>
<div class="my-form-choices" id="myown_website_contactmessage_availability">
<div class="checkbox">
<label for="myown_website_contactmessage_availability_0">
<input type="checkbox" value="morning" name="myown_website_contactmessage[availability][]" id="myown_website_contactmessage_availability_0">
Morning
</label>
</div>
<div class="checkbox">
<label for="myown_website_contactmessage_availability_1">
<input type="checkbox" value="afternoon" name="myown_website_contactmessage[availability][]" id="myown_website_contactmessage_availability_1">
Afternoon
</label>
</div>
<div class="checkbox">
<label for="myown_website_contactmessage_availability_2">
<input type="checkbox" value="evening" name="myown_website_contactmessage[availability][]" id="myown_website_contactmessage_availability_2">
Evening
</label>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
另请注意,我没有子行,就像您在解决方案中一样.事实上,您的解决方案超出了您首先要问的问题.
编辑:这是一个有多列的解决方案
要有多个列,这是一个快速的解决方案.首先,表单主题可能是这样的:
{% block choice_widget_expanded %}
{% spaceless %}
<div class="my-form-choices-container">
<div {{ block('widget_container_attributes') }} class="my-form-choices">
{% for child in form %}
{{ form_widget(child) }}
{% endfor %}
</div>
</div>
{% endspaceless %}
{% endblock choice_widget_expanded %}
{% block checkbox_widget %}
{% spaceless %}
<div class="my-form-choice">
<div class="checkbox">
<label for="{{ id }}"><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans({}, translation_domain) }}</label>
</div>
</div>
{% endspaceless %}
{% endblock checkbox_widget %}
Run Code Online (Sandbox Code Playgroud)
然后您的较少文件将如下所示:
@import '../../../../../../vendor/twitter/bootstrap/less/bootstrap.less';
.my-form-row {
.make-row();
}
.my-form-row-label {
.make-lg-column(4);
}
.my-form-choices-container {
.make-lg-column(8);
}
.my-form-choices {
.make-row();
}
.my-form-choice {
.make-md-column(6);
}
Run Code Online (Sandbox Code Playgroud)
在此解决方案中,您可以通过更改列的大小来更改列数.细胞堆叠整齐.在这种情况下,最好少编译(我不会在这里解释).我尝试过这个解决方案,效果很好.在这种情况下使用较少的优点是,您可以在多个页面上使用相同的表单主题,并通过为每个页面使用不同的"less"文件来更改列数.
您需要访问包含有关复选框的信息的表单变量:
form.sample.vars.form.children
Run Code Online (Sandbox Code Playgroud)
现在您可以循环遍历复选框并访问值:
{% for children in form.sample.vars.form.children %}
<div class="checkbox>
<label>
<input type="checkbox" name="{{ children.vars.full_name }}" id="{{ children.vars.id }}" value="{{ children.vars.value }}"{% if children.vars.data %} checked="checked"{% endif %} />
{% if children.vars.label is defined %}
{{ children.vars.label|trans }}
{% else %}
{{ children.vars.value|capitalize|trans }}
{% endif %}
</label>
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我将此代码放置在 Twig 模板中,并添加一些逻辑来创建具有可变列的行,因此它看起来像这样:
{% set cols = columns|default(1) %}
{% set i = 1 %}
{% for children in childrens %}
{% if i == 1 %}<div class="row">{% endif %}
<div class="col-lg-{{ 12/cols }} col-md-{{ 12/cols }}">
<div class="checkbox {{ class|default('') }}">
<label>
<input type="checkbox" name="{{ children.vars.full_name }}" id="{{ children.vars.id }}" value="{{ children.vars.value }}"{% if children.vars.data %} checked="checked"{% endif %} />
{% if children.vars.label is defined %}
{{ children.vars.label|trans }}
{% else %}
{{ children.vars.value|capitalize|trans }}
{% endif %}
</label>
</div>
</div>
{% set i = i+1 %}
{% if i > cols %}
</div>
{% set i = 1 %}
{% endif %}
{% endfor %}
{% if i != 1 %}</div>{% endif %}
Run Code Online (Sandbox Code Playgroud)
现在您可以在需要的地方包含此复选框模板:
<div class="row">
<div class="col-lg-4">
{{ form_label(form.sample) }}
</div>
<div class="col-lg-8">
{% include 'checkbox.twig' with {childrens:form.sample.vars.form.children, columns:2} only %}
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
上面的示例将返回格式良好的 Bootstrap 3 输出,其中两列中带有复选框,如下所示:
<div class="row">
<div class="col-lg-4">
<label class="required">Veranstalter</label>
</div>
<div class="col-lg-8">
<div class="row">
<div class="col-lg-6 col-md-6">
<div class="checkbox ">
<label><input type="checkbox" name="form[sample][]" id="form_sample_0" value="DUMMY">Dummy</label>
</div>
</div>
<div class="col-lg-6 col-md-6">
<div class="checkbox ">
<label><input type="checkbox" name="form[sample][]" id="form_sample_1" value="DUMMY_1">Dummy 1</label>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-6">
<div class="checkbox ">
<label><input type="checkbox" name="form[sample][]" id="form_sample_2" value="DUMMY_2">Dummy 2</label>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
它易于使用,也适用于单选按钮 - 只需将类“checkbox”替换为“radio”即可。
归档时间: |
|
查看次数: |
10767 次 |
最近记录: |