templates/registration/register.html.twig line 27

Open in your IDE?
  1. {% extends 'base_home.html.twig' %}
  2. {% block title %}Inscription | MaketOu{% endblock %}
  3. {% block body %}
  4.     <!-- Start Banner Area -->
  5.     <section class="banner-area organic-breadcrumb">
  6.         <div class="container">
  7.             <div class="breadcrumb-banner d-flex flex-wrap align-items-center justify-content-end">
  8.                 <div class="col-first">
  9.                     <h1>Inscription</h1>
  10.                     <nav class="d-flex align-items-center">
  11.                         <a href="{{ path('ui_home') }}">Accueil<span class="lnr lnr-arrow-right"></span></a>
  12.                         <a href="javascript:void(0)">Inscription</a>
  13.                     </nav>
  14.                 </div>
  15.             </div>
  16.         </div>
  17.     </section>
  18.     <!-- End Banner Area -->
  19.     {% for flash_error in app.flashes('verify_email_error') %}
  20.         <div class="alert alert-danger" role="alert">{{ flash_error }}</div>
  21.     {% endfor %}
  22.     {{ form_errors(registrationForm) }}
  23.     <!--================Login Box Area =================-->
  24.     <section class="login_box_area section_gap">
  25.         <div class="container">
  26.             <div class="row">
  27.                 <div class="col-lg-6">
  28.                     <div class="login_box_img">
  29.                         <img class="img-fluid" src="{{ asset('ui/img/login.jpg') }}" alt="">
  30.                         <div class="hover">
  31.                             <h4>Vous avez un compte?</h4>
  32.                             <p>Connectez-vous à votre compte pour accéder à vos commandes, suivre vos livraisons et gérer vos préférences personnelles.</p>
  33.                             <a class="primary-btn" href="{{ path('ui_app_login') }}">Se connecter</a>
  34.                         </div>
  35.                     </div>
  36.                 </div>
  37.                 <div class="col-lg-6">
  38.                     <div class="login_form_inner">
  39.                         <h3>S'inscrire</h3>
  40.                         {{ form_start(registrationForm, {'attr': {'class': 'needs-validation row login_form'}}) }}
  41.                         {% if app.user %}
  42.                             <div class="mb-3">
  43.                                 Vous êtes connecté comme {{ app.user.userIdentifier }}, <a
  44.                                         href="{{ path('ui_app_logout') }}">Déconnexion</a>
  45.                             </div>
  46.                         {% endif %}
  47.                         <div class="col-md-12 form-group">
  48.                             {{ form_label(registrationForm.email, 'Email', {'label_attr': {'class': 'form-label'}}) }}
  49.                             {{ form_widget(registrationForm.email, {'attr': {'class': 'form-control', 'placeholder': 'email@example.com', 'onfocus':"this.placeholder = ''", 'onblur':"this.placeholder = 'email@example.com'", 'id': 'registration_email'}}) }}
  50.                             {{ form_errors(registrationForm.email) }}
  51.                             <small class="form-text text-muted email-validation-message"></small>
  52.                         </div>
  53.                         <div class="col-md-12 form-group">
  54.                             {{ form_label(registrationForm.plainPassword, 'Mot de passe', {'label_attr': {'class': 'form-label'}}) }}
  55.                             {{ form_widget(registrationForm.plainPassword, {'attr': {'class': 'form-control', 'placeholder': 'Votre mot de passe', 'onfocus':"this.placeholder = ''", 'onblur':"this.placeholder = 'Votre mot de passe'", 'id': 'registration_password'}}) }}
  56.                             {{ form_errors(registrationForm.plainPassword) }}
  57.                             <small class="form-text text-muted password-validation-message"></small>
  58.                             <div class="password-strength mt-2" style="display: none;">
  59.                                 <div class="progress" style="height: 5px;">
  60.                                     <div class="progress-bar" role="progressbar" style="width: 0%"></div>
  61.                                 </div>
  62.                                 <small class="strength-text"></small>
  63.                             </div>
  64.                         </div>
  65.                         <div class="col-md-12 form-group">
  66.                             <div class="creat_account">
  67.                                 {{ form_widget(registrationForm.agreeTerms) }}
  68.                                 {{ form_label(registrationForm.agreeTerms, 'Accepte les conditions') }}
  69.                                 {{ form_errors(registrationForm.agreeTerms) }}
  70.                             </div>
  71.                         </div>
  72.                         <div class="col-md-12 form-group">
  73.                             <button class="primary-btn" type="submit">
  74.                                 S'inscrire
  75.                             </button>
  76.                             <a href="{{ path('ui_app_login') }}">Déjà un compte? <b>Se connecter</b></a>
  77.                         </div>
  78.                         {{ form_end(registrationForm) }}
  79.                     </div>
  80.                 </div>
  81.             </div>
  82.         </div>
  83.     </section>
  84. {% endblock %}
  85. {% block javascripts %}
  86. <script>
  87. document.addEventListener('DOMContentLoaded', function() {
  88.     const emailInput = document.getElementById('registration_email');
  89.     const passwordInput = document.getElementById('registration_password');
  90.     const emailMessage = document.querySelector('.email-validation-message');
  91.     const passwordMessage = document.querySelector('.password-validation-message');
  92.     const passwordStrength = document.querySelector('.password-strength');
  93.     const progressBar = passwordStrength.querySelector('.progress-bar');
  94.     const strengthText = passwordStrength.querySelector('.strength-text');
  95.     const registrationForm = document.querySelector('.needs-validation');
  96.     
  97.     // Validation email en temps réel
  98.     if (emailInput) {
  99.         emailInput.addEventListener('blur', function() {
  100.             validateEmail(this.value);
  101.         });
  102.         
  103.         emailInput.addEventListener('input', function() {
  104.             if (this.value.length > 0) {
  105.                 validateEmail(this.value);
  106.             } else {
  107.                 emailMessage.textContent = '';
  108.                 emailMessage.className = 'form-text text-muted email-validation-message';
  109.             }
  110.         });
  111.     }
  112.     
  113.     // Validation mot de passe en temps réel
  114.     if (passwordInput) {
  115.         passwordInput.addEventListener('input', function() {
  116.             validatePassword(this.value);
  117.         });
  118.         
  119.         passwordInput.addEventListener('blur', function() {
  120.             if (this.value.length > 0) {
  121.                 validatePassword(this.value);
  122.             }
  123.         });
  124.     }
  125.     
  126.     function validateEmail(email) {
  127.         const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  128.         
  129.         if (!email) {
  130.             emailMessage.textContent = '';
  131.             emailMessage.className = 'form-text text-muted email-validation-message';
  132.             return false;
  133.         }
  134.         
  135.         if (!emailRegex.test(email)) {
  136.             emailMessage.textContent = 'Format d\'email invalide. Exemple: exemple@domaine.com';
  137.             emailMessage.className = 'form-text text-danger email-validation-message';
  138.             emailInput.classList.add('is-invalid');
  139.             emailInput.classList.remove('is-valid');
  140.             return false;
  141.         }
  142.         
  143.         // Vérifier les domaines invalides communs
  144.         const invalidDomains = ['test.com', 'example.com', 'invalid.com'];
  145.         const domain = email.split('@')[1];
  146.         if (invalidDomains.includes(domain)) {
  147.             emailMessage.textContent = 'Veuillez utiliser une adresse email valide.';
  148.             emailMessage.className = 'form-text text-danger email-validation-message';
  149.             emailInput.classList.add('is-invalid');
  150.             emailInput.classList.remove('is-valid');
  151.             return false;
  152.         }
  153.         
  154.         emailMessage.textContent = '✓ Adresse email valide';
  155.         emailMessage.className = 'form-text text-success email-validation-message';
  156.         emailInput.classList.remove('is-invalid');
  157.         emailInput.classList.add('is-valid');
  158.         return true;
  159.     }
  160.     
  161.     function validatePassword(password) {
  162.         const minLength = 8;
  163.         const hasUpperCase = /[A-Z]/.test(password);
  164.         const hasLowerCase = /[a-z]/.test(password);
  165.         const hasNumber = /\d/.test(password);
  166.         const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(password);
  167.         
  168.         if (!password) {
  169.             passwordMessage.textContent = '';
  170.             passwordMessage.className = 'form-text text-muted password-validation-message';
  171.             passwordStrength.style.display = 'none';
  172.             return false;
  173.         }
  174.         
  175.         let messages = [];
  176.         let strength = 0;
  177.         
  178.         if (password.length >= minLength) {
  179.             strength += 25;
  180.         } else {
  181.             messages.push(`Au moins ${minLength} caractères`);
  182.         }
  183.         
  184.         if (hasUpperCase) {
  185.             strength += 25;
  186.         } else {
  187.             messages.push('Une majuscule');
  188.         }
  189.         
  190.         if (hasLowerCase) {
  191.             strength += 25;
  192.         } else {
  193.             messages.push('Une minuscule');
  194.         }
  195.         
  196.         if (hasNumber) {
  197.             strength += 25;
  198.         } else {
  199.             messages.push('Un chiffre');
  200.         }
  201.         
  202.         // Bonus pour caractère spécial
  203.         if (hasSpecialChar) {
  204.             strength = Math.min(100, strength + 10);
  205.         }
  206.         
  207.         // Mettre à jour la barre de progression
  208.         progressBar.style.width = strength + '%';
  209.         
  210.         if (strength < 50) {
  211.             progressBar.className = 'progress-bar bg-danger';
  212.             strengthText.textContent = 'Faible';
  213.             strengthText.className = 'strength-text text-danger';
  214.         } else if (strength < 75) {
  215.             progressBar.className = 'progress-bar bg-warning';
  216.             strengthText.textContent = 'Moyen';
  217.             strengthText.className = 'strength-text text-warning';
  218.         } else {
  219.             progressBar.className = 'progress-bar bg-success';
  220.             strengthText.textContent = 'Fort';
  221.             strengthText.className = 'strength-text text-success';
  222.         }
  223.         
  224.         passwordStrength.style.display = 'block';
  225.         
  226.         if (messages.length > 0) {
  227.             passwordMessage.textContent = 'Le mot de passe doit contenir: ' + messages.join(', ');
  228.             passwordMessage.className = 'form-text text-danger password-validation-message';
  229.             passwordInput.classList.add('is-invalid');
  230.             passwordInput.classList.remove('is-valid');
  231.             return false;
  232.         } else {
  233.             passwordMessage.textContent = '✓ Mot de passe valide';
  234.             passwordMessage.className = 'form-text text-success password-validation-message';
  235.             passwordInput.classList.remove('is-invalid');
  236.             passwordInput.classList.add('is-valid');
  237.             return true;
  238.         }
  239.     }
  240.     
  241.     // Validation avant soumission
  242.     if (registrationForm) {
  243.         registrationForm.addEventListener('submit', function(e) {
  244.             const emailValid = validateEmail(emailInput.value);
  245.             const passwordValid = validatePassword(passwordInput.value);
  246.             
  247.             if (!emailValid || !passwordValid) {
  248.                 e.preventDefault();
  249.                 e.stopPropagation();
  250.                 
  251.                 if (!emailValid) {
  252.                     emailInput.focus();
  253.                 } else if (!passwordValid) {
  254.                     passwordInput.focus();
  255.                 }
  256.             }
  257.             
  258.             registrationForm.classList.add('was-validated');
  259.         });
  260.     }
  261. });
  262. </script>
  263. {% endblock %}