{"id":5436,"date":"2026-06-28T08:15:27","date_gmt":"2026-06-28T06:15:27","guid":{"rendered":"https:\/\/dgtlms.fr\/?page_id=5436"},"modified":"2026-06-28T08:59:57","modified_gmt":"2026-06-28T06:59:57","slug":"dgtlms-changelog","status":"publish","type":"page","link":"https:\/\/dgtlms.fr\/en\/dgtlms-changelog\/","title":{"rendered":"Changelog"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><div class=\"vc_row wpb_row vc_row-fluid\" style=\"border-radius:15px;\"><div class=\"wpb_column vc_column_container vc_col-sm-12\"><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\">\n\t<div class=\"wpb_text_column wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<p data-sourcepos=\"9:1-9:412;73-484\">\t\t<div class=\"dgtlms-cl\">\n\t\t\t\t\t\t<div class=\"dgtlms-cl-toolbar\">\n\t\t\t\t<a class=\"dgtlms-cl-rss\" href=\"https:\/\/dgtconcept.dgtlms.fr\/api\/changelog.php?format=rss\" target=\"_blank\" rel=\"noopener nofollow\" title=\"S'abonner aux nouveaut\u00e9s (flux RSS)\">\n\t\t\t\t\t<svg width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M6.18 17.82A2.18 2.18 0 1 1 4 15.64a2.18 2.18 0 0 1 2.18 2.18zM4 4.44v3.1A12.46 12.46 0 0 1 16.46 20h3.1A15.56 15.56 0 0 0 4 4.44zm0 5.66v3.04A6.81 6.81 0 0 1 10.86 20h3.04A9.85 9.85 0 0 0 4 10.1z\"\/><\/svg>\n\t\t\t\t\tS'abonner au flux RSS\n\t\t\t\t<\/a>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t<section class=\"dgtlms-cl-release\">\n\t\t\t\t<h3 class=\"dgtlms-cl-version\">\n\t\t\t\t\tDerni\u00e8res \u00e9volutions\t\t\t\t\t\t\t\t\t<\/h3>\n\t\t\t\t\t\t\t\t<div class=\"dgtlms-cl-group\">\n\t\t\t\t\t<span class=\"dgtlms-cl-type\" style=\"background:#16a34a1a;color:#16a34a;\">Ajout\u00e9<\/span>\n\t\t\t\t\t<ul class=\"dgtlms-cl-list\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Auto-inscription publique<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Logo par formulaire d&#039;auto-inscription<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Auto-inscription \u2014 champs personnalis\u00e9s de compte<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Auto-inscription \u2014 droit d\u00e9di\u00e9 \u00ab G\u00e9rer les formulaires d&#039;auto-inscription \u00bb<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Auto-inscription \u2014 mention RGPD &amp; \u00e9puration du formulaire public<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Mod\u00e8les de jeu de r\u00f4le IA<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Nouvelle activit\u00e9 \u00ab Jeu de r\u00f4le conversationnel IA \u00bb<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Nouvelle activit\u00e9 \u00ab Soumission vid\u00e9o \/ orale not\u00e9e \u00bb<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Nouvelle activit\u00e9 \u00ab R\u00e9ponse ouverte \/ \u00e9tude de cas corrig\u00e9e par IA \u00bb<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Nouvelle activit\u00e9 \u00ab Lecture &amp; validation \u00bb<\/li>\n\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"dgtlms-cl-group\">\n\t\t\t\t\t<span class=\"dgtlms-cl-type\" style=\"background:#2563eb1a;color:#2563eb;\">Modifi\u00e9<\/span>\n\t\t\t\t\t<ul class=\"dgtlms-cl-list\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Performances \u2014 r\u00e9duction des requ\u00eates SQL (N+1)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Polish vues alt R\u00e9sultats<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Liens &quot;R\u00e9sultats&quot; depuis fiche membre<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Liste des parcours \u2014 d\u00e9faut sur vue liste<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Fiche UA \u2014 s\u00e9lecteur de groupe filtrable<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Refonte UI auth user form (page de finalisation de compte post-authentification)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Module Talent \u2014 unification du r\u00e9f\u00e9rentiel de comp\u00e9tences vers LKU<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Studio runtime \u2014 centrage vertical + \u00e9largissement des pages &quot;hero&quot;<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>S\u00e9lecteur &quot;Feuille de style&quot; \u2014 rebranding cosm\u00e9tique + retrait de modern<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Carte parcours apprenant \u2014 bouton \u00ab Continuer \u00bb diff\u00e9renci\u00e9 selon l&#039;\u00e9tat + relance depuis le 1er SCO si valid\u00e9<\/li>\n\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"dgtlms-cl-group\">\n\t\t\t\t\t<span class=\"dgtlms-cl-type\" style=\"background:#d977061a;color:#d97706;\">Corrig\u00e9<\/span>\n\t\t\t\t\t<ul class=\"dgtlms-cl-list\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li>SSO OAuth2 \/ OpenID Connect (Keycloak) \u2014 provisioning multi-site &amp; robustesse (mise en production Centre L\u00e9on B\u00e9rard)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Export avec plage de dates \u2014 &quot;Une erreur est survenue durant la g\u00e9n\u00e9ration du rapport&quot; (protectUInt failed)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>getLastUserCourseAssociations() \u2014 erreur SQL 1305 FUNCTION \u2026 ANY_VALUE does not exist sur MariaDB &lt; 10.5<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Exception count(): \u2026 null given au premier login sur install neuve<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Import CSV \u2014 mots de passe avec caract\u00e8res CP1252 (\u20ac, \u0153, smart quotes, \u2026) cassent l&#039;authentification<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>DGT Studio \u2014 sommaire absent \u00e0 l&#039;ouverture d&#039;un Studio<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Carte parcours apprenant \u2014 bouton \u00ab Bloqu\u00e9 \u00bb fant\u00f4me quand un seul SCO a ses passages \u00e9puis\u00e9s<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Recherche outils\/analyser\/recherche \u2014 exception protectUInt failed sur sql_id_parcours_session_de_membre<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>\u00c9valuation formateur \u2014 retour syst\u00e9matique sur l&#039;onglet R\u00e9sultats avec s\u00e9lection arbitraire au lieu de la queue d&#039;\u00e9valuation<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>SQL 1054 sur grant attempt \u2014 JOIN membres sur la mauvaise colonne<\/li>\n\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"dgtlms-cl-group\">\n\t\t\t\t\t<span class=\"dgtlms-cl-type\" style=\"background:#7c3aed1a;color:#7c3aed;\">Accessibilit\u00e9<\/span>\n\t\t\t\t\t<ul class=\"dgtlms-cl-list\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Dashboard apprenant + 10 widgets \u2014 passe RGAA \/ WCAG 2.1 AA (Phase 4)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Page R\u00e9sultats \u2014 passe RGAA \/ navigation clavier compl\u00e8te<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Barre de navigation des modules \u2014 passe RGAA \/ WCAG 2.1 AA<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Liste des parcours apprenant \u2014 passe RGAA \/ WCAG 2.1 AA<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Modale a11y elle-m\u00eame \u2014 bouton fermeture avec focus visible<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Page publique d&#039;accessibilit\u00e9 + lien syst\u00e9matique en pied de page (ouverture en modale)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>D\u00e9claration de conformit\u00e9 RGAA 4.1<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>\u00c9diteurs (DGT Studio + Quiz) \u2014 passe RGAA \/ WCAG 2.1 AA d\u00e9fensif (Phase 2)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Player apprenant \u2014 passe RGAA \/ WCAG 2.1 AA d\u00e9fensif<\/li>\n\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"dgtlms-cl-group\">\n\t\t\t\t\t<span class=\"dgtlms-cl-type\" style=\"background:#dc26261a;color:#dc2626;\">S\u00e9curit\u00e9<\/span>\n\t\t\t\t\t<ul class=\"dgtlms-cl-list\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li>DGT Studio : durcissement des endpoints AJAX (CSRF + permission + MIME)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>\u00c9diteur de quiz : validation serveur exhaustive par type de question<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>\u00c9diteur de quiz : validation du contenu r\u00e9el des uploads (anti-polyglot + refus SVG)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>\u00c9diteur de quiz : CSRF + check de permission sur les endpoints AJAX<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Mail \u2014 fuite du contenu de chaque email envoy\u00e9 vers Sentry (mots de passe inclus)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Suppression d&#039;une backdoor historique<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Suppression de l&#039;authentification via URL ?key=base64(login=X&amp;pass=Y)<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Cookie &quot;rester connect\u00e9&quot; sign\u00e9 en HMAC-SHA256<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Migration progressive des mots de passe SHA-512 \u2192 bcrypt<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Mod\u00e8le .env.example versionn\u00e9<\/li>\n\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"dgtlms-cl-group\">\n\t\t\t\t\t<span class=\"dgtlms-cl-type\" style=\"background:#6b72801a;color:#6b7280;\">Supprim\u00e9<\/span>\n\t\t\t\t\t<ul class=\"dgtlms-cl-list\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Feature flag SSO_OAUTH2_ENABLED retir\u00e9<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li>Variables Classes virtuelles retir\u00e9es du dropdown des mod\u00e8les de mail<\/li>\n\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/section>\n\t\t\t\t\t\t\t\t\t<p class=\"dgtlms-cl-foot\">DGTLMS \u2014 version 26.4.27<\/p>\n\t\t\t\t\t<\/div>\n\n\t\t<style>\n\t\t.dgtlms-cl { max-width:820px; font-size:15px; line-height:1.5; }\n\t\t\/* --- Vue \"nouveaut\u00e9s par mois\" (highlights) --- *\/\n\t\t.dgtlms-cl-filters { display:flex; flex-wrap:wrap; gap:8px; margin:0 0 22px; }\n\t\t.dgtlms-cl-pill { cursor:pointer; border:1px solid #e2e8f0; background:#fff; color:#475569; font-size:13px; font-weight:600; padding:6px 14px; border-radius:999px; line-height:1.2; transition:all .15s; }\n\t\t.dgtlms-cl-pill:hover { border-color:var(--c,#94a3b8); color:var(--c,#334155); }\n\t\t.dgtlms-cl-pill.is-active { background:var(--c,#0f172a); border-color:var(--c,#0f172a); color:#fff; }\n\t\t.dgtlms-cl-month { margin:0 0 24px; }\n\t\t.dgtlms-cl-mlabel { font-size:13px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; color:#94a3b8; margin:0 0 12px; }\n\t\t.dgtlms-cl-cards { display:flex; flex-direction:column; gap:10px; }\n\t\t.dgtlms-cl-card { display:flex; gap:14px; align-items:flex-start; padding:13px 16px; background:#fff; border:1px solid #eef2f7; border-left:3px solid var(--c,#475569); border-radius:10px; box-shadow:0 1px 2px rgba(15,23,42,.04); }\n\t\t.dgtlms-cl-tag { flex-shrink:0; font-size:11px; font-weight:700; padding:3px 10px; border-radius:999px; white-space:nowrap; margin-top:2px; }\n\t\t.dgtlms-cl-body { display:flex; flex-direction:column; gap:3px; min-width:0; }\n\t\t.dgtlms-cl-title { font-weight:700; color:#0f172a; }\n\t\t.dgtlms-cl-desc { color:#475569; font-size:14px; }\n\t\t.dgtlms-cl-empty { color:#94a3b8; font-style:italic; padding:10px 0; }\n\t\t@media (max-width:560px) { .dgtlms-cl-card { flex-direction:column; gap:8px; } }\n\t\t\/* --- Vue changelog technique (versions) --- *\/\n\t\t.dgtlms-cl-release { margin:0 0 26px; }\n\t\t.dgtlms-cl-version { font-size:19px; font-weight:700; margin:0 0 12px; padding-bottom:8px; border-bottom:2px solid #eef2f7; }\n\t\t.dgtlms-cl-date { font-size:13px; font-weight:500; color:#94a3b8; margin-left:8px; }\n\t\t.dgtlms-cl-group { margin:0 0 14px; }\n\t\t.dgtlms-cl-type { display:inline-block; font-size:12px; font-weight:700; padding:2px 10px; border-radius:999px; margin-bottom:6px; }\n\t\t.dgtlms-cl-list { margin:6px 0 0; padding-left:20px; }\n\t\t.dgtlms-cl-list li { margin:0 0 5px; }\n\t\t.dgtlms-cl-foot { font-size:12px; color:#94a3b8; margin-top:18px; }\n\t\t.dgtlms-cl-toolbar { display:flex; justify-content:flex-end; margin:0 0 16px; }\n\t\t.dgtlms-cl-rss { display:inline-flex; align-items:center; gap:7px; padding:7px 14px; border-radius:8px; background:#f97316; color:#fff !important; font-size:13px; font-weight:600; text-decoration:none !important; box-shadow:0 1px 2px rgba(0,0,0,.08); transition:background .15s; }\n\t\t.dgtlms-cl-rss:hover { background:#ea580c; color:#fff !important; }\n\t\t.dgtlms-cl-rss svg { flex-shrink:0; }\n\t\t.dgtlms-cl-error { padding:14px 16px; background:#fef2f2; color:#991b1b; border-radius:8px; font-size:14px; }\n\t\t<\/style>\n\t\t<script>\n\t\t(function () {\n\t\t\tif (window.__dgtlmsClInit) return; window.__dgtlmsClInit = true;\n\t\t\tfunction init() {\n\t\t\t\tdocument.querySelectorAll('.dgtlms-cl-filters').forEach(function (bar) {\n\t\t\t\t\tvar target = document.getElementById(bar.getAttribute('data-target'));\n\t\t\t\t\tif (!target) return;\n\t\t\t\t\tvar empty = document.getElementById(bar.getAttribute('data-target') + '-empty');\n\t\t\t\t\tbar.addEventListener('click', function (e) {\n\t\t\t\t\t\tvar btn = e.target.closest('.dgtlms-cl-pill'); if (!btn) return;\n\t\t\t\t\t\tvar cat = btn.getAttribute('data-cat');\n\t\t\t\t\t\tbar.querySelectorAll('.dgtlms-cl-pill').forEach(function (b) { b.classList.toggle('is-active', b === btn); });\n\t\t\t\t\t\tvar anyVisible = false;\n\t\t\t\t\t\ttarget.querySelectorAll('.dgtlms-cl-month').forEach(function (sec) {\n\t\t\t\t\t\t\tvar shown = 0;\n\t\t\t\t\t\t\tsec.querySelectorAll('.dgtlms-cl-card').forEach(function (card) {\n\t\t\t\t\t\t\t\tvar ok = (cat === '*' || card.getAttribute('data-cat') === cat);\n\t\t\t\t\t\t\t\tcard.style.display = ok ? '' : 'none';\n\t\t\t\t\t\t\t\tif (ok) shown++;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsec.style.display = shown ? '' : 'none';\n\t\t\t\t\t\t\tif (shown) anyVisible = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (empty) empty.style.display = anyVisible ? 'none' : '';\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (document.readyState !== 'loading') init();\n\t\t\telse document.addEventListener('DOMContentLoaded', init);\n\t\t})();\n\t\t<\/script>\n\t\t<\/p>\n\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"S'abonner au flux RSS Derni\u00e8res \u00e9volutions Ajout\u00e9 Auto-inscription publique Logo par formulaire d&#039;auto-inscription Auto-inscription \u2014 champs personnalis\u00e9s de compte Auto-inscription \u2014 droit d\u00e9di\u00e9 \u00ab G\u00e9rer les formulaires d&#039;auto-inscription \u00bb Auto-inscription \u2014 mention RGPD &amp; \u00e9puration du formulaire public Mod\u00e8les de [...]","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5436","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/pages\/5436","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/comments?post=5436"}],"version-history":[{"count":7,"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/pages\/5436\/revisions"}],"predecessor-version":[{"id":5447,"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/pages\/5436\/revisions\/5447"}],"wp:attachment":[{"href":"https:\/\/dgtlms.fr\/en\/wp-json\/wp\/v2\/media?parent=5436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}