Corrections d’accessibilité dans le code de votre thème Magento

Validiscan corrige les échecs d’accessibilité dans les templates .phtml, le XML de layout et les feuilles de style LESS ou CSS de votre thème Magento 2. Rien n’atteint votre boutique en ligne avant que votre développeur ait fusionné ou appliqué les modifications et déployé le thème.

Dernière mise à jour :

Que modifie Validiscan dans un thème Magento ?

Validiscan ne modifie que les fichiers de votre thème frontend Magento 2, le dossier qui contient son theme.xml, en général sous app/design/frontend. Une modification de tout autre fichier échoue à la validation et n’est jamais livrée, et aucune correction n’installe d’extension ni n’ajoute de script qui réécrit vos pages dans le navigateur du visiteur.

Les templates et les styles que votre thème ne surcharge pas proviennent de son thème parent, comme Luma ou Blank, ou des modules de Magento. Les recettes ne copient pas ces fichiers dans votre thème : lorsqu’un échec vient d’un fichier que votre thème ne surcharge pas, la recette ne fait aucune modification et le constat est laissé à une personne. Les contenus et les réglages que vous conservez dans l’Admin de Magento, comme les pages et les blocs CMS, le contenu de Page Builder, la locale d’une vue de magasin ou les réglages HTML Head, ne sont pas des fichiers du thème : les corrections ne les modifient donc pas. Les contenus tiers intégrés, comme les widgets de paiement ou de chat, ne sont pas compris dans un projet.

Détails : les dossiers, l’aspect d’une modification et l’endroit où les recettes ajoutent leurs styles

Validiscan ne modifie que les fichiers du thème frontend Magento 2 de votre boutique, le dossier qui contient son theme.xml, en général sous app/design/frontend : les templates .phtml et .html, le XML de layout, les sources LESS et les feuilles de style compilées sous web/css, les scripts sous web/js et le fichier de traduction allemand dans i18n. Une modification de tout autre fichier, comme le code de Magento lui-même, une extension ou un produit de la compilation, échoue à la validation, et une modification qui échoue à la validation ne peut pas être approuvée : elle n’est donc jamais livrée.

Chaque changement est une modification ordinaire d’un fichier du thème, que votre développeur peut lire ligne par ligne. Les nouvelles règles de style qu’ajoute une correction se trouvent dans un bloc à la fin de la feuille de style, entre des commentaires qui portent le nom de la recette, par exemple /* validiscan:focus-visible-styles */. Les modifications plus petites, comme une valeur de couleur corrigée ou un outline: none retiré, sont faites là où se trouve déjà le code. Les mots qu’une correction ajoute à un template .phtml passent par la fonction de traduction de Magento, __(), et sont échappés comme le texte propre au thème ; dans les fichiers HTML que le thème conserve sous Magento_Cms/content, les recettes utilisent à la place la directive trans de Magento. Magento conserve les pages et les blocs CMS dans l’Admin de Magento : une modification de l’un de ces fichiers n’atteint donc votre boutique que là où votre projet charge ce fichier dans ses pages ou ses blocs CMS. Aucune correction n’installe d’extension ni n’ajoute de script qui réécrit vos pages dans le navigateur du visiteur, comme le fait un overlay.

Les recettes du contour de focus, des cibles tactiles, du lien d’évitement et des nouveaux boutons ajoutent leurs règles de style à la fin de la feuille de style principale du thème : son _extend.less ou son _theme.less sous web/css/source, avec un nouveau _extend.less lorsqu’un thème construit sur Luma ou Blank n’a ni l’un ni l’autre, ainsi que le web/css/styles-m.css compilé lorsque le thème en fournit un. Sur un thème qui n’est pas construit sur Luma ou Blank et qui n’a là ni sources LESS ni ce fichier compilé, les recettes du contour de focus, des cibles tactiles et des boutons ne font aucune modification, et la recette du lien d’évitement ajoute le lien sans styles.

Comment Validiscan accède-t-il à votre thème Magento ?

Par un dépôt GitHub ou un ZIP du dossier du thème téléversé dans le portail client, car Validiscan prépare chaque correction sur une copie du code source de votre thème Magento. Le choix dépend de l’endroit où se trouve le code : un dépôt donne lieu à une pull request, un ZIP à un lot de correctifs.

Les deux voies d’accès à un thème Magento
Voie d’accès Ce que vous fournissez Les modifications reviennent sous forme de
Par votre dépôt GitHub L’accès au dépôt, qui peut contenir le thème seul ou l’ensemble de votre projet Magento, par l’application GitHub de Validiscan ou un jeton d’accès Une pull request
À partir d’un ZIP du dossier du thème Le dossier de votre thème sous app/design/frontend, en un seul fichier ZIP de 100 Mo au maximum, téléversé dans le portail client par un administrateur de votre organisation Un lot de correctifs

Par votre dépôt GitHub

Si le code de votre thème est conservé dans un dépôt GitHub, vous donnez à Validiscan l’accès à ce dépôt. Vous installez l’application GitHub de Validiscan sur le dépôt, ou vous donnez à Validiscan un jeton d’accès pour ce dépôt. La configuration de Validiscan fixe les autorisations de l’application GitHub : accès en lecture et en écriture au contenu du dépôt et à ses pull requests, accès en lecture à ses métadonnées, et rien d’autre.

Le dépôt peut contenir le thème seul ou l’ensemble de votre projet Magento. Les recettes retrouvent le thème grâce à son theme.xml dans app/design/frontend/<Vendor>/<theme>, ou à la racine d’un dépôt qui ne contient que le thème, à côté de son registration.php. Si le dépôt contient plusieurs thèmes frontend, une recette travaille sur le thème dans lequel l’élément en échec a été trouvé, et ne change rien lorsqu’elle ne peut pas déterminer de quel thème il s’agit. Un thème situé ailleurs dans un projet, par exemple sous forme de paquet Composer sous vendor, se trouve hors des chemins qu’une correction peut modifier. Les modifications arrivent sous forme de pull request.

À partir d’un ZIP du dossier du thème

Sans dépôt GitHub, votre développeur prépare un ZIP du thème. Le portail client donne cette instruction : « Demandez à votre développeur un ZIP du dossier de votre thème sous app/design/frontend. » Un administrateur de votre organisation téléverse ensuite le fichier dans le portail client, sous la forme d’un seul fichier ZIP de 100 Mo au maximum. Validiscan prépare les modifications sur cette copie de votre thème et les renvoie sous forme de lot de correctifs.

Sans l’une ou l’autre de ces deux voies, Validiscan n’a aucun code à modifier, et aucune correction n’est préparée.

Comment les modifications parviennent-elles à votre boutique ?

Sur Magento, les modifications arrivent sous forme de pull request ou de lot de correctifs, et votre développeur décide quand elles passent en ligne. Validiscan ne livre que des modifications relues et approuvées et ne modifie pas la version en ligne de votre boutique ; la livraison d’une copie non publiée du thème utilise la bibliothèque de thèmes de Shopify et n’existe que pour Shopify.

De la livraison à votre boutique en ligne, en cinq étapes
  1. Validiscan livre les modifications qu’il a relues et approuvées : une pull request sur une nouvelle branche, ou un lot de correctifs pour votre développeur.
  2. Votre développeur relit les modifications. Pour une pull request, la liste de contrôle demande un environnement de prévisualisation ou de préproduction, et non la version en ligne de la boutique, ainsi qu’une vérification des pages concernées, y compris au clavier seul.
  3. Votre développeur fusionne la pull request ou applique le lot de correctifs.
  4. Votre développeur compile les feuilles de style et déploie le thème : les modifications du LESS prennent effet une fois les fichiers statiques du thème déployés.
  5. Une fois les modifications en ligne, un scan de vérification contrôle de nouveau les pages concernées.

Une pull request

Avec l’accès à votre dépôt, Validiscan crée une nouvelle branche nommée validiscan/a11y-<date>-<id>, enregistre chaque correction dans un commit distinct et ouvre une seule pull request, avec un tableau récapitulatif, une explication de chaque modification et une liste de contrôle pour la relecture. Rien n’est poussé vers votre branche par défaut. La liste de contrôle demande à votre développeur de déployer la branche dans un environnement de prévisualisation ou de préproduction, et non sur la version en ligne de la boutique, puis d’y vérifier les pages concernées, y compris au clavier seul, avant de fusionner.

Un lot de correctifs

À partir du ZIP téléversé, Validiscan prépare une archive zip et l’envoie à votre développeur. Elle contient PATCH.md, avec chaque modification et la façon de l’appliquer, toutes les modifications dans un seul fichier de correctif qui s’applique avec git apply, un fichier de correctif par correction, les fichiers modifiés en entier et un README.md. Votre développeur applique les modifications, les teste et déploie le thème. Ce que contiennent une pull request et un lot de correctifs

Compiler les styles

