|
344 | 344 | {%- endblock repeated_row -%} |
345 | 345 |
|
346 | 346 | {%- block form_row -%} |
347 | | - {%- set widget_attr = {} -%} |
| 347 | + {%- set attr = {} -%} |
| 348 | + {%- set aria_describedby = [] -%} |
348 | 349 | {%- if help -%} |
349 | | - {%- set widget_attr = {attr: {'aria-describedby': id ~ '_help'}} -%} |
| 350 | + {%- set aria_describedby = aria_describedby|merge([id ~ '_help']) -%} |
350 | 351 | {%- endif -%} |
| 352 | + {%- if errors|length > 0 -%} |
| 353 | + {%- set aria_describedby = aria_describedby|merge(errors|map((_, index) => id ~ '_error' ~ (index + 1))) -%} |
| 354 | + {%- endif -%} |
| 355 | + {%- if aria_describedby|length > 0 -%} |
| 356 | + {%- set attr = attr|merge({'aria-describedby': aria_describedby|join(' ')}) -%} |
| 357 | + {%- endif -%} |
| 358 | + {%- if errors|length > 0 -%} |
| 359 | + {%- set attr = attr|merge({'aria-invalid': 'true'}) -%} |
| 360 | + {%- endif -%} |
| 361 | + {%- set widget_attr = {attr: attr} -%} |
| 362 | + {{- block('form_row_render') -}} |
| 363 | +{%- endblock form_row -%} |
| 364 | + |
| 365 | +{%- block form_row_render -%} |
351 | 366 | <div{% with {attr: row_attr} %}{{ block('attributes') }}{% endwith %}> |
352 | 367 | {{- form_label(form) -}} |
353 | 368 | {{- form_errors(form) -}} |
354 | 369 | {{- form_widget(form, widget_attr) -}} |
355 | 370 | {{- form_help(form) -}} |
356 | 371 | </div> |
357 | | -{%- endblock form_row -%} |
| 372 | +{%- endblock form_row_render -%} |
358 | 373 |
|
359 | 374 | {%- block button_row -%} |
360 | 375 | <div{% with {attr: row_attr} %}{{ block('attributes') }}{% endwith %}> |
|
399 | 414 | {%- if errors|length > 0 -%} |
400 | 415 | <ul> |
401 | 416 | {%- for error in errors -%} |
402 | | - <li>{{ error.message }}</li> |
| 417 | + <li id="{{ id ~ '_error' ~ loop.index }}">{{ error.message }}</li> |
403 | 418 | {%- endfor -%} |
404 | 419 | </ul> |
405 | 420 | {%- endif -%} |
|
0 commit comments