Symfony2, как отображать флажки?

У меня есть форма конструктора с несколькими вариантами списка стран. Когда я отображаю их в своей форме следующим образом:

{{ form_widget(edit_form.countries) }}

Они выглядят следующим образом:

<input type="checkbox" name="..." value="AD" /><label for="...">Andorra</label>
<input type="checkbox" name="..." value="AE" /><label for="...">United Arab Emirates</label>
<input type="checkbox" name="..." value="AF" /><label for="...">Afghanistan</label>

Я бы хотел, чтобы каждая опция отображалась в отдельной строке браузера, а не все подряд. Как я могу вставить html вокруг или между вариантами? Или есть метод CSS для этого?

Спасибо.


person user747252    schedule 19.12.2011    source источник


Ответы (3)


Из документации Symfony

В основном вам нужно перегрузить блок checkbox_widget.

{% form_theme form _self %}

{% block checkbox_widget %}
{% spaceless %}
    <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
{% endspaceless %}
{% endblock checkbox_widget %}

Конечно, вы можете разместить свои виджеты в отдельной строке с помощью CSS (но это не вопрос Symfony2).

person Jakub Zalas    schedule 20.12.2011
comment
Спасибо, я не нашел документы очень ясными по этому поводу. Ценю ваш ответ. - person user747252; 23.12.2011
comment
Я также нашел этот другой способ отображения флажков полезным: - person Jason Swett; 25.11.2012
comment
@JasonSwett Зависит от того, чего вы пытаетесь достичь. Отображение полей, индивидуально предложенных в ответе, на который вы ссылаетесь, заставляет вас копировать одни и те же фрагменты html везде, где вы хотите использовать флажок. Это может быть полезно в некоторых случаях, например, когда у вас нет согласованного способа отображения флажков. В большинстве случаев лучше определить этот блок один раз, особенно если он всегда один и тот же. - person Jakub Zalas; 25.11.2012
comment
Верно. В некоторых случаях этот ответ может быть полезен, а в других случаях ответ, который я связал, может быть полезен. - person Jason Swett; 25.11.2012
comment
Как ведет себя метка при расширении виджета? Я также хотел бы добавить метку в окружающий ‹div› - person Rvanlaak; 13.05.2013

Я нашел более ленивый способ сделать это, перебирая массив формы/выбора.

В самом простом случае рендеринг формы вы могли бы сделать:

{{ form_widget(form) }}

Для большей детализации вы можете сделать:

{{ form_row(form.itemA) }}
{{ form_row(form.itemB) }}
{{ form_row(form.itemC) }}

Но если «itemA» является множественным выбором, вы застряли со всем списком, отображаемым в одной строке. Если вам нужно немного больше детализации, прежде чем перейти к темам, вы можете сделать это:

{% for t in form.itemA %}
{{ form_row(t) }}
{% endfor %}

Это отобразит каждый флажок в отдельной строке или даст вам возможность делать все, что вы хотите, между каждым элементом.

person SomSanDiego    schedule 18.07.2012

Как сказал Куба в своем ответе, это отчасти звучит как вопрос CSS. С семантической точки зрения введение чего-то вроде тега <br /> не имеет большого значения, но вы можете сделать это, если хотите, следуя документам в ответе Кубы.

Если вы хотите написать какой-нибудь CSS, чтобы эти элементы отображались построчно, вы можете использовать это против вывода symfony по умолчанию:

input, label {
    float: left;
}

input {
    clear: left;
}

Конечно, это на самом деле приведет к тому, что все теги input и label будут перемещаться влево, что может вам не подойти, поэтому вы можете a) поместить свои флажки в другой div и использовать вспомогательный селектор CSS, например .checkboxes input, .checkboxes label или < strong>b) примените пользовательский класс CSS к своим виджетам, используя:

{{ form_widget(form.name, { 'attr': {'class': 'foo'} }) }}

и CSS будет таким же, но вместо input у вас будет .foo.

person Kasheen    schedule 20.12.2011