Un thème fondé sur Luma ou Blank conserve ses styles sous forme de sources LESS, et Magento les compile pour produire le CSS qu’il sert. L’outil de déploiement des fichiers statiques de Magento, bin/magento setup:static-content:deploy, compile les fichiers LESS et publie le résultat, comme le décrit la documentation d’Adobe sur le prétraitement du CSS et du LESS. Les modifications du LESS prennent donc effet une fois que votre développeur a déployé les fichiers statiques du thème modifié. Lorsque le thème fournit aussi un web/css/styles-m.css compilé, Magento sert ce fichier tel quel : les recettes y font donc la même modification, et les deux fichiers restent synchronisés. Où placer les corrections dans un thème Magento, et ce qu’une mise à jour du thème peut défaire

Que modifient les recettes dans un thème Magento ?

Chacune des 20 recettes de Validiscan pour les thèmes Magento est une modification déterministe pour un type d’échec : le même code reçoit toujours la même modification. Une recette n’intervient que là où le code du thème montre quelle modification est la bonne ; là où il ne le montre pas, elle ne change rien.

Structure de la page et navigation

  • Langue de la page reprise de la locale de votre boutique html-lang Lorsque la surcharge du template racine par votre thème produit son propre lang ou n’en produit aucun, le template produit de nouveau les attributs propres à Magento, et chaque page reçoit un lang valide.

    Magento définit la langue d’une page à partir de la locale de sa vue de magasin, par exemple en pour la locale en_US, et la produit par son template racine. Lorsque votre thème surcharge ce template et produit son propre lang, en général le code de locale en_US, qui n’est pas une balise de langue valide, ou n’en produit aucun, le template produit de nouveau les attributs propres à Magento : chaque page reçoit ainsi un lang valide. Un lang défini dans le XML de layout sous la forme d’une locale, comme de_DE, devient de-DE. Une page dont le contenu est dans une autre langue que celle de sa vue de magasin, comme une page juridique allemande dans une boutique anglaise, vous revient : servez-la depuis une vue de magasin dans cette langue, ou indiquez la langue dans le contenu lui-même.

    Règles couvertes
    • html-has-lang AUTO contrôle assuré par vs-lang
    • html-lang-valid AUTO contrôle assuré par vs-lang
    • vs-lang AUTO
    Types de fichiers modifiés
    .phtml
    fixes the vs-lang finding in root.phtml and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    15 15 ?>
    16 16 <!doctype html>
    17 17 <!-- VALIDISCAN-SEEDED vs-lang: root.phtml prints the Magento locale code (en_US) instead of a BCP 47 language tag -->
    18 Supprimée <html lang="<?= $block->escapeHtmlAttr($htmlLocale) ?>">
    18 Ajoutée <html <?= /* @noEscape */ $htmlAttributes ?>>
    19 19 <head <?= /* @noEscape */ $headAttributes ?>>
    20 20 <?= /* @noEscape */ $requireJs ?>
    21 21 <?= /* @noEscape */ $headContent ?>
  • Un titre sur chaque page document-title-template Les titres vides que votre thème définit dans le XML de layout sont retirés, de sorte que le titre propre de Magento s’applique de nouveau.

    Magento donne à chaque page un titre propre, comme le nom du produit ou de la catégorie, ou « Search results for: » suivi du terme recherché, avec le préfixe ou le suffixe défini pour votre boutique. Un thème peut le remplacer par un <title> vide dans le XML de layout, et la page n’a alors aucun titre. La recette retire ces titres vides, de sorte que le titre propre de Magento s’applique de nouveau. Les titres qui contiennent du texte sont votre formulation et restent tels quels. Si aucun fichier de layout du thème ne vide le titre, la recette ne change rien : le titre vient alors de la page elle-même et des réglages HTML Head de l’Admin de Magento.

    Règles couvertes
    • document-title AUTO
    Types de fichiers modifiés
    .xml
    removes the blank search results title and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml (lignes ajoutées : 0, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml (lignes ajoutées : 0, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    4 4 <!-- VALIDISCAN-SEEDED document-title: a "hide the SEO title" customisation sets an empty page title,
    5 5 so the rendered <title></title> is empty. The visible h1 is set separately by the page.main.title block.
    6 6 Fixed variant: <title>Search results for: 'jacket'</title>. -->
    7 Supprimée <title> </title>
    8 7 </head>
    9 8 <body>
    10 9 <referenceBlock name="search_result_list" template="Magento_Catalog::product/list.phtml"/>
  • Des titres sans niveau sauté heading-levels Un titre qui saute un niveau remonte avec les titres qui le suivent dans son template, lorsque le niveau du titre qui précède peut être lu ; un titre de page masqué avec display: none est masqué visuellement à la place.

    Un titre qui saute un niveau, comme un h4 juste après un h2, remonte au niveau suivant, et les titres qui le suivent dans le même template, à son niveau ou à un niveau plus profond, remontent avec lui. Les classes restent, de sorte que les styles que le thème définit par classe continuent de s’appliquer ; votre développeur vérifie les styles que le thème définit par la balise du titre. Lorsque le niveau du titre qui précède ne peut être lu ni dans le scan ni dans le même template, le titre est laissé à une personne. Magento affiche le titre de chaque page sous forme de h1. Un thème qui masque le titre sur une page avec display: none supprime le seul h1 de la page : la recette le masque donc visuellement à la place, comme les styles propres à Magento masquent du texte, et le h1 reste dans le plan que les lecteurs d’écran utilisent. Un titre retiré dans le XML de layout est laissé à une personne, car le rétablir changerait l’aspect de la page.

    Règles couvertes
    • heading-order AUTO contrôle assuré par vs-headings-landmarks
    • page-has-heading-one AUTO contrôle assuré par vs-headings-landmarks
    • vs-headings-landmarks AUTO
    Types de fichiers modifiés
    .css.html.less
    keeps the hidden home page title as the h1 and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 6, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 6, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1093 1093
    1094 1094 // VALIDISCAN-SEEDED vs-headings-landmarks: the home page title is display:none, so the page has no h1.
    1095 1095 .cms-index-index .page-title-wrapper {
    1096 Supprimée display: none;
    1096 Ajoutée position: absolute;
    1097 Ajoutée width: 1px;
    1098 Ajoutée height: 1px;
    1099 Ajoutée overflow: hidden;
    1100 Ajoutée clip: rect(0 0 0 0);
    1101 Ajoutée white-space: nowrap;
    1097 1102 }
    1098 1103
    1099 1104 // VALIDISCAN-SEEDED color-contrast: #929292 on white is 3.1:1.

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 6, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 6, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1070 1070 }
    1071 1071
    1072 1072 .cms-index-index .page-title-wrapper {
    1073 Supprimée display: none;
    1073 Ajoutée position: absolute;
    1074 Ajoutée width: 1px;
    1075 Ajoutée height: 1px;
    1076 Ajoutée overflow: hidden;
    1077 Ajoutée clip: rect(0 0 0 0);
    1078 Ajoutée white-space: nowrap;
    1074 1079 }
    1075 1080
    1076 1081 .block-promo .info,
    moves the journal headings from h4 to h3 and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 3, lignes supprimées : 3)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 3, lignes supprimées : 3)
    Ligne avant Ligne après Modification Code
    152 152 <!-- VALIDISCAN-SEEDED vs-headings-landmarks (h2 followed by h4) + vs-link-purpose ("Read more" links to three different pages) -->
    153 153 <div class="journal-items">
    154 154 <article class="journal-item">
    155 Supprimée <h4 class="journal-title">Layering for wet autumn days</h4>
    155 Ajoutée <h3 class="journal-title">Layering for wet autumn days</h3>
    156 156 <p>How a light shell over a warm mid-layer keeps you dry on the way to work.</p>
    157 157 <a class="journal-link" href="/magento/juno-jacket.html">Read more</a>
    158 158 </article>
    159 159 <article class="journal-item">
    160 Supprimée <h4 class="journal-title">Caring for technical shells</h4>
    160 Ajoutée <h3 class="journal-title">Caring for technical shells</h3>
    161 161 <p>Washing, drying and re-proofing: three steps that keep a rain shell working for years.</p>
    162 162 <a class="journal-link" href="/magento/nadia-elements-shell.html">Read more</a>
    163 163 </article>
    164 164 <article class="journal-item">
    165 Supprimée <h4 class="journal-title">Running through the dark season</h4>
    165 Ajoutée <h3 class="journal-title">Running through the dark season</h3>
    166 166 <p>Reflective details, lights and route planning for early morning runs.</p>
    167 167 <a class="journal-link" href="/magento/ingrid-running-jacket.html">Read more</a>
    168 168 </article>

