templates/packages/core/action/http/registration.html.twig line 1

  1. {% extends 'packages/core/layout/base_public_half_sized.html.twig' %}
  2. {% form_theme form 'packages/core/form/bootstrap_5_layout.html.twig' %}
  3. {% trans_default_domain 'core@messages' %}
  4. {% block javascripts %}
  5.     <script type="text/javascript">
  6.         function onGoogleReCaptchaApiLoad() {
  7.             let widgets = document.querySelectorAll('.js-google-recaptcha');
  8.             for (let i = 0; i < widgets.length; i++) {
  9.                 renderReCaptcha(widgets[i]);
  10.             }
  11.         }
  12.         function renderReCaptcha(widget) {
  13.             let form = widget.closest('form');
  14.             let widgetType = widget.getAttribute('data-type');
  15.             let widgetParameters = {
  16.                 'sitekey': widget.getAttribute('data-site-key')
  17.             };
  18.             if (widgetType === 'invisible') {
  19.                 widgetParameters['callback'] = function () {
  20.                     form.submit()
  21.                 };
  22.                 widgetParameters['size'] = "invisible";
  23.             }
  24.             let widgetId = grecaptcha.render(widget, widgetParameters);
  25.             if (widgetType === 'invisible') {
  26.                 bindChallengeToSubmitButtons(form, widgetId);
  27.             }
  28.         }
  29.         function bindChallengeToSubmitButtons(form, reCaptchaId) {
  30.             getSubmitButtons(form).forEach(function (button) {
  31.                 button.addEventListener('click', function (e) {
  32.                     e.preventDefault();
  33.                     grecaptcha.execute(reCaptchaId);
  34.                 });
  35.             });
  36.         }
  37.         function getSubmitButtons(form) {
  38.             let buttons = form.querySelectorAll('button, input');
  39.             let submitButtons = [];
  40.             for (let i= 0; i < buttons.length; i++) {
  41.                 let button = buttons[i];
  42.                 if (button.getAttribute('type') === 'submit') {
  43.                     submitButtons.push(button);
  44.                 }
  45.             }
  46.             return submitButtons;
  47.         }
  48.     </script>
  49.     <script type="text/javascript" src="https://www.google.com/recaptcha/api.js?onload=onGoogleReCaptchaApiLoad&render=explicit" async defer></script>
  50.     {{ parent() }}
  51. {% endblock %}
  52. {% block title %}{{ 'title.registration'|trans }}{% endblock %}
  53. {% block content %}
  54.     <form
  55.             action="{{ form.vars.action }}"
  56.             method="{{ form.vars.method }}"
  57.             class="form w-100"
  58.             novalidate="novalidate"
  59.             autocomplete="off"
  60.     >
  61.         {% include 'packages/core/layout/fragments/_public_half_sized_header.html.twig' with {
  62.             'header': 'header.registration'|trans,
  63.             'subtitle': 'subtitle.registration'|trans
  64.         } %}
  65.         {{ form_errors(form) }}
  66.         <div class="fv-row mb-7">
  67.             <div class="form-floating">
  68.                 {{ form_widget(form.contact.firstName, { 'attr': { 'placeholder': 'placeholder.first_name'|trans } }) }}
  69.                 {{ form_label(form.contact.firstName, 'label.first_name'|trans) }}
  70.             </div>
  71.             {{ form_errors(form.contact.firstName) }}
  72.         </div>
  73.         <div class="fv-row mb-7">
  74.             <div class="form-floating">
  75.                 {{ form_widget(form.contact.lastName, { 'attr': { 'placeholder': 'placeholder.last_name'|trans } }) }}
  76.                 {{ form_label(form.contact.lastName, 'label.last_name'|trans) }}
  77.             </div>
  78.             {{ form_errors(form.contact.lastName) }}
  79.         </div>
  80.         <div class="fv-row mb-7">
  81.             <div class="form-floating">
  82.                 {{ form_widget(form.username, { 'attr': {
  83.                     'autocomplete': 'email',
  84.                     'placeholder': 'placeholder.username'|trans,
  85.                 } }) }}
  86.                 {{ form_label(form.username, 'label.username'|trans) }}
  87.             </div>
  88.             {{ form_errors(form.username) }}
  89.         </div>
  90.         <div class="fv-row mb-7" {{ stimulus_controller('core/password_meter') }}>
  91.             <div class="form-floating" {{ stimulus_controller('core/password_visibility') }} {{ stimulus_target('core/password_meter', 'inputWrapper') }}>
  92.                 {{ form_widget(form.password.first, { 'attr': {
  93.                     'autocomplete': 'new-password',
  94.                     'placeholder': 'placeholder.password'|trans,
  95.                     'data-core--password-visibility-target': 'input',
  96.                     'data-action': 'input->core--password-visibility#update'
  97.                 } }) }}
  98.                 {{ form_label(form.password.first, 'label.password'|trans) }}
  99.             </div>
  100.             <div class="text-muted mt-3">{{ 'help.password.requirements'|trans }}</div>
  101.             {{ form_errors(form.password.first) }}
  102.         </div>
  103.         <div class="fv-row mb-7">
  104.             <div class="form-floating" {{ stimulus_controller('core/password_visibility') }}>
  105.                 {{ form_widget(form.password.second, { 'attr': {
  106.                     'autocomplete': 'new-password',
  107.                     'placeholder': 'placeholder.password_repeat'|trans,
  108.                     'data-core--password-visibility-target': 'input',
  109.                     'data-action': 'input->core--password-visibility#update'
  110.                 } }) }}
  111.                 {{ form_label(form.password.second, 'label.password_repeat'|trans) }}
  112.             </div>
  113.             {{ form_errors(form.password.second) }}
  114.         </div>
  115.         <div class="fv-row mb-8">
  116.             {{ form_widget(form.consent, { 'attr': { 'checked': false }, 'label': 'label.registration_consent'|trans }) }}
  117.         </div>
  118.         {{ form_widget(form.recaptcha) }}
  119.         <div class="d-grid mb-10">
  120.             <button type="submit" id="kt_sign_up_submit" class="btn btn-primary">
  121.                 {{ 'action.register'|trans }}
  122.             </button>
  123.         </div>
  124.         <div class="text-gray-500 text-center fs-11rem  fw-semibold mb-7">
  125.             {{ 'text.already_have_account'|trans }} <a href="{{ path('app_login') }}" class="link-primary btn-border-white fw-semibold">{{ 'action.login'|trans }}</a>
  126.         </div>
  127.         {{ form_widget(form._token) }}
  128.     </form>
  129. {% endblock %}