form.html.twig 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. {% if form is null %}
  2. {% set form = grav.session.getFlashObject('form') %}
  3. {% endif %}
  4. {% set scope = scope ?: 'data.' %}
  5. {% set multipart = '' %}
  6. {% set blueprints = blueprints ?? form.blueprint() %}
  7. {% set method = form.method|upper|default('POST') %}
  8. {% set client_side_validation = form.client_side_validation is not null ? form.client_side_validation : config.plugins.form.client_side_validation|default(true) %}
  9. {% set inline_errors = form.inline_errors is not null ? form.inline_errors : config.plugins.form.inline_errors(false) %}
  10. {% set data = data ?? form.data %}
  11. {% set context = context ?? data %}
  12. {% for field in form.fields %}
  13. {% if (method == 'POST' and field.type == 'file') %}
  14. {% set multipart = ' enctype="multipart/form-data"' %}
  15. {% endif %}
  16. {% endfor %}
  17. {% set action = form.action ?: page.route ~ uri.params %}
  18. {% set action = action starts with 'http' ? action : base_url ~ action %}
  19. {% if (action == base_url_relative) %}
  20. {% set action = base_url_relative ~ '/' ~ page.slug %}
  21. {% endif %}
  22. {% if form.keep_alive %}
  23. {% if grav.browser.browser == 'msie' and grav.browser.version < 12 %}
  24. {% do assets.addJs('plugin://form/assets/object.assign.polyfill.js') %}
  25. {% endif %}
  26. {% do assets.addJs('plugin://form/assets/form.vendor.js', { 'group': 'bottom', 'loading': 'defer' }) %}
  27. {% do assets.addJs('plugin://form/assets/form.min.js', { 'group': 'bottom', 'loading': 'defer' }) %}
  28. {% endif %}
  29. {% do assets.addInlineJs("
  30. window.GravForm = window.GravForm || {};
  31. window.GravForm.config = {
  32. current_url: '" ~ uri.route(true) ~"',
  33. base_url_relative: '" ~ base_url_relative ~ "',
  34. param_sep: '"~ config.system.param_sep ~ "',
  35. form_nonce: '" ~ form.getNonce() ~ "',
  36. session_timeout: " ~ config.system.session.timeout ~ "
  37. };
  38. window.GravForm.translations = Object.assign({}, window.GravForm.translations || {}, { PLUGIN_FORM: {} });
  39. ", {'group': 'bottom', 'position': 'before'}) %}
  40. {# Backwards Compatibility for block overrides #}
  41. {% set override_form_classes %}
  42. {% block form_classes -%}
  43. {{ form_outer_classes }} {{ form.classes }}
  44. {%- endblock %}
  45. {% endset %}
  46. {% set override_inner_markup_fields_start %}
  47. {% block inner_markup_fields_start %}{% endblock %}
  48. {% endset %}
  49. {% set override_inner_markup_fields_end %}
  50. {% block inner_markup_fields_end %}{% endblock %}
  51. {% endset %}
  52. {% set override_inner_markup_fields %}
  53. {% block inner_markup_fields %}
  54. {% for field_name, field in form.fields %}
  55. {% set field_name = field.name ?? field_name %}
  56. {% if field_name and not field.validate.ignore %}
  57. {%- if field_name starts with '.' -%}
  58. {% set field_name = field_name[1:] %}
  59. {% set field = field|merge({ name: field_name }) %}
  60. {% endif %}
  61. {% set value = form ? form.value(field_name) : data.value(field_name) %}
  62. {% block inner_markup_field_open %}{% endblock %}
  63. {% block field %}
  64. {% include "forms/fields/#{field.type}/#{field.type}.html.twig" ignore missing %}
  65. {% endblock %}
  66. {% block inner_markup_field_close %}{% endblock %}
  67. {% endif %}
  68. {% endfor %}
  69. {% endblock %}
  70. {% endset %}
  71. {% set override_inner_markup_buttons_start %}
  72. {% block inner_markup_buttons_start %}
  73. <div class="{{ form_button_outer_classes ?: 'buttons'}}">
  74. {% endblock %}
  75. {% endset %}
  76. {% set override_inner_markup_buttons_end %}
  77. {% block inner_markup_buttons_end %}
  78. </div>
  79. {% endblock %}
  80. {% endset %}
  81. {# Embed for HTML layout #}
  82. {% embed 'forms/layouts/form.html.twig' %}
  83. {% block embed_form_core %}
  84. name="{{ form.name }}"
  85. action="{{ action | trim('/', 'right') }}"
  86. method="{{ method }}"{{ multipart }}
  87. {% if form.id %}id="{{ form.id }}"{% endif %}
  88. {% if form.novalidate %}novalidate{% endif %}
  89. {% if form.keep_alive %}data-grav-keepalive="true"{% endif %}
  90. {% endblock %}
  91. {% block embed_form_classes -%}
  92. class="{{ parent() }} {{ override_form_classes|trim }}"
  93. {%- endblock %}
  94. {% block embed_fields %}
  95. {{ override_inner_markup_fields_start|raw }}
  96. {{ override_inner_markup_fields|raw }}
  97. {% include "forms/fields/formname/formname.html.twig" %}
  98. {% include "forms/fields/formtask/formtask.html.twig" %}
  99. {% include 'forms/fields/uniqueid/uniqueid.html.twig' %}
  100. {{ nonce_field(form.getNonceAction() ?? 'form', form.getNonceName() ?? 'form-nonce')|raw }}
  101. {{ override_inner_markup_fields_end|raw }}
  102. {% endblock %}
  103. {% block embed_buttons %}
  104. {{ override_inner_markup_buttons_start|raw }}
  105. {% for button in form.buttons %}
  106. {% if button.outerclasses is defined %}<div class="{{ button.outerclasses }}">{% endif %}
  107. {% if button.url %}
  108. {% set button_url = button.url starts with 'http' ? button.url : base_url ~ button.url %}
  109. {% endif %}
  110. {% embed 'forms/layouts/button.html.twig' %}
  111. {% block embed_button_core %}
  112. {% if button.id %}id="{{ button.id }}"{% endif %}
  113. {% if button.disabled %}disabled="disabled"{% endif %}
  114. {% if button.task %}name="task" value="{{ button.task }}"{% endif %}
  115. type="{{ button.type|default('submit') }}"
  116. {% endblock %}
  117. {% block embed_button_classes %}
  118. {% block button_classes %}
  119. class="{{ form_button_classes ?: 'button' }} {{ button.classes }}"
  120. {% endblock %}
  121. {% endblock %}
  122. {% block embed_button_content -%}
  123. {%- set button_value = button.value|t|default('Submit') -%}
  124. {%- if button.html -%}
  125. {{- button_value|trim|raw -}}
  126. {%- else -%}
  127. {{- button_value|trim|e -}}
  128. {%- endif -%}
  129. {%- endblock %}
  130. {% endembed %}
  131. {% include 'partials/form-messages.html.twig' %}
  132. {% if button.outerclasses is defined %}</div>{% endif %}
  133. {% endfor %}
  134. {{ override_inner_markup_buttons_end }}
  135. {% endblock %}
  136. {% endembed %}
  137. {% if config.forms.dropzone.enabled %}
  138. <div id="dropzone-template" style="display:none;">
  139. {% include 'forms/dropzone/template.html.twig' %}
  140. </div>
  141. {% endif %}