Utilisation au clavier et focus

  • Un contour de focus visible focus-visible-styles Un seul contour pour le focus clavier, dans la couleur de marque du thème, ajustée jusqu’à un contraste d’au moins 3:1 avec l’arrière-plan de la page.

    La feuille de style du thème reçoit un seul contour pour le focus clavier : 2 pixels, en trait plein, à 2 pixels de l’élément, dans la couleur de marque du thème. La couleur vient d’une variable de couleur de marque ou de couleur primaire, à défaut du bouton principal, à défaut de la couleur des liens, et elle est ajustée jusqu’à atteindre un contraste d’au moins 3:1 avec l’arrière-plan de la page. Les zones qui ont un arrière-plan propre, comme une barre supérieure sombre, reçoivent une couleur de contour qui a ce contraste à cet endroit. Les règles du thème qui retirent le contour des liens, des boutons et d’autres commandes au focus sont supprimées, sauf si elles montrent le focus d’une autre façon, par exemple avec une bordure ou une ombre.

    Règles couvertes
    • vs-focus-visible AUTO
    Types de fichiers modifiés
    .css.less
    adds the outline, removes the outline: none rule and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 10, lignes supprimées : 12)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 10, lignes supprimées : 12)
    Ligne avant Ligne après Modification Code
    1079 1079 color: #fff;
    1080 1080 }
    1081 1081
    1082 Supprimée // VALIDISCAN-SEEDED vs-focus-visible: the theme removes the focus ring from links and actions.
    1083 Supprimée .navigation a:focus,
    1084 Supprimée .header.links a:focus,
    1085 Supprimée .product-item-link:focus,
    1086 Supprimée .footer a:focus,
    1087 Supprimée .action:focus,
    1088 Supprimée .logo:focus,
    1089 Supprimée .block-promo:focus,
    1090 Supprimée .journal-link:focus {
    1091 Supprimée outline: none;
    1092 Supprimée }
    1093 Supprimée
    1094 1082 // VALIDISCAN-SEEDED vs-headings-landmarks: the home page title is display:none, so the page has no h1.
    1095 1083 .cms-index-index .page-title-wrapper {
    1096 1084 display: none;
    1264 1252 height: 18px;
    1265 1253 stroke-width: 3;
    1266 1254 }
    1255 Ajoutée
    1256 Ajoutée /* validiscan:focus-visible-styles */
    1257 Ajoutée :focus-visible {
    1258 Ajoutée outline: 2px solid #1979c3;
    1259 Ajoutée outline-offset: 2px;
    1260 Ajoutée }
    1261 Ajoutée .panel.wrapper :focus-visible {
    1262 Ajoutée outline-color: #a1d0f3;
    1263 Ajoutée }
    1264 Ajoutée /* /validiscan:focus-visible-styles */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 10, lignes supprimées : 11)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 10, lignes supprimées : 11)
    Ligne avant Ligne après Modification Code
    1058 1058 color: #fff;
    1059 1059 }
    1060 1060
    1061 Supprimée .navigation a:focus,
    1062 Supprimée .header.links a:focus,
    1063 Supprimée .product-item-link:focus,
    1064 Supprimée .footer a:focus,
    1065 Supprimée .action:focus,
    1066 Supprimée .logo:focus,
    1067 Supprimée .block-promo:focus,
    1068 Supprimée .journal-link:focus {
    1069 Supprimée outline: none;
    1070 Supprimée }
    1071 Supprimée
    1072 1061 .cms-index-index .page-title-wrapper {
    1073 1062 display: none;
    1074 1063 }
    1232 1221 height: 18px;
    1233 1222 stroke-width: 3;
    1234 1223 }
    1224 Ajoutée
    1225 Ajoutée /* validiscan:focus-visible-styles */
    1226 Ajoutée :focus-visible {
    1227 Ajoutée outline: 2px solid #1979c3;
    1228 Ajoutée outline-offset: 2px;
    1229 Ajoutée }
    1230 Ajoutée .panel.wrapper :focus-visible {
    1231 Ajoutée outline-color: #a1d0f3;
    1232 Ajoutée }
    1233 Ajoutée /* /validiscan:focus-visible-styles */
  • Un ordre de tabulation qui suit la page remove-positive-tabindex Dès qu’un élément signalé porte un tabindex supérieur à 0, tous les tabindex positifs fixes des templates du thème sont retirés ou fixés à 0.

    Un tabindex supérieur à 0 fait passer un élément en tête de l’ordre de tabulation. De telles valeurs ne fonctionnent que les unes par rapport aux autres sur l’ensemble de la page : dès qu’il est établi qu’un élément signalé en porte une dans les templates du thème, la recette retire tous les tabindex positifs fixes des templates du thème, y compris sur des éléments que le constat n’énumérait pas. Les liens, les boutons et les champs de formulaire perdent l’attribut ; les autres éléments reçoivent tabindex="0", afin qu’ils restent atteignables pendant que la touche Tab suit l’ordre de la page. Un tabindex que du code PHP calcule est laissé à une personne. Le contrôle vs-focus-order de Validiscan signale aussi un focus qui saute d’un endroit à l’autre de la page pour d’autres raisons, par exemple un contenu placé ailleurs par ses styles ; il est MANUAL, et ses constats s’accompagnent donc d’indications, et non de cette modification.

    Règles couvertes
    • tabindex AUTO
    • vs-focus-order MANUAL
    Types de fichiers modifiés
    .phtml
    removes tabindex 1-4 from the login form and the CAPTCHA and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    14 14 <div class="field captcha required" role="group" aria-labelledby="captcha-question" data-captcha-type="math">
    15 15 <label for="captcha_user_login" class="label" id="captcha-question"><span><?= $escaper->escapeHtml(__('Security question: what is %1 + %2?', $a, $b)) ?></span></label>
    16 16 <div class="control captcha">
    17 Supprimée <input name="captcha[user_login]" type="text" class="input-text required-entry" id="captcha_user_login" autocomplete="off" inputmode="numeric" tabindex="3" data-captcha-answer-hash="<?= $escaper->escapeHtmlAttr(md5((string) ($a + $b))) ?>">
    17 Ajoutée <input name="captcha[user_login]" type="text" class="input-text required-entry" id="captcha_user_login" autocomplete="off" inputmode="numeric" data-captcha-answer-hash="<?= $escaper->escapeHtmlAttr(md5((string) ($a + $b))) ?>">
    18 18 </div>
    19 19 </div>

    app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (lignes ajoutées : 3, lignes supprimées : 3)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (lignes ajoutées : 3, lignes supprimées : 3)
    Ligne avant Ligne après Modification Code
    27 27 <div class="field email required">
    28 28 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label>
    29 29 <div class="control">
    30 Supprimée <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'>
    30 Ajoutée <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'>
    31 31 <div for="email" generated="true" class="mage-error" id="email-error"><?= $escaper->escapeHtml(__('Please enter a valid email address (Ex: johndoe@domain.com).')) ?></div>
    32 32 </div>
    33 33 </div>
    35 35 <div class="field password required">
    36 36 <label for="pass" class="label"><span><?= $escaper->escapeHtml(__('Password')) ?></span></label>
    37 37 <div class="control">
    38 Supprimée <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;">
    38 Ajoutée <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" onpaste="return false;" oncopy="return false;">
    39 39 </div>
    40 40 </div>
    41 41 <!-- VALIDISCAN-SEEDED vs-accessible-auth: arithmetic CAPTCHA with no alternative -->
    42 42 <?= $block->getChildHtml('form_additional_info') /* math CAPTCHA module: div.field.captcha, input#captcha_user_login tabindex="3" */ ?>
    43 43 <div class="actions-toolbar">
    44 Supprimée <div class="primary"><button type="submit" class="action login primary" name="send" id="send2" tabindex="4"><span><?= $escaper->escapeHtml(__('Sign In')) ?></span></button></div>
    44 Ajoutée <div class="primary"><button type="submit" class="action login primary" name="send" id="send2"><span><?= $escaper->escapeHtml(__('Sign In')) ?></span></button></div>
    45 45 <div class="secondary"><a class="action remind" href="<?= $escaper->escapeUrl($block->getUrl('contact')) ?>"><span><?= $escaper->escapeHtml(__('Forgot Your Password? Contact us')) ?></span></a></div>
    46 46 </div>
    47 47 </fieldset>

