Symfony2, как сделать флажки? - PullRequest
3 голосов
/ 20 декабря 2011

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

{{ 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?

Спасибо.

Ответы [ 3 ]

16 голосов
/ 20 декабря 2011

Из документов Symfony

Что вам в основном нужно сделать, так это перегрузить checkbox_widget block.

{% 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).

8 голосов
/ 18 июля 2012

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

В самом простом, визуализации формы вы можете сделать:

{{ 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 %}

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

1 голос
/ 21 декабря 2011

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

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

input, label {
    float: left;
}

input {
    clear: left;
}

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

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

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

...