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