Zoom et cibles tactiles

  • Zoom autorisé sur téléphone meta-viewport-zoom La balise viewport du thème perd user-scalable=no et tout maximum-scale inférieur à 2, afin que les visiteurs puissent zoomer sur la page avec un téléphone ; une valeur que du code PHP calcule est consignée pour votre développeur.

    La recette retire user-scalable=no et tout maximum-scale inférieur à 2 de la balise viewport dans le XML de layout du thème, comme default_head_blocks.xml, où Luma la déclare, ou dans ses templates, afin que les visiteurs puissent zoomer sur la page avec un téléphone. Pour la règle de bonne pratique meta-viewport-large, la limite est de 5. Les autres réglages du viewport restent tels quels. Une valeur de viewport que du code PHP calcule est consignée à l’intention de votre développeur, qui la vérifie. Si la balise qui bloque le zoom ne vient pas du thème, par exemple des réglages HTML Head de l’Admin de Magento ou d’un module, la recette ne change rien.

    Règles couvertes
    • meta-viewport AUTO
    • meta-viewport-large AUTO
    Types de fichiers modifiés
    .xml
    removes the zoom block from default_head_blocks.xml and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    3 3 <head>
    4 4 <!-- VALIDISCAN-SEEDED meta-viewport: pinch zoom disabled (Luma 2.0-2.3 default kept by the theme).
    5 5 Fixed variant: content="width=device-width, initial-scale=1". -->
    6 Supprimée <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"/>
    6 Ajoutée <meta name="viewport" content="width=device-width, initial-scale=1"/>
    7 7 <meta name="format-detection" content="telephone=no"/>
    8 8 <css src="css/styles-m.css"/>
    9 9 <css src="css/styles-l.css" media="screen and (min-width: 768px)"/>
  • Des cibles tactiles plus grandes target-size-padding Les boutons et les liens que le scan a trouvés trop petits reçoivent une taille minimale de 24 × 24 pixels, par des classes que la feuille de style du thème peut cibler.

    Les boutons et les liens que le scan a trouvés trop petits, comme les icônes de réseaux sociaux ou les boutons de quantité, reçoivent une taille minimale de 24 × 24 pixels dans un bloc à la fin de la feuille de style du thème. Le bloc reprend les sélecteurs avec lesquels le thème les a rendus petits, ou leurs propres classes, et définit une largeur et une hauteur minimales, qui l’emportent sur une largeur ou une hauteur plus petite. Les icônes à l’intérieur et la mise en page autour restent telles quelles. Un lien ou un autre élément inline sans règle display passe en inline-flex, car les éléments inline ignorent une taille minimale. Une commande sans classe que la feuille de style peut cibler est laissée à une personne.

    Règles couvertes
    • vs-target-size AUTO
    Types de fichiers modifiés
    .css.less
    sizes the three flagged controls and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 9, lignes supprimées : 0)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 9, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1264 1264 height: 18px;
    1265 1265 stroke-width: 3;
    1266 1266 }
    1267 Ajoutée
    1268 Ajoutée /* validiscan:target-size-padding */
    1269 Ajoutée .social-link,
    1270 Ajoutée .actions-secondary .action,
    1271 Ajoutée .qty-step {
    1272 Ajoutée min-width: 24px;
    1273 Ajoutée min-height: 24px;
    1274 Ajoutée }
    1275 Ajoutée /* /validiscan:target-size-padding */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 9, lignes supprimées : 0)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 9, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1232 1232 height: 18px;
    1233 1233 stroke-width: 3;
    1234 1234 }
    1235 Ajoutée
    1236 Ajoutée /* validiscan:target-size-padding */
    1237 Ajoutée .social-link,
    1238 Ajoutée .actions-secondary .action,
    1239 Ajoutée .qty-step {
    1240 Ajoutée min-width: 24px;
    1241 Ajoutée min-height: 24px;
    1242 Ajoutée }
    1243 Ajoutée /* /validiscan:target-size-padding */

