3 {%- block form_widget -%}
5 {{- block('form_widget_compound') -}}
7 {{- block('form_widget_simple') -}}
9 {%- endblock form_widget -%}
11 {%- block form_widget_simple -%}
12 {%- set type = type|default('text') -%}
13 <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
14 {%- endblock form_widget_simple -%}
16 {%- block form_widget_compound -%}
17 <div {{ block('widget_container_attributes') }}>
18 {%- if form is rootform -%}
19 {{ form_errors(form) }}
21 {{- block('form_rows') -}}
22 {{- form_rest(form) -}}
24 {%- endblock form_widget_compound -%}
26 {%- block collection_widget -%}
27 {% if prototype is defined %}
28 {%- set attr = attr|merge({'data-prototype': form_row(prototype) }) -%}
30 {{- block('form_widget') -}}
31 {%- endblock collection_widget -%}
33 {%- block textarea_widget -%}
34 <textarea {{ block('widget_attributes') }}>{{ value }}</textarea>
35 {%- endblock textarea_widget -%}
37 {%- block choice_widget -%}
39 {{- block('choice_widget_expanded') -}}
41 {{- block('choice_widget_collapsed') -}}
43 {%- endblock choice_widget -%}
45 {%- block choice_widget_expanded -%}
46 <div {{ block('widget_container_attributes') }}>
47 {%- for child in form %}
48 {{- form_widget(child) -}}
49 {{- form_label(child, null, {translation_domain: choice_translation_domain}) -}}
52 {%- endblock choice_widget_expanded -%}
54 {%- block choice_widget_collapsed -%}
55 {%- if required and placeholder is none and not placeholder_in_choices and not multiple and (attr.size is not defined or attr.size <= 1) -%}
56 {% set required = false %}
58 <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
59 {%- if placeholder is not none -%}
60 <option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ placeholder != '' ? (translation_domain is same as(false) ? placeholder : placeholder|trans({}, translation_domain)) }}</option>
62 {%- if preferred_choices|length > 0 -%}
63 {% set options = preferred_choices %}
64 {{- block('choice_widget_options') -}}
65 {%- if choices|length > 0 and separator is not none -%}
66 <option disabled="disabled">{{ separator }}</option>
69 {%- set options = choices -%}
70 {{- block('choice_widget_options') -}}
72 {%- endblock choice_widget_collapsed -%}
74 {%- block choice_widget_options -%}
75 {% for group_label, choice in options %}
76 {%- if choice is iterable -%}
77 <optgroup label="{{ choice_translation_domain is same as(false) ? group_label : group_label|trans({}, choice_translation_domain) }}">
78 {% set options = choice %}
79 {{- block('choice_widget_options') -}}
82 <option value="{{ choice.value }}"{% if choice.attr %}{% with { attr: choice.attr } %}{{ block('attributes') }}{% endwith %}{% endif %}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice_translation_domain is same as(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}</option>
85 {%- endblock choice_widget_options -%}
87 {%- block checkbox_widget -%}
88 <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
89 {%- endblock checkbox_widget -%}
91 {%- block radio_widget -%}
92 <input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
93 {%- endblock radio_widget -%}
95 {%- block datetime_widget -%}
96 {% if widget == 'single_text' %}
97 {{- block('form_widget_simple') -}}
99 <div {{ block('widget_container_attributes') }}>
100 {{- form_errors(form.date) -}}
101 {{- form_errors(form.time) -}}
102 {{- form_widget(form.date) -}}
103 {{- form_widget(form.time) -}}
106 {%- endblock datetime_widget -%}
108 {%- block date_widget -%}
109 {%- if widget == 'single_text' -%}
110 {{ block('form_widget_simple') }}
112 <div {{ block('widget_container_attributes') }}>
113 {{- date_pattern|replace({
114 '{{ year }}': form_widget(form.year),
115 '{{ month }}': form_widget(form.month),
116 '{{ day }}': form_widget(form.day),
120 {%- endblock date_widget -%}
122 {%- block time_widget -%}
123 {%- if widget == 'single_text' -%}
124 {{ block('form_widget_simple') }}
126 {%- set vars = widget == 'text' ? { 'attr': { 'size': 1 }} : {} -%}
127 <div {{ block('widget_container_attributes') }}>
128 {{ form_widget(form.hour, vars) }}{% if with_minutes %}:{{ form_widget(form.minute, vars) }}{% endif %}{% if with_seconds %}:{{ form_widget(form.second, vars) }}{% endif %}
131 {%- endblock time_widget -%}
133 {%- block dateinterval_widget -%}
134 {%- if widget == 'single_text' -%}
135 {{- block('form_widget_simple') -}}
137 <div {{ block('widget_container_attributes') }}>
138 {{- form_errors(form) -}}
139 <table class="{{ table_class|default('') }}" role="presentation">
142 {%- if with_years %}<th>{{ form_label(form.years) }}</th>{% endif -%}
143 {%- if with_months %}<th>{{ form_label(form.months) }}</th>{% endif -%}
144 {%- if with_weeks %}<th>{{ form_label(form.weeks) }}</th>{% endif -%}
145 {%- if with_days %}<th>{{ form_label(form.days) }}</th>{% endif -%}
146 {%- if with_hours %}<th>{{ form_label(form.hours) }}</th>{% endif -%}
147 {%- if with_minutes %}<th>{{ form_label(form.minutes) }}</th>{% endif -%}
148 {%- if with_seconds %}<th>{{ form_label(form.seconds) }}</th>{% endif -%}
153 {%- if with_years %}<td>{{ form_widget(form.years) }}</td>{% endif -%}
154 {%- if with_months %}<td>{{ form_widget(form.months) }}</td>{% endif -%}
155 {%- if with_weeks %}<td>{{ form_widget(form.weeks) }}</td>{% endif -%}
156 {%- if with_days %}<td>{{ form_widget(form.days) }}</td>{% endif -%}
157 {%- if with_hours %}<td>{{ form_widget(form.hours) }}</td>{% endif -%}
158 {%- if with_minutes %}<td>{{ form_widget(form.minutes) }}</td>{% endif -%}
159 {%- if with_seconds %}<td>{{ form_widget(form.seconds) }}</td>{% endif -%}
163 {%- if with_invert %}{{ form_widget(form.invert) }}{% endif -%}
166 {%- endblock dateinterval_widget -%}
168 {%- block number_widget -%}
169 {# type="number" doesn't work with floats #}
170 {%- set type = type|default('text') -%}
171 {{ block('form_widget_simple') }}
172 {%- endblock number_widget -%}
174 {%- block integer_widget -%}
175 {%- set type = type|default('number') -%}
176 {{ block('form_widget_simple') }}
177 {%- endblock integer_widget -%}
179 {%- block money_widget -%}
180 {{ money_pattern|replace({ '{{ widget }}': block('form_widget_simple') })|raw }}
181 {%- endblock money_widget -%}
183 {%- block url_widget -%}
184 {%- set type = type|default('url') -%}
185 {{ block('form_widget_simple') }}
186 {%- endblock url_widget -%}
188 {%- block search_widget -%}
189 {%- set type = type|default('search') -%}
190 {{ block('form_widget_simple') }}
191 {%- endblock search_widget -%}
193 {%- block percent_widget -%}
194 {%- set type = type|default('text') -%}
195 {{ block('form_widget_simple') }} %
196 {%- endblock percent_widget -%}
198 {%- block password_widget -%}
199 {%- set type = type|default('password') -%}
200 {{ block('form_widget_simple') }}
201 {%- endblock password_widget -%}
203 {%- block hidden_widget -%}
204 {%- set type = type|default('hidden') -%}
205 {{ block('form_widget_simple') }}
206 {%- endblock hidden_widget -%}
208 {%- block email_widget -%}
209 {%- set type = type|default('email') -%}
210 {{ block('form_widget_simple') }}
211 {%- endblock email_widget -%}
213 {%- block range_widget -%}
214 {% set type = type|default('range') %}
215 {{- block('form_widget_simple') -}}
216 {%- endblock range_widget %}
218 {%- block button_widget -%}
219 {%- if label is empty -%}
220 {%- if label_format is not empty -%}
221 {% set label = label_format|replace({
225 {%- elseif label is same as(false) -%}
226 {% set translation_domain = false %}
228 {% set label = name|humanize %}
231 <button type="{{ type|default('button') }}" {{ block('button_attributes') }}>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}</button>
232 {%- endblock button_widget -%}
234 {%- block submit_widget -%}
235 {%- set type = type|default('submit') -%}
236 {{ block('button_widget') }}
237 {%- endblock submit_widget -%}
239 {%- block reset_widget -%}
240 {%- set type = type|default('reset') -%}
241 {{ block('button_widget') }}
242 {%- endblock reset_widget -%}
244 {%- block tel_widget -%}
245 {%- set type = type|default('tel') -%}
246 {{ block('form_widget_simple') }}
247 {%- endblock tel_widget -%}
249 {%- block color_widget -%}
250 {%- set type = type|default('color') -%}
251 {{ block('form_widget_simple') }}
252 {%- endblock color_widget -%}
256 {%- block form_label -%}
257 {% if label is not same as(false) -%}
258 {% if not compound -%}
259 {% set label_attr = label_attr|merge({'for': id}) %}
262 {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
264 {% if label is empty -%}
265 {%- if label_format is not empty -%}
266 {% set label = label_format|replace({
271 {% set label = name|humanize %}
274 <{{ element|default('label') }}{% if label_attr %}{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}{% endif %}>
275 {%- if translation_domain is same as(false) -%}
278 {{- label|trans({}, translation_domain) -}}
280 </{{ element|default('label') }}>
282 {%- endblock form_label -%}
284 {%- block button_label -%}{%- endblock -%}
288 {%- block repeated_row -%}
290 No need to render the errors here, as all errors are mapped
291 to the first child (see RepeatedTypeValidatorExtension).
293 {{- block('form_rows') -}}
294 {%- endblock repeated_row -%}
296 {%- block form_row -%}
298 {{- form_label(form) -}}
300 {{- form_widget(form) -}}
301 {%- if errors|length > 0 -%}
303 {{- form_errors(form) -}}
308 {%- endblock form_row -%}
310 {%- block button_row -%}
312 {{- form_widget(form) -}}
314 {%- endblock button_row -%}
316 {%- block hidden_row -%}
317 {{ form_widget(form) }}
318 {%- endblock hidden_row -%}
323 {{ form_start(form) }}
324 {{- form_widget(form) -}}
326 {%- endblock form -%}
328 {%- block form_start -%}
329 {%- do form.setMethodRendered() -%}
330 {% set method = method|upper %}
331 {%- if method in ["GET", "POST"] -%}
332 {% set form_method = method %}
334 {% set form_method = "POST" %}
336 <form name="{{ name }}" method="{{ form_method|lower }}"{% if action != '' %} action="{{ action }}"{% endif %}{% for attrname, attrvalue in attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}{% if multipart %} enctype="multipart/form-data"{% endif %}>
337 {%- if form_method != method -%}
338 <input type="hidden" name="_method" value="{{ method }}" />
340 {%- endblock form_start -%}
342 {%- block form_end -%}
343 {%- if not render_rest is defined or render_rest -%}
344 {{ form_rest(form) }}
347 {%- endblock form_end -%}
349 {%- block form_errors -%}
350 {%- if errors|length > 0 -%}
352 {%- for error in errors -%}
353 <li>{{ error.message }}</li>
357 {%- endblock form_errors -%}
359 {%- block form_rest -%}
360 {% for child in form -%}
361 {% if not child.rendered %}
362 {{- form_row(child) -}}
366 {% if not form.methodRendered and form is rootform %}
367 {%- do form.setMethodRendered() -%}
368 {% set method = method|upper %}
369 {%- if method in ["GET", "POST"] -%}
370 {% set form_method = method %}
372 {% set form_method = "POST" %}
375 {%- if form_method != method -%}
376 <input type="hidden" name="_method" value="{{ method }}" />
379 {% endblock form_rest %}
383 {%- block form_rows -%}
384 {% for child in form %}
385 {{- form_row(child) -}}
387 {%- endblock form_rows -%}
389 {%- block widget_attributes -%}
390 id="{{ id }}" name="{{ full_name }}"
391 {%- if disabled %} disabled="disabled"{% endif -%}
392 {%- if required %} required="required"{% endif -%}
393 {{ block('attributes') }}
394 {%- endblock widget_attributes -%}
396 {%- block widget_container_attributes -%}
397 {%- if id is not empty %}id="{{ id }}"{% endif -%}
398 {{ block('attributes') }}
399 {%- endblock widget_container_attributes -%}
401 {%- block button_attributes -%}
402 id="{{ id }}" name="{{ full_name }}"{% if disabled %} disabled="disabled"{% endif -%}
403 {{ block('attributes') }}
404 {%- endblock button_attributes -%}
406 {% block attributes -%}
407 {%- for attrname, attrvalue in attr -%}
409 {%- if attrname in ['placeholder', 'title'] -%}
410 {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
411 {%- elseif attrvalue is same as(true) -%}
412 {{- attrname }}="{{ attrname }}"
413 {%- elseif attrvalue is not same as(false) -%}
414 {{- attrname }}="{{ attrvalue }}"
417 {%- endblock attributes -%}