Skip to main content

Le plan d'adhésion mensuel DPM

Rejoignez le plus grand et le plus dynamique collectif mondial de professionnels de la gestion de projets digitaux et dépassez toutes les attentes à l’ère de l’IA pour seulement 24,99 $ USD / mois.

Ou, économisez plus de 25 % avec notre formule annuelle.

Les membres DPM gardent une longueur d’avance grâce à :

  • Notre communauté Slack dynamique et bienveillante
  • Notre programme régulier de sessions d’apprentissage en direct
  • Plus de 90 mini-formations et webinaires enregistrés
  • Plus de 100 modèles et ressources
  • Des groupes de mentorat entre pairs Mastermind
  • 25 % de réduction sur notre programme de certification approuvé par le PMI

Inscrire une équipe ?

Alignez vos équipes et économisez jusqu’à 40 % grâce à notre programme de développement en équipe
.page-id-110718 { background-color: var(--color-background-light) !important; } .page-id-110718 .mp_wrapper { margin: 0 !important; padding: 0 !important; } .page-id-110718 .mepr-form { margin: 0 !important; } .page-id-110718 .special-title { font-size: var(--font-size-heading-small) !important; font-weight: var(--font-weight-semibold) !important; } .page-id-110718 .price-highlight { margin-top: 20px !important; font-size: 16px !important; display: flex; justify-content: space-between; gap: var(--spacer-20); padding: var(--spacer-20) !important; background: var(--color-white); border-radius: var(--border-radius-media); } .page-id-110718 .mepr-transaction-invoice-wrapper { padding-top: 0 !important; } .page-id-110718 .special-form .wp-block-list { padding-left: 24px !important; } @media (min-width: 768px) { .page-id-110718 .special-form .wp-block-list { padding-left: 4px !important; } } .page-id-110718 .site-header__search-wrap, .page-id-110718 .site-header__button, .page-id-110718 .site-header__navigation-wrap, .page-id-110718 .site-header__utility-nav, .page-id-110718 .membership-navigation, .page-id-110718 .site-header__scroll-nav-cta-wrapper, .page-id-110718 footer { display: none !important; } .page-id-110718 .site-header__logo-wrap { padding-top: 0; } .page-id-110718 [data-js=site-wrap] { margin-top: 0 !important; } @media (min-width: 768px) { .page-id-110718 .special-title { font-size: 24px !important; font-weight: var(--font-weight-semibold) !important; margin-bottom: var(--spacer-30) !important; } .page-id-110718 .special-form p, .page-id-110718 .special-form li { font-size: 16px; margin-bottom: var(--spacer-20); } .page-id-110718 .special-form ul { margin-top: var(--spacer-20); margin-bottom: var(--spacer-20); } .page-id-110718 .special-form li { margin-left: var(--spacer-20); } .page-id-110718 .site-header__logo-wrap { padding-top: 15px !important; } .page-id-110718 .l-sink>.wp-block-group { padding-top: 90px !important; padding-bottom: 90px !important; } } @media (min-width: 1200px) { .page-id-110718.scroll-down .site-header { padding-top: 0 !important; padding-bottom: 0 !important; } } .mp_wrapper { padding: 0 !important; margin: 0 !important; } @media (min-width: 960px) { .b-columns__grid--2-cols { grid-template-columns: 0.43fr 0.57fr !important; grid-column-gap: var(--spacer-70) !important; } } .form-steps-nav { margin-bottom: 48px; } .form-steps-nav ul { display: flex; justify-content: space-evenly; align-items: start; list-style: none; padding: 0; margin: 0; gap: 0; position: relative; padding-left: 0 !important; } /* Ligne entre les étapes */ .form-steps-nav ul::before { content: ''; position: absolute; top: 15px; /* Alignement avec le centre des cercles */ left: 50%; transform: translateX(-50%); width: 100%; height: 1px; background: #E5E7EB; z-index: 0; } .form-steps-nav li { display: flex; flex-direction: column; align-items: center; gap: 8px; color: var(--color-neutral-90); font-size: 14px; font-weight: 500; z-index: 1; width: 120px; /* Largeur fixe pour un espacement homogène */ text-align: center; } /* Cercles de numéro */ .form-steps-nav li::before { content: attr(data-step); width: 30px; height: 30px; border-radius: 8px; background: #fff; border: 2px solid var(--color-neutral-90); display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 16px; margin-bottom: 4px; } /* État actif */ .form-steps-nav li.active::before { background: var(--color-primary); border-color: var(--color-primary); color: white; } .form-steps-nav li.active { color: var(--color-neutral-90); font-weight: 700; } /* Ajustements responsive */ @media (max-width: 768px) { .step-1, .step-2 .mp-form-row:has([type="password"]) { grid-template-columns: 1fr; } .form-steps-nav ul { } .form-steps-nav ul::before { top: 22px; } .form-steps-nav li { font-size: 12px; padding: 6px 12px; } } /* Classes critiques pour la fonctionnalité d'étapes */ .form-steps-wrapper { position: relative; min-height: 300px; } .form-step { display: none; opacity: 0; transition: opacity 0.3s ease; width:100%; margin: 0 auto; } .form-step.active { display: block; opacity: 1; } .form-steps-navigation { margin-top: 40px; } .nav-buttons { display: flex; justify-content: space-between; gap: 16px; } .prev-btn, .next-btn, input[type="submit"] { padding: 12px 32px; border: none; border-radius: 24px; cursor: pointer; font-weight: 500; font-size: 16px; transition: all 0.2s ease; } .prev-btn { background: transparent; border: 1px solid var(--color-primary); color: var(--color-primary); } .next-btn, input[type="submit"] { background: var(--color-primary); color: white; margin-left: auto; } .prev-btn:hover, .next-btn:hover, input[type="submit"]:hover { opacity: 0.9; transform: translateY(-1px); } /* Style des champs de formulaire */ .mp-form-row { margin-bottom: 24px; } .mp-form-label { display: block; margin-bottom: 8px; font-weight: 500; } .mepr-form-input { width: 100%; padding: 12px; border: 1px solid #e1e1e1; border-radius: 8px; font-size: 16px; } input.invalid { border-color: #ff3d5b !important; } .validation-error { color: #ff3d5b; font-size: 14px; margin-top: 4px; } /* Style du lien coupon */ .have-coupon-link { color: var(--color-primary); text-decoration: none; font-weight: 500; display: inline-block; margin-top: 16px; } /* Disposition en deux colonnes pour la première étape */ .step-1.active { display: grid; grid-template-columns: 1fr; gap: 24px; row-gap: 0; @media (min-width: 960px) { grid-template-columns: 1fr 1fr; } } .mp_invoice .mp-table thead { display: none !important; } .mp_invoice { background: var(--color-neutral-0); padding: 16px !important; border-radius: 8px; overflow: hidden; } .mp_invoice .mp-table, .mp_invoice .mp-table * { background: var(--color-neutral-0); border: 0 !important; font-size: 16px !important; } .mp_invoice .mp-table { padding: 0 !important; margin: 0 !important; } .price-highlight .mepr-invoice-loader { display: none !important; } document.addEventListener('DOMContentLoaded', function() { // Attendre que le DOM et Stripe soient prêts const waitForStripe = new Promise((resolve) => { if (window.MeprStripeGateway) { resolve(); } else { // Attendre que Stripe soit initialisé const stripeCheck = setInterval(() => { if (window.MeprStripeGateway) { clearInterval(stripeCheck); resolve(); } }, 100); } }); waitForStripe.then(() => { initializeMultiStepForm(); }); function initializeMultiStepForm() { const form = document.querySelector('.mepr-signup-form'); if (!form) return; // Masquer le formulaire lors de l'initialisation form.style.display = 'none'; // Conserver le bouton original d'envoi avant toute manipulation const originalSubmitBtn = form.querySelector('input[type="submit"]'); const submitBtnValue = originalSubmitBtn ? originalSubmitBtn.value : 'Envoyer'; const submitBtnClasses = originalSubmitBtn ? originalSubmitBtn.className : ''; // Supprimer toute navigation existante const existingNav = document.querySelector('.form-steps-nav'); if (existingNav) existingNav.remove(); // Créer la navigation des étapes const stepsNav = document.createElement('div'); stepsNav.className = 'form-steps-nav'; stepsNav.innerHTML = `
  • Informations personnelles
  • Détails de connexion
  • Paiement
`; form.parentNode.insertBefore(stepsNav, form); // Créer les conteneurs pour chaque étape const formSteps = document.createElement('div'); formSteps.className = 'form-steps-wrapper'; const step1 = document.createElement('div'); step1.className = 'form-step step-1 active'; const step2 = document.createElement('div'); step2.className = 'form-step step-2'; const step3 = document.createElement('div'); step3.className = 'form-step step-3'; // Créer le nouveau bouton d'envoi en conservant les propriétés d'origine const submitBtn = document.createElement('input'); submitBtn.type = 'submit'; submitBtn.value = submitBtnValue; submitBtn.className = submitBtnClasses + ' next-btn'; submitBtn.style.display = 'none'; // Référencer les champs email et nom d'utilisateur avant de les déplacer const emailInput = form.querySelector('[name="user_email"]'); const usernameInput = form.querySelector('[name="user_login"]'); // Déplacer la logique de synchronisation email-nom d'utilisateur avant de bouger les champs if (emailInput && usernameInput) { // Masquer tout le conteneur du nom d'utilisateur const usernameContainer = usernameInput.closest('.mp-form-row'); if (usernameContainer) { usernameContainer.style.display = 'none'; } // Mettre à jour le nom d'utilisateur quand l'email change (input et blur) emailInput.addEventListener('input', (e) => { usernameInput.value = e.target.value; }); emailInput.addEventListener('blur', (e) => { usernameInput.value = e.target.value; }); } // Déplacer les champs dans leurs conteneurs respectifs const personalFields = form.querySelectorAll([ '[id*="user_first_name"]', '[id*="user_last_name"]', '[id*="mepr-address-one"]', '[id*="mepr-address-two"]', '[id*="mepr-address-city"]', '[id*="mepr-address-country"]', '[id*="mepr-address-state"]', '[id*="mepr-address-zip"]' ].join(',')); const paymentFields = form.querySelectorAll([ '.mepr-transaction-invoice-wrapper', '.mepr-payment-methods-wrapper', '.have-coupon-link', '.mp-form-row.mepr_coupon', '.mp-form-row.mepr_tos' ].join(',')); const accountFields = form.querySelectorAll([ '[name="user_email"]', '[name="mepr_user_password"]', '[name="mepr_user_password_confirm"]', '[name="user_login"]' ].join(',')); // Déplacer les champs dans leurs conteneurs respectifs personalFields.forEach(field => { const row = field.closest('.mp-form-row'); if (row) step1.appendChild(row); }); accountFields.forEach(field => { const row = field.closest('.mp-form-row'); if (row) step2.appendChild(row); }); paymentFields.forEach(field => { step3.appendChild(field); }); // Masquer le tableau de prix const pricingNewPosition = document.querySelector('.price-highlight'); const pricingTable = step3.querySelector('.mepr-transaction-invoice-wrapper'); console.log(pricingTable); if (pricingTable) { const clonedPricingTable = pricingTable.cloneNode(true); pricingNewPosition.appendChild(clonedPricingTable); pricingTable.style.display = 'none'; const observer = new MutationObserver(() => { clonedPricingTable.innerHTML = pricingTable.innerHTML; }); observer.observe(pricingTable, { childList: true, // Observer les changements des éléments enfants subtree: true, // Observer les changements profonds de la structure DOM attributes: true, // Observer le changement des attributs }); } // Ajouter les étapes au formulaire dans le bon ordre formSteps.appendChild(step1); // Informations personnelles formSteps.appendChild(step2); // Détails de connexion formSteps.appendChild(step3); // Paiement // Nettoyer le formulaire original en gardant seulement les champs cachés const hiddenFields = Array.from(form.querySelectorAll('input[type="hidden"]')); form.innerHTML = ''; hiddenFields.forEach(field => form.appendChild(field)); form.appendChild(formSteps); // Créer les boutons de navigation const navigation = document.createElement('div'); navigation.className = 'form-steps-navigation'; const navButtons = document.createElement('div'); navButtons.className = 'nav-buttons'; navButtons.innerHTML = ` `; navButtons.appendChild(submitBtn); navigation.appendChild(navButtons); form.appendChild(navigation); // Fonctionnalité de navigation let currentStep = 1; const prevBtn = navigation.querySelector('.prev-btn'); const nextBtn = navigation.querySelector('.next-btn'); function validateStep(step) { const currentStepElement = form.querySelector(`.step-${step}`); const requiredFields = currentStepElement.querySelectorAll('.mepr-form-input:required, .mp-form-row.required input:not([type="hidden"]), .mp-form-row.required select'); let isValid = true; requiredFields.forEach(field => { if (!field.value.trim()) { isValid = false; field.classList.add('invalid'); const row = field.closest('.mp-form-row'); if (row && !row.querySelector('.validation-error')) { const error = document.createElement('div'); error.className = 'validation-error'; error.textContent = 'Ce champ est obligatoire'; row.appendChild(error); } } else { field.classList.remove('invalid'); const row = field.closest('.mp-form-row'); const error = row?.querySelector('.validation-error'); if (error) error.remove(); } }); return isValid; } function updateNavigation() { prevBtn.style.display = currentStep === 1 ? 'none' : 'block'; const submitBtn = navigation.querySelector('input[type="submit"]'); // A la dernière étape, masquer le bouton suivant et afficher "Envoyer" if (currentStep === 3) { nextBtn.style.display = 'none'; if (submitBtn) { submitBtn.style.display = 'inline-block'; } } else { nextBtn.style.display = 'block'; if (submitBtn) { submitBtn.style.display = 'none'; } } document.querySelector('#register').scrollIntoView(); // Mise à jour de la navigation des étapes document.querySelectorAll('.form-steps-nav li').forEach(li => { li.classList.remove('active'); if (parseInt(li.dataset.step) === currentStep) { li.classList.add('active'); } }); } function showStep(step) { document.querySelectorAll('.form-step').forEach(s => { s.classList.remove('active'); }); document.querySelector(`.step-${step}`).classList.add('active'); currentStep = step; updateNavigation(); } prevBtn.addEventListener('click', () => { if (currentStep > 1) { showStep(currentStep - 1); } }); nextBtn.addEventListener('click', () => { if (validateStep(currentStep)) { if (currentStep < 3) { showStep(currentStep + 1); } } }); // Afficher le formulaire après l'initialisation form.style.display = 'block'; // Empêcher la validation via la touche Entrée form.addEventListener('keypress', function(e) { if (e.key === 'Enter') { e.preventDefault(); return false; } }); } });