Mouvement, diaporamas et son

  • Moins de mouvement lorsque le visiteur le demande reduced-motion-guard Lorsque l’appareil d’un visiteur demande de réduire les mouvements, les animations, les transitions de 5 secondes ou plus et le défilement fluide que déclenchent les feuilles de style du thème sont désactivés.

    Lorsque l’appareil d’un visiteur est réglé pour réduire les mouvements, un bloc à la fin de chaque feuille de style du thème désactive les animations, les transitions de 5 secondes ou plus et le défilement fluide que cette feuille de style déclenche, sélecteur par sélecteur. Lorsque les scripts du thème dans web/js démarrent un slider avec le défilement automatique activé, le slider démarre sans défilement automatique pour ces visiteurs. Une règle imbriquée dans une autre règle LESS est consignée à l’intention de votre développeur. Les animations du code de Magento ou des extensions ne figurent pas dans les fichiers du thème et demandent leur propre protection.

    Règles couvertes
    • vs-motion AUTO
    Types de fichiers modifiés
    .css.less
    guards the badge and slider animations and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 9, lignes supprimées : 0)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 9, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1264 1264 height: 18px;
    1265 1265 stroke-width: 3;
    1266 1266 }
    1267 Ajoutée
    1268 Ajoutée /* validiscan:reduced-motion-guard */
    1269 Ajoutée @media (prefers-reduced-motion: reduce) {
    1270 Ajoutée .product-label,
    1271 Ajoutée .slick-track {
    1272 Ajoutée animation: none;
    1273 Ajoutée }
    1274 Ajoutée }
    1275 Ajoutée /* /validiscan:reduced-motion-guard */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 9, lignes supprimées : 0)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 9, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1232 1232 height: 18px;
    1233 1233 stroke-width: 3;
    1234 1234 }
    1235 Ajoutée
    1236 Ajoutée /* validiscan:reduced-motion-guard */
    1237 Ajoutée @media (prefers-reduced-motion: reduce) {
    1238 Ajoutée .product-label,
    1239 Ajoutée .slick-track {
    1240 Ajoutée animation: none;
    1241 Ajoutée }
    1242 Ajoutée }
    1243 Ajoutée /* /validiscan:reduced-motion-guard */
  • Des diaporamas qui ne bougent que lorsque le visiteur le demande slider-pause-control Pas de bouton de pause sur Magento : le défilement automatique est désactivé sur les sliders Page Builder des fichiers du thème, qui ne changent alors que lorsque le visiteur utilise les points ou les flèches.

    Sur Magento, cette recette n’ajoute pas de bouton de pause. Le slider de Page Builder fonctionne avec les propres scripts de Magento, et un thème ne peut pas lui donner de bouton de pause sans surcharger le code de Magento. La recette utilise à la place le réglage propre au slider : sur chaque slider Page Builder à défilement automatique présent dans les fichiers du thème, le défilement automatique est désactivé, comme le fait l’interrupteur Autoplay de Page Builder, et les flèches sont activées là où le slider n’aurait sinon aucun moyen de passer d’une diapositive à l’autre. Les animations CSS sans fin qui font bouger un slider d’elles-mêmes sont retirées. Les diapositives ne changent alors que lorsque le visiteur utilise les points ou les flèches : rien ne bouge tout seul, il n’y a donc rien à mettre en pause. Un slider stocké dans la base de données de Magento n’est pas un fichier du thème : vous désactivez son défilement automatique avec le réglage Autoplay de Page Builder. Un slider que les propres scripts du thème démarrent avec le défilement automatique, comme un slider Slick ou Swiper, a besoin d’un bouton de pause relié à ce script, ce qui est laissé à une personne.

    Règles couvertes
    • vs-carousel AUTO
    Types de fichiers modifiés
    .css.html.less
    turns off the Page Builder autoplay and the track animation, and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    3 3 class="pagebuilder-slider slick-slider"
    4 4 data-content-type="slider"
    5 5 data-appearance="default"
    6 Supprimée data-autoplay="true"
    6 Ajoutée data-autoplay="false"
    7 7 data-autoplay-speed="3000"
    8 8 data-fade="false"
    9 9 data-infinite-loop="true"

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 0, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 0, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1176 1176 .slick-track {
    1177 1177 display: flex;
    1178 1178 width: 300%;
    1179 Supprimée animation: nw-slider-autoplay 9s ease-in-out infinite;
    1180 1179 }
    1181 1180 .slick-slide {
    1182 1181 flex: 0 0 33.3333%;

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 0, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 0, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1147 1147 .slick-track {
    1148 1148 display: flex;
    1149 1149 width: 300%;
    1150 Supprimée animation: nw-slider-autoplay 9s ease-in-out infinite;
    1151 1150 }
    1152 1151 .slick-slide {
    1153 1152 flex: 0 0 33.3333%;
  • Aucun son qui démarre tout seul mute-autoplay Une vidéo des templates du thème qui se lance toute seule est rendue muette et un contenu audio ne démarre plus tout seul, sauf si du code PHP active la lecture automatique ; sur Magento, la recette n’est pas utilisée pour les constats de vs-media.

    Une vidéo des templates du thème qui se lance toute seule reçoit muted et playsinline : elle continue ainsi de jouer en silence et dans la page sur téléphone. Un contenu audio ne démarre plus tout seul. Les lecteurs YouTube et Vimeo intégrés qui démarrent seuls sont réglés pour démarrer sans le son. La lecture automatique qu’active du code PHP est laissée à une personne. Dans un scan Validiscan, le son qui démarre tout seul est signalé par le contrôle des médias vs-media de Validiscan, qui remplace la règle d’axe-core que cette recette couvre. vs-media, qui couvre aussi les sous-titres et les transcriptions, est MANUAL : sur Magento, un tel constat s’accompagne donc d’indications plutôt que de cette modification.

    Règles couvertes
    • no-autoplay-audio AUTO contrôle assuré par vs-media
    Types de fichiers modifiés
    .phtml
    mutes the autoplaying product video and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    44 44 <h3 class="data item title"><?= $escaper->escapeHtml(__('Product video')) ?></h3>
    45 45 <!-- VALIDISCAN-SEEDED vs-media: product video without a captions track -->
    46 46 <?php /* Fixed variant: <track kind="captions" src="...juno-jacket-care.en.vtt" srclang="en" label="English" default>. */ ?>
    47 Supprimée <video class="product-video-player" autoplay loop controls preload="none" width="560" height="315" poster="<?= $escaper->escapeUrl($product->getData('care_video_poster')) ?>">
    47 Ajoutée <video class="product-video-player" autoplay loop controls preload="none" width="560" height="315" poster="<?= $escaper->escapeUrl($product->getData('care_video_poster')) ?>" muted playsinline>
    48 48 <source src="<?= $escaper->escapeUrl($videoUrl) ?>" type="video/mp4">
    49 49 </video>
    50 50 <p><?= $escaper->escapeHtml($product->getData('care_video_caption')) ?></p>

Formulaires, panier et contenu intégré

  • Des étiquettes reliées à leurs champs label-association Un texte d’étiquette qui figure déjà sur la page avant un champ y est relié, sous forme de <label> ou par aria-labelledby.

    Un champ de formulaire dont le texte d’étiquette figure déjà sur la page, avant le champ, est relié à ce texte. Un <label> sans for en reçoit un qui pointe vers le champ. Un texte d’étiquette dans un <span> ou un <strong>, comme un texte « Sort By » portant la classe sorter-label de Luma à côté du menu de tri d’une page de catégorie, devient un <label> avec les mêmes classes. Un texte d’étiquette dans un élément de bloc, comme <div class="label">, garde sa balise et est relié par aria-labelledby. Le texte doit se trouver dans un conteneur sans autre champ, de sorte qu’il ne puisse pas appartenir à un autre. Les lecteurs d’écran lisent alors l’étiquette lorsque le champ reçoit le focus. Un champ qui n’a qu’un texte indicatif (placeholder) est laissé à une personne, car rédiger une étiquette est une décision de contenu.

    Règles couvertes
    • label AUTO contrôle assuré par vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    Types de fichiers modifiés
    .phtml
    turns the "Sort By" text into the sorter label and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    12 12 <div class="toolbar-sorter sorter">
    13 13 <!-- VALIDISCAN-SEEDED select-name + vs-forms-ecommerce: the "Sort By" text is a span, not a label for the select -->
    14 14 <?php /* Fixed variant: <label class="sorter-label" for="sorter">Sort By</label>. */ ?>
    15 Supprimée <span class="sorter-label"><?= $escaper->escapeHtml(__('Sort By')) ?></span>
    15 Ajoutée <label class="sorter-label" for="sorter"><?= $escaper->escapeHtml(__('Sort By')) ?></label>
    16 16 <select id="sorter" data-role="sorter" class="sorter-options">
    17 17 <?php foreach ($block->getAvailableOrders() as $key => $order): ?>
    18 18 <option value="<?= $escaper->escapeHtmlAttr($key) ?>"<?= $block->isOrderCurrent($key) ? ' selected' : '' ?>><?= $escaper->escapeHtml(__($order)) ?></option>
  • Des champs de compte, d’adresse et de contact que les navigateurs peuvent remplir autocomplete-tokens Les champs des templates du thème qui demandent des données propres au client, dans les formulaires d’adresse, de compte, de connexion, de contact et de newsletter, reçoivent la valeur autocomplete qui correspond à ce qu’ils demandent, sauf si le code d’un template l’écrit.

    Les champs des templates du thème qui demandent des données propres au client, dans les formulaires d’adresse, de compte, de connexion, de contact et de newsletter, reçoivent la valeur autocomplete qui correspond à ce qu’ils demandent, comme l’adresse e-mail, le nom, le numéro de téléphone, l’adresse postale, le code postal ou le mot de passe. La valeur est déduite du type, du nom, de l’id, de l’étiquette, du texte indicatif et du titre du champ, selon les mêmes règles que le contrôle des formulaires de Validiscan, et les champs de facturation et de livraison reçoivent leur section, comme dans shipping given-name. Dès qu’un champ d’un formulaire est signalé, tous les champs de ce formulaire sont traités. Les mots de passe reçoivent new-password dans les formulaires d’inscription et de réinitialisation et dans les formulaires qui comportent plusieurs champs de mot de passe, et current-password ailleurs. Les champs de code promo, de recherche, de destinataire de cadeau, de commentaire, de quantité et de CAPTCHA ne reçoivent jamais de valeur. Une valeur que le code d’un template écrit, ou une valeur valide qui semble erronée pour le champ, est laissée à une personne.

    Règles couvertes
    • autocomplete-valid AUTO contrôle assuré par vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    Types de fichiers modifiés
    .phtml
    adds tokens to the newsletter, login and contact forms and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (lignes ajoutées : 3, lignes supprimées : 3)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (lignes ajoutées : 3, lignes supprimées : 3)
    Ligne avant Ligne après Modification Code
    21 21 <!-- VALIDISCAN-SEEDED vs-forms-ecommerce: name, email and phone lack autocomplete; required only via the CSS asterisk -->
    22 22 <div class="field name required">
    23 23 <label class="label" for="name"><span><?= $escaper->escapeHtml(__('Name')) ?></span></label>
    24 Supprimée <div class="control"><input name="name" id="name" title="<?= $escaper->escapeHtmlAttr(__('Name')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserName()) ?>" class="input-text" type="text"></div>
    24 Ajoutée <div class="control"><input name="name" id="name" title="<?= $escaper->escapeHtmlAttr(__('Name')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserName()) ?>" class="input-text" type="text" autocomplete="name"></div>
    25 25 </div>
    26 26 <div class="field email required">
    27 27 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label>
    28 Supprimée <div class="control"><input name="email" id="email" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserEmail()) ?>" class="input-text" type="email"></div>
    28 Ajoutée <div class="control"><input name="email" id="email" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserEmail()) ?>" class="input-text" type="email" autocomplete="email"></div>
    29 29 </div>
    30 30 <div class="field telephone">
    31 31 <label class="label" for="telephone"><span><?= $escaper->escapeHtml(__('Phone Number')) ?></span></label>
    32 Supprimée <div class="control"><input name="telephone" id="telephone" title="<?= $escaper->escapeHtmlAttr(__('Phone Number')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserTelephone()) ?>" class="input-text" type="tel"></div>
    32 Ajoutée <div class="control"><input name="telephone" id="telephone" title="<?= $escaper->escapeHtmlAttr(__('Phone Number')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserTelephone()) ?>" class="input-text" type="tel" autocomplete="tel"></div>
    33 33 </div>
    34 34 <div class="field comment required">
    35 35 <label class="label" for="comment"><span><?= $escaper->escapeHtml(__('What’s on your mind?')) ?></span></label>

    app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    27 27 <div class="field email required">
    28 28 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label>
    29 29 <div class="control">
    30 Supprimée <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'>
    30 Ajoutée <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="email" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'>
    31 31 <div for="email" generated="true" class="mage-error" id="email-error"><?= $escaper->escapeHtml(__('Please enter a valid email address (Ex: johndoe@domain.com).')) ?></div>
    32 32 </div>
    33 33 </div>
    35 35 <div class="field password required">
    36 36 <label for="pass" class="label"><span><?= $escaper->escapeHtml(__('Password')) ?></span></label>
    37 37 <div class="control">
    38 Supprimée <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;">
    38 Ajoutée <input name="login[password]" type="password" autocomplete="current-password" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;">
    39 39 </div>
    40 40 </div>
    41 41 <!-- VALIDISCAN-SEEDED vs-accessible-auth: arithmetic CAPTCHA with no alternative -->

    app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    18 18 <!-- VALIDISCAN-SEEDED vs-forms-ecommerce (label): newsletter email only has a placeholder, no label and no autocomplete -->
    19 19 <div class="field newsletter">
    20 20 <div class="control">
    21 Supprimée <input name="email" type="email" id="newsletter" placeholder="<?= $escaper->escapeHtmlAttr(__('Enter your email address')) ?>" data-mage-init='{"mage/trim-input":{}}' data-validate="{required:true, 'validate-email':true}">
    21 Ajoutée <input name="email" type="email" id="newsletter" placeholder="<?= $escaper->escapeHtmlAttr(__('Enter your email address')) ?>" data-mage-init='{"mage/trim-input":{}}' data-validate="{required:true, 'validate-email':true}" autocomplete="email">
    22 22 </div>
    23 23 </div>
    24 24 <div class="actions">
  • Les changements de prix, de stock et de panier annoncés live-region-cart-variant Les conteneurs des templates du thème que réécrivent les scripts de Magento, comme le bloc de prix et le compteur du mini-panier, deviennent des régions live ; les scripts ne sont pas modifiés.

    Les scripts propres à Magento réécrivent le texte à l’intérieur de conteneurs fixes lorsqu’un client choisit une taille ou une couleur ou ajoute un produit au panier. La recette transforme ces conteneurs, dans les templates du thème, en régions live, de sorte que les lecteurs d’écran lisent la nouvelle valeur sans que le client ait à s’y déplacer. Le bloc de prix et le compteur du mini-panier sont lus en entier lorsqu’ils changent ; le message de stock et les messages de la page, comme la note indiquant qu’un produit a été ajouté au panier, reçoivent role="status". Les scripts eux-mêmes ne sont pas modifiés. Lorsque le thème désigne toute la page comme une région live, ce qui pousse les lecteurs d’écran à lire chaque changement à voix haute, cette désignation est retirée. Lorsque c’est le script d’une extension qui l’ajoute pendant l’exécution de la page, le cas est laissé à une personne.

    Règles couvertes
    • vs-live-updates AUTO
    Types de fichiers modifiés
    .phtml
    makes the price box and the stock message live regions and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    13 13 // Fixed variant: the product-page box carries aria-live="polite" aria-atomic="true" and the stock
    14 14 // message (product/view/type/default.phtml) is role="status".
    15 15 ?>
    16 Supprimée <div class="price-box price-final_price" data-role="priceBox" data-product-id="<?= (int) $product->getId() ?>" data-price-box="product-id-<?= (int) $product->getId() ?>"<?php if ($isProductPage): ?> data-base-price="<?= (float) $amount ?>"<?php endif; ?>>
    16 Ajoutée <div class="price-box price-final_price" data-role="priceBox" data-product-id="<?= (int) $product->getId() ?>" data-price-box="product-id-<?= (int) $product->getId() ?>"<?php if ($isProductPage): ?> data-base-price="<?= (float) $amount ?>"<?php endif; ?> aria-live="polite" aria-atomic="true">
    17 17 <span class="normal-price"><span class="price-container price-final_price tax weee"><span id="product-price-<?= (int) $product->getId() ?>" data-price-amount="<?= (float) $amount ?>" data-price-type="finalPrice" class="price-wrapper"><span class="price"><?= $escaper->escapeHtml($block->renderAmount($block->getPriceType('final_price')->getAmount(), ['display_label' => false])) ?></span></span></span></span>
    18 18 </div>

    app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    11 11 ?>
    12 12 <div class="product-info-stock-sku">
    13 13 <?php if ($block->displayProductStockStatus()): ?>
    14 Supprimée <div class="stock available" title="<?= $escaper->escapeHtmlAttr(__('Availability')) ?>"><span><?= $escaper->escapeHtml(__('In stock')) ?></span></div>
    14 Ajoutée <div class="stock available" title="<?= $escaper->escapeHtmlAttr(__('Availability')) ?>" role="status"><span><?= $escaper->escapeHtml(__('In stock')) ?></span></div>
    15 15 <?php endif; ?>
    16 16 <div class="product attribute sku"><strong class="type"><?= $escaper->escapeHtml(__('SKU')) ?></strong> <div class="value" itemprop="sku"><?= $escaper->escapeHtml($product->getSku()) ?></div></div>
    17 17 </div>
  • Des titres pour les cartes et les vidéos intégrées iframe-title Un cadre intégré sans titre reçoit un titre traduisible qui dit ce qu’il montre, lorsque le code le révèle.

    Un cadre intégré sans titre, comme une carte, une vidéo YouTube ou Vimeo, un calendrier, un formulaire ou un widget d’avis, reçoit un titre traduisible qui dit ce qu’il montre. La recette déduit ce que montre le cadre de son adresse, y compris les parties fixes d’une adresse que construit du code PHP, ainsi que de ses classes, de son id et de son nom. Un cadre dont le code ne révèle pas le contenu ne reçoit aucun titre de la recette et est laissé à une personne.

    Règles couvertes
    • frame-title AUTO
    Types de fichiers modifiés
    .phtml
    titles the store map on the contact page and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    48 48 <p>Nordwind Outfitters (fixture)<br>Musterstraße 12<br>10115 Berlin, Germany</p>
    49 49 <p><?= $escaper->escapeHtml(__('Monday to Saturday, 10:00 to 19:00')) ?></p>
    50 50 <!-- VALIDISCAN-SEEDED frame-title: the store map iframe has no title -->
    51 Supprimée <iframe src="<?= $escaper->escapeUrl($block->getBaseUrl() . 'media/wysiwyg/store-map.html') ?>" width="480" height="260" loading="lazy"></iframe>
    51 Ajoutée <iframe src="<?= $escaper->escapeUrl($block->getBaseUrl() . 'media/wysiwyg/store-map.html') ?>" width="480" height="260" loading="lazy" title="<?= $escaper->escapeHtmlAttr(__('Store location map')) ?>"></iframe>
    52 52 </div>
    53 53 </div>

