Bootstrap 3:使用Symfony和Twig格式化复选框

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"文件来更改列数.


Ral*_*sch 3

您需要访问包含有关复选框的信息的表单变量:

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”即可。