Contraste, images et commandes qui demandent du jugement

Le contraste du texte, les alternatives textuelles des images et les noms des commandes qui n’en ont pas demandent généralement du jugement : quelle couleur convient à votre marque, quels mots décrivent une image. Les règles qui les signalent ont le niveau ASSISTED, comme le montrent les listes ci-dessous. Pour un constat d’une règle ASSISTED, l’IA ne rédige une modification que si vous avez accepté la rédaction par IA, et Validiscan relit chaque modification avant sa livraison.

Les quatre recettes ci-dessous ne sont la correction standard d’aucune règle. Chacune ne couvre que les cas précis où le code du thème suffit à lui seul à prouver quelle doit être la modification. Dans un projet, button-semantics est appliquée aux constats du contrôle de diaporama vs-carousel, du niveau AUTO : le moteur de correction l’essaie lorsque la recette de slider ci-dessus ne corrige pas un tel constat. Sur Magento, les trois autres ne couvrent que des règles ASSISTED : un constat de ces règles suit la voie ASSISTED, et ces trois recettes ne lui sont pas appliquées.

  • Des couleurs de texte suffisamment contrastées contrast-tokens Une couleur de texte qui échoue au contrôle du contraste et qui est définie à un seul endroit passe à la couleur la plus proche de la même teinte qui réussit sur chaque arrière-plan mesuré ; recette non appliquée dans un projet.

    Lorsqu’un texte échoue au contrôle du contraste et que sa couleur est définie à un seul endroit du thème, cet endroit passe à la couleur la plus proche de la même teinte qui atteint le contraste requis avec chaque arrière-plan que le scan a mesuré pour ce texte. Cet endroit peut être une variable LESS ou une propriété personnalisée CSS utilisée uniquement pour la couleur du texte, ou une seule règle color. Lorsque le thème fournit un styles-m.css compilé, il reçoit la même modification. Une couleur utilisée à plusieurs endroits, aussi comme arrière-plan ou comme bordure, ou dans des règles dont le scan n’a pas mesuré l’arrière-plan, est laissée à une personne.

    Règles couvertes
    • color-contrast ASSISTED
    Types de fichiers modifiés
    .css.less
    darkens the single #929292 token and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1099 1099 // VALIDISCAN-SEEDED color-contrast: #929292 on white is 3.1:1.
    1100 1100 .block-promo .info,
    1101 1101 .toolbar-amount {
    1102 Supprimée color: #929292;
    1102 Ajoutée color: #767676;
    1103 1103 }
    1104 1104
    1105 1105 // VALIDISCAN-SEEDED vs-reflow: the promo row keeps a 1100px minimum width at every breakpoint.

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1075 1075
    1076 1076 .block-promo .info,
    1077 1077 .toolbar-amount {
    1078 Supprimée color: #929292;
    1078 Ajoutée color: #767676;
    1079 1079 }
    1080 1080
    1081 1081 .block-promo-wrapper {
  • Des images décoratives masquées aux lecteurs d’écran decorative-image-alt Seules les images dont le template prouve qu’elles sont décoratives reçoivent un alt vide ou aria-hidden ; recette non appliquée dans un projet.

    Une image n’est marquée comme décorative que lorsque le template prouve qu’elle n’apporte rien : elle se trouve dans un lien ou un bouton qui a déjà un texte ou un nom, comme une vignette de promotion avec son propre titre ; c’est une icône, de 48 pixels au plus ou avec une classe ou un nom de fichier d’icône, placée à côté de sa propre étiquette textuelle ; ou c’est un espaceur ou un séparateur. Un <img> reçoit alors un alt vide, et une icône SVG reçoit aria-hidden="true", de sorte que les lecteurs d’écran l’ignorent au lieu de lire un nom de fichier. Toute autre image est traitée comme du contenu, et son alternative textuelle demande des mots qu’une personne choisit.

    Règles couvertes
    • image-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    Types de fichiers modifiés
    .html
    marks the promo tile image decorative and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    111 111 <div class="block-promo-wrapper block-promo-hp">
    112 112 <!-- VALIDISCAN-SEEDED image-alt: promo image without an alt attribute -->
    113 113 <a class="block-promo home-main" href="/magento/women/tops-women/jackets-women.html">
    114 Supprimée <img src="/magento/media/wysiwyg/home/home-main.svg" width="400" height="240" />
    114 Ajoutée <img src="/magento/media/wysiwyg/home/home-main.svg" width="400" height="240" alt="" />
    115 115 <span class="content"
    116 116 ><!-- VALIDISCAN-SEEDED color-contrast: .info text is #929292 on white (3.1:1) --><span
    117 117 class="info"
  • Des commandes réservées à la souris transformées en boutons button-semantics Les éléments cliquables <div> et <span> des sliders et des bandeaux cookies deviennent de vrais boutons lorsque le code indique que ce sont des commandes ; dans un projet, la recette est appliquée aux constats de vs-carousel.

    Les éléments cliquables <div> et <span> des sliders et des bandeaux cookies deviennent de vrais boutons. La recette ne considère un élément comme une commande que si le code l’indique : il a role="button", un gestionnaire de clic ou une liaison de clic Knockout, ou une classe ou un attribut data que le script du thème sélectionne pour gérer les clics. Les classes, les attributs data et les attributs ARIA restent, de sorte que les styles et les scripts du thème retrouvent la commande comme avant, et les touches Entrée et Espace font désormais ce que fait un clic. Une petite réinitialisation de style à la fin de la feuille de style du thème conserve son apparence, y compris au survol et au focus, et les contours de focus ne sont pas touchés. Une commande qui contient des blocs, des liens ou des champs, ou qui n’a pas de classe, est laissée à une personne.

    Règles couvertes
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Types de fichiers modifiés
    .css.less.phtml
    turns span controls of the cookie bar into buttons and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    24 24 <div class="amgdprcookie-bar-block">
    25 25 <p class="amgdprcookie-policy"><?= $escaper->escapeHtml(__('We use cookies to give you the best shopping experience and to analyse our traffic. By continuing to browse you agree to our')) ?> <a href="<?= $escaper->escapeUrl($block->getPrivacyPolicyLink()) ?>" class="amgdprcookie-link"><?= $escaper->escapeHtml(__('cookie policy')) ?></a>.</p>
    26 26 <div class="amgdprcookie-buttons-block">
    27 Supprimée <span class="amgdprcookie-button -allow" data-amcookie-js="allow" role="button" tabindex="0"><svg class="icon" viewBox="0 0 24 24"><path d="M4 12l5 5L20 6"/></svg></span>
    28 Supprimée <span class="amgdprcookie-button -decline" data-amcookie-js="decline" role="button" tabindex="0"><svg class="icon" viewBox="0 0 24 24"><path d="M6 6l12 12M18 6L6 18"/></svg></span>
    27 Ajoutée <button class="amgdprcookie-button -allow" data-amcookie-js="allow" type="button"><svg class="icon" viewBox="0 0 24 24"><path d="M4 12l5 5L20 6"/></svg></button>
    28 Ajoutée <button class="amgdprcookie-button -decline" data-amcookie-js="decline" type="button"><svg class="icon" viewBox="0 0 24 24"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
    29 29 </div>
    30 30 </div>
    31 31 </div>

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 30, lignes supprimées : 0)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (lignes ajoutées : 30, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1264 1264 height: 18px;
    1265 1265 stroke-width: 3;
    1266 1266 }
    1267 Ajoutée
    1268 Ajoutée /* validiscan:button-semantics */
    1269 Ajoutée button.amgdprcookie-button.-allow,
    1270 Ajoutée button.amgdprcookie-button.-decline {
    1271 Ajoutée -webkit-appearance: none;
    1272 Ajoutée appearance: none;
    1273 Ajoutée margin: 0;
    1274 Ajoutée padding: 0;
    1275 Ajoutée box-shadow: none;
    1276 Ajoutée font: inherit;
    1277 Ajoutée letter-spacing: inherit;
    1278 Ajoutée text-align: inherit;
    1279 Ajoutée text-transform: inherit;
    1280 Ajoutée text-shadow: none;
    1281 Ajoutée }
    1282 Ajoutée button.amgdprcookie-button.-allow:hover,
    1283 Ajoutée button.amgdprcookie-button.-allow:focus,
    1284 Ajoutée button.amgdprcookie-button.-allow:active {
    1285 Ajoutée background: @nw-primary;
    1286 Ajoutée border: 0;
    1287 Ajoutée color: #fff;
    1288 Ajoutée }
    1289 Ajoutée button.amgdprcookie-button.-decline:hover,
    1290 Ajoutée button.amgdprcookie-button.-decline:focus,
    1291 Ajoutée button.amgdprcookie-button.-decline:active {
    1292 Ajoutée background: #fff;
    1293 Ajoutée border: 1px solid @nw-border;
    1294 Ajoutée color: @nw-text;
    1295 Ajoutée }
    1296 Ajoutée /* /validiscan:button-semantics */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 30, lignes supprimées : 0)

    Modifications apportées à app/design/frontend/Validiscan/fixture/web/css/styles-m.css (lignes ajoutées : 30, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1232 1232 height: 18px;
    1233 1233 stroke-width: 3;
    1234 1234 }
    1235 Ajoutée
    1236 Ajoutée /* validiscan:button-semantics */
    1237 Ajoutée button.amgdprcookie-button.-allow,
    1238 Ajoutée button.amgdprcookie-button.-decline {
    1239 Ajoutée -webkit-appearance: none;
    1240 Ajoutée appearance: none;
    1241 Ajoutée margin: 0;
    1242 Ajoutée padding: 0;
    1243 Ajoutée box-shadow: none;
    1244 Ajoutée font: inherit;
    1245 Ajoutée letter-spacing: inherit;
    1246 Ajoutée text-align: inherit;
    1247 Ajoutée text-transform: inherit;
    1248 Ajoutée text-shadow: none;
    1249 Ajoutée }
    1250 Ajoutée button.amgdprcookie-button.-allow:hover,
    1251 Ajoutée button.amgdprcookie-button.-allow:focus,
    1252 Ajoutée button.amgdprcookie-button.-allow:active {
    1253 Ajoutée background: #1979c3;
    1254 Ajoutée border: 0;
    1255 Ajoutée color: #fff;
    1256 Ajoutée }
    1257 Ajoutée button.amgdprcookie-button.-decline:hover,
    1258 Ajoutée button.amgdprcookie-button.-decline:focus,
    1259 Ajoutée button.amgdprcookie-button.-decline:active {
    1260 Ajoutée background: #fff;
    1261 Ajoutée border: 1px solid #c2c2c2;
    1262 Ajoutée color: #333;
    1263 Ajoutée }
    1264 Ajoutée /* /validiscan:button-semantics */
  • Des noms pour les boutons et les liens qui n’ont qu’une icône icon-accessible-name Les boutons et les liens qui n’affichent qu’une icône et dont le code révèle la fonction reçoivent un aria-label, dans la formulation du thème Luma de Magento lorsque Luma en a une ; recette non appliquée dans un projet.

    Les boutons et les liens qui n’affichent qu’une icône, comme la recherche, le mini-panier, le compte, la liste de souhaits, la comparaison, le menu, la fermeture, les boutons précédent et suivant, ainsi que les choix d’un bandeau cookies, reçoivent un aria-label qui dit ce qu’ils font, dans la formulation du thème Luma de Magento lorsque Luma en a une, comme « Search », « My Cart » ou « Allow Cookies ». La fonction est déduite des classes, de l’id, des attributs data et de la cible de lien de la commande, de son icône et du formulaire ou du bandeau cookies qui l’entoure. Une commande dont le code ne révèle pas la fonction, comme un lien de réseau social construit dans une boucle à partir d’une adresse stockée sous forme de données, ou un lien dont le seul contenu est une photo de produit, est laissée à une personne, car son nom dépend de votre contenu.

    Règles couvertes
    • button-name ASSISTED
    • link-name ASSISTED
    • vs-cookie-banner ASSISTED
    Types de fichiers modifiés
    .phtml
    names the icon-only search button and validates Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    20 20 <div class="actions">
    21 21 <!-- VALIDISCAN-SEEDED button-name: icon-only search button without text, title or aria-label -->
    22 22 <?php /* Fixed variant: <button type="submit" title="Search" class="action search"><span class="sr-only">Search</span>(icon, aria-hidden)</button>; the form gets role="search" aria-label="Site search". */ ?>
    23 Supprimée <button type="submit" class="action search"><svg class="icon" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M20 20l-4-4"/></svg></button>
    23 Ajoutée <button type="submit" class="action search" aria-label="<?= $escaper->escapeHtmlAttr(__('Search')) ?>"><svg class="icon" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M20 20l-4-4"/></svg></button>
    24 24 </div>
    25 25 </form>
    26 26 </div>
    names the minicart link and leaves the product photo link for review Données d’exemple

    app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    13 13 ?>
    14 14 <!-- VALIDISCAN-SEEDED link-name + aria-valid-attr-value: the "My Cart" text was removed from the minicart link (only an icon and an empty counter remain) and aria-expanded carries the invalid value "closed" -->
    15 15 <div data-block="minicart" class="minicart-wrapper">
    16 Supprimée <a class="action showcart" href="<?= $escaper->escapeUrl($block->getShoppingCartUrl()) ?>" data-bind="scope: 'minicart_content'" aria-haspopup="true" aria-expanded="closed">
    16 Ajoutée <a class="action showcart" href="<?= $escaper->escapeUrl($block->getShoppingCartUrl()) ?>" data-bind="scope: 'minicart_content'" aria-haspopup="true" aria-expanded="closed" aria-label="<?= $escaper->escapeHtmlAttr(__('My Cart')) ?>">
    17 17 <svg class="icon" viewBox="0 0 24 24"><path d="M3 4h2l2.4 11.2a2 2 0 0 0 2 1.6h7.7a2 2 0 0 0 2-1.5L21 8H6"/><circle cx="10" cy="20" r="1.5"/><circle cx="17" cy="20" r="1.5"/></svg>
    18 18 <span class="counter qty empty"><span class="counter-number"></span></span>
    19 19 </a>
Détails : les niveaux, le thème de test, les contrôles de chaque modification et le texte dans les langues de votre boutique

Une recette est une modification déterministe pour un type d’échec : le même code reçoit toujours la même modification. Validiscan dispose de 20 recettes pour les thèmes Magento. Chacune n’intervient que là où le code du thème montre quelle modification est la bonne. Là où il ne le montre pas, la recette ne change rien. Elle ne devine pas.

Sous chaque recette figurent les règles qu’elle couvre, avec le niveau de chaque règle dans le catalogue de Validiscan pour Magento. AUTO signifie qu’une recette est la correction standard de la règle. ASSISTED signifie que les constats de la règle demandent généralement du jugement. MANUAL signifie que la règle demande la décision d’une personne et s’accompagne d’indications. Dans un projet, les recettes sont appliquées aux constats des règles du niveau AUTO. Lorsqu’une recette énumère aussi une règle du niveau ASSISTED ou MANUAL, un constat de cette règle suit à la place la voie ASSISTED ou MANUAL. Une règle dont le contrôle est assuré par un autre contrôle n’est pas exécutée seule lors d’un scan : cet autre contrôle signale le même échec.

Les types de fichiers et l’avant et l’après de chaque recette proviennent des tests internes de Validiscan. Ils s’exécutent sur le thème de test Magento de Validiscan, un thème enfant du thème Luma de Magento dans lequel des échecs d’accessibilité ont été introduits volontairement. Le rendu de Magento est impossible dans l’environnement de test : aucun test ne produit donc de page. Chaque test compare la modification à un diff enregistré et vérifie la source modifiée, par exemple qu’elle correspond à la version corrigée du thème de test. Les fichiers de votre thème seront différents.

Avant que Validiscan ne relise une modification, les fichiers modifiés sont contrôlés. Chaque chemin doit se trouver à l’intérieur du thème, comme décrit plus haut. Les templates .phtml passent par le contrôle de syntaxe propre à PHP, qui lit le fichier sans l’exécuter. Le XML de layout est contrôlé comme du XML, les feuilles de style subissent un contrôle de structure, et les templates HTML et le JavaScript sont analysés.

Lorsqu’une recette ajoute des mots, comme le texte d’un lien d’évitement ou le nom d’une zone de navigation, elle les écrit en anglais, dans la formulation du thème Luma de Magento lorsque Luma en a une, comme « Skip to Content ». Lorsque votre thème a un fichier de traduction allemand dans son dossier i18n, la recette y ajoute le texte allemand, sauf si la chaîne est déjà traduite. Aucun texte n’est ajouté pour les autres langues de votre boutique.

Qu’est-ce qui reste MANUAL sur Magento ?

Les échecs qui exigent une décision sur votre contenu ou sur le comportement d’une partie de la page, qu’une recette ne prend pas, comme les sous-titres et transcriptions de vos vidéos et contenus audio, restent MANUAL sur Magento. Pour un constat d’une règle MANUAL, Validiscan donne des indications, et non une modification du code.

Les règles ci-dessous sont exécutées lors d’un scan et ont le niveau MANUAL sur Magento ; les règles de bonne pratique ne sont pas énumérées.

  • meta-refresh L’actualisation différée de moins de 20 heures ne doit pas être utilisée
  • nested-interactive Les éléments interactifs ne doivent pas être imbriqués
  • scrollable-region-focusable Les zones défilantes doivent être accessibles au clavier
  • server-side-image-map Les images réactives côté serveur ne doivent pas être utilisées
  • vs-keyboard-trap Le focus clavier ne doit jamais rester piégé
  • vs-focus-order L’ordre de tabulation doit suivre l’ordre visuel
  • vs-dragging Les éléments à faire glisser doivent offrir une alternative à pointeur unique
  • vs-media Les vidéos ont besoin de sous-titres, l’audio d’une transcription, et rien ne doit démarrer automatiquement avec le son
  • vs-documents Les documents liés nécessitent une vérification manuelle de l’accessibilité
Détails : ce que reçoit un constat MANUAL, la règle de l’ordre de tabulation, et ce qu’un projet laisse de côté

Pour un constat d’une règle MANUAL, Validiscan donne des indications sur la façon de le corriger, et non une modification de votre code. Ces échecs exigent une décision sur votre contenu ou sur le comportement d’une partie de la page, qu’une recette ne prend pas : les sous-titres et les transcriptions de vos vidéos et de vos contenus audio, un moyen de sortir d’un widget qui piège le focus clavier, un second moyen d’utiliser une commande qui ne fonctionne qu’en la faisant glisser, un ordre de focus qui correspond à la mise en page, une page qui se recharge d’elle-même après un délai, ou l’accessibilité des PDF et des autres documents liés. Un ordre de tabulation forcé par un tabindex supérieur à 0 est aussi signalé par la règle tabindex d’axe-core, que corrige la recette de l’ordre de tabulation ci-dessus.

Le travail sur les constats MANUAL qui exigent vos propres décisions de contenu ne fait pas partie d’un projet, pas plus que les PDF. Ce que les tests d’accessibilité automatisés peuvent et ne peuvent pas prouver

Que devez-vous fournir ?

Vous fournissez l’autorisation écrite d’un scan complet, une voie d’accès à votre thème, votre réponse sur la rédaction par IA des corrections ASSISTED, un développeur qui relit les modifications, compile les feuilles de style et déploie le thème, des modifications dans l’Admin de Magento, les traductions du texte ajouté dans vos autres langues, et vos décisions sur ce qui reste MANUAL.

  1. Une autorisation écrite pour un scan complet de votre boutique. Un scan complet met un produit dans le panier et ouvre la première étape du tunnel de commande, sans finaliser d’achat ni saisir de données de paiement.
  2. Une voie d’accès à votre thème : l’accès au dépôt GitHub qui le contient, ou un ZIP du dossier du thème sous app/design/frontend, téléversé dans le portail client.
  3. Votre réponse à la question de savoir si l’IA peut rédiger des corrections du niveau ASSISTED. La rédaction par IA reste désactivée tant que vous n’avez pas donné votre accord.
  4. Un développeur qui relit les modifications, fusionne la pull request ou applique le lot de correctifs, compile les feuilles de style et déploie le thème.
  5. Les modifications dans l’Admin de Magento que les corrections ne font pas : la vue de magasin ou le balisage de langue pour un contenu rédigé dans une autre langue que celle de son magasin, les titres de pages et les réglages HTML Head, et le défilement automatique désactivé sur les sliders Page Builder stockés dans la base de données.
  6. Les traductions du texte qu’ajoutent les corrections, pour les autres langues de votre boutique. Les recettes écrivent en anglais et n’ajoutent de l’allemand que là où votre thème a déjà un fichier de traduction allemand.
  7. Vos décisions sur ce qui reste MANUAL, comme les sous-titres de vos vidéos.
Détails : une fois les modifications en ligne, et ce que couvre un projet

Une fois les modifications en ligne, un scan de vérification contrôle de nouveau les pages concernées, et le Remediation Evidence Package consigne le résultat. Le déroulement d’un projet, étape par étape

Un projet couvre une boutique : un domaine et un thème. Une vitrine headless, dont les pages sont construites par une application frontend distincte au lieu d’un thème, est traitée sur demande.

Sources

Une source, vérifiée pour cette page le 6 octobre 2026.

Documentation d’Adobe Commerce pour les développeurs 1
  1. CSS and LESS preprocessing · Adobe · vérifiée le

Commencez par une vérification gratuite de votre boutique.

Envoyez l’adresse de votre boutique. Validiscan la scanne et vous envoie chaque échec que le scan peut prouver, avec sa page et son code.

Demander une vérification gratuite

Ou écrivez à info@validiscan.com.

Ce que couvre la vérification gratuite, et ce qu’elle laisse de côté
Vous envoyez
l’adresse de votre boutique
Pages scannées
jusqu’à 15
Vous recevez
chaque échec que le scan peut prouver, avec la page et le code
Sur votre boutique
pages publiques uniquement ; aucune connexion, aucun achat, aucun formulaire envoyé
Ce qu’elle n’est pas
un audit complet

Écrire à Validiscan

Pour une vérification gratuite, indiquez l’adresse de votre boutique et sa plateforme.

Validiscan utilise ce que vous envoyez pour vous répondre. Politique de confidentialité