Korrekturen zur Barrierefreiheit im Code Ihres Themes für Magento

Validiscan behebt Fehler der Barrierefreiheit in den .phtml-Templates, im Layout-XML und in den LESS- oder CSS-Stylesheets Ihres Magento-2-Themes. Nichts gelangt in Ihren Live-Shop, bevor Ihr Entwicklungsteam die Änderungen zusammenführt oder einspielt und das Theme bereitstellt.

Zuletzt aktualisiert:

Was ändert Validiscan in einem Magento-Theme?

Validiscan ändert nur die Dateien des Frontend-Themes Ihres Magento-2-Shops, des Ordners mit seiner theme.xml, meist unter app/design/frontend. Änderungen an anderen Dateien bestehen die Validierung nicht und werden nie ausgeliefert, und keine Korrektur installiert eine Extension oder fügt ein Skript hinzu, das Ihre Seiten im Browser der Besucherinnen und Besucher umschreibt.

Templates und Styles, die Ihr Theme nicht überschreibt, stammen aus seinem Parent-Theme, etwa Luma oder Blank, oder aus den Modulen von Magento. Die Rezepte kopieren diese Dateien nicht in Ihr Theme: Kommt ein Fehler aus einer Datei, die Ihr Theme nicht überschreibt, nimmt das Rezept keine Änderung vor, und der Befund bleibt einem Menschen überlassen. Inhalte und Einstellungen, die Sie im Magento-Adminbereich pflegen, etwa CMS-Seiten und -⁠Blöcke, Page-Builder-Inhalte, das Locale einer Store View oder die HTML-Head-Einstellungen, sind keine Dateien des Themes, deshalb ändern die Korrekturen sie nicht. Eingebundene Dienste von Drittanbietern wie Zahlungs- oder Chat-Widgets sind in einem Projekt nicht enthalten.

Details: die Ordner, wie eine Änderung aussieht, und wo die Rezepte ihre Styles hinzufügen

Validiscan ändert nur die Dateien des Frontend-Themes Ihres Magento-2-Shops, des Ordners, der seine theme.xml enthält, meist unter app/design/frontend: die .phtml- und .html-Templates, das Layout-XML, die LESS-Quellen und kompilierten Stylesheets unter web/css, die Skripte unter web/js und die deutsche Übersetzungsdatei in i18n. Eine Änderung an jeder anderen Datei, etwa am eigenen Code von Magento, an einer Extension oder an Build-Ausgaben, besteht die Validierung nicht, und eine Änderung, die die Validierung nicht besteht, kann nicht freigegeben werden und wird deshalb nie ausgeliefert.

Jede Änderung ist eine gewöhnliche Bearbeitung einer Theme-Datei, die Ihr Entwicklungsteam Zeile für Zeile lesen kann. Neue Style-Regeln, die eine Korrektur hinzufügt, stehen in einem Block am Ende des Stylesheets, zwischen Kommentaren, die das Rezept nennen, zum Beispiel /* validiscan:focus-visible-styles */. Kleinere Änderungen, etwa ein korrigierter Farbwert oder ein entferntes outline: none, werden dort vorgenommen, wo der Code schon steht. Worte, die eine Korrektur einem .phtml-Template hinzufügt, laufen durch die Übersetzungsfunktion __() von Magento und werden wie der eigene Text des Themes maskiert; in HTML-Dateien, die im Theme unter Magento_Cms/content liegen, verwenden die Rezepte stattdessen die Direktive trans von Magento. Magento verwaltet CMS-Seiten und -⁠Blöcke im Magento-Adminbereich, deshalb gelangt eine Änderung an einer dieser Dateien nur dort in Ihren Shop, wo Ihr Projekt die Datei in seine CMS-Seiten oder -⁠Blöcke lädt. Keine Korrektur installiert eine Extension oder fügt ein Skript hinzu, das Ihre Seiten im Browser der Besucherinnen und Besucher umschreibt, wie es ein Overlay tut.

Die Rezepte für den Fokusrahmen, die Touch-Ziele, den Skip-Link und neue Schaltflächen fügen ihre Style-Regeln am Ende des Haupt-Stylesheets des Themes hinzu: seiner _extend.less oder _theme.less unter web/css/source, mit einer neuen _extend.less, wo ein auf Luma oder Blank aufgebautes Theme keine von beiden hat, und außerdem in einer kompilierten web/css/styles-m.css, wo das Theme eine mitbringt. Bei einem Theme, das nicht auf Luma oder Blank aufbaut und dort weder LESS-Quellen noch diese kompilierte Datei hat, nehmen die Rezepte für den Fokusrahmen, die Touch-Ziele und die Schaltflächen keine Änderung vor, und das Rezept für den Skip-Link fügt den Link ohne Styles hinzu.

Wie erhält Validiscan Zugriff auf Ihr Magento-Theme?

Über ein GitHub-Repository oder als ZIP des Theme-Ordners, das im Kundenportal hochgeladen wird, denn Validiscan bereitet jede Korrektur an einer Kopie des Quellcodes Ihres Magento-Themes vor. Welcher Weg passt, hängt davon ab, wo der Code liegt: Ein Repository erhält einen Pull Request, ein ZIP ein Patch-Paket.

Die zwei Wege in ein Magento-Theme
Weg Was Sie geben Die Änderungen kommen zurück als
Über Ihr GitHub-Repository Zugriff auf das Repository, das das Theme allein oder Ihr gesamtes Magento-Projekt enthalten kann, über die GitHub App von Validiscan oder ein Zugriffstoken Ein Pull Request
Aus einem ZIP des Theme-Ordners Ihren Theme-Ordner unter app/design/frontend als eine ZIP-Datei von bis zu 100 MB, im Kundenportal hochgeladen von einem Admin Ihrer Organisation Ein Patch-Paket

Über Ihr GitHub-Repository

Liegt der Code Ihres Themes in einem GitHub-Repository, geben Sie Validiscan Zugriff auf dieses Repository. Sie installieren die GitHub App von Validiscan darauf oder geben Validiscan ein Zugriffstoken dafür. Die Einrichtung von Validiscan legt die Berechtigungen der App fest: Lese- und Schreibzugriff auf die Inhalte und die Pull Requests des Repositorys, Lesezugriff auf seine Metadaten und sonst nichts.

Das Repository kann das Theme allein oder Ihr gesamtes Magento-Projekt enthalten. Die Rezepte finden das Theme anhand seiner theme.xml in app/design/frontend/<Vendor>/<theme> oder, in einem Repository, das nur das Theme enthält, auf oberster Ebene neben seiner registration.php. Enthält das Repository mehrere Frontend-Themes, arbeitet ein Rezept an dem Theme, in dem das fehlerhafte Element gefunden wurde, und ändert nichts, wenn es nicht feststellen kann, welches Theme das ist. Ein Theme, das an anderer Stelle in einem Projekt liegt, etwa als Composer-Paket unter vendor, liegt außerhalb der Pfade, die eine Korrektur ändern darf. Die Änderungen kommen als Pull Request.

Aus einem ZIP des Theme-Ordners

Ohne GitHub-Repository erstellt Ihr Entwicklungsteam ein ZIP des Themes. Das Kundenportal gibt diese Anleitung: „Bitten Sie Ihr Entwicklungsteam um ein ZIP Ihres Theme-Ordners unter app/design/frontend.“ Ein Admin Ihrer Organisation lädt die Datei anschließend im Kundenportal hoch, als eine einzige ZIP-Datei von bis zu 100 MB. Validiscan bereitet die Änderungen auf dieser Kopie Ihres Themes vor und schickt sie als Patch-Paket zurück.

Ohne einen der beiden Wege hat Validiscan keinen Code, den es ändern könnte, und es wird keine Korrektur vorbereitet.

Wie gelangen die Änderungen in Ihren Shop?

Auf Magento kommen die Änderungen als Pull Request oder als Patch-Paket, und Ihr Entwicklungsteam entscheidet, wann sie live gehen. Validiscan liefert nur Änderungen aus, die es geprüft und freigegeben hat, und ändert Ihren Live-Shop nicht; die Auslieferung als unveröffentlichte Kopie des Themes über die Theme-Bibliothek von Shopify gibt es nur für Shopify.

Von der Auslieferung bis in Ihren Live-Shop, in fünf Schritten
  1. Validiscan liefert die Änderungen aus, die es geprüft und freigegeben hat: einen Pull Request auf einem neuen Branch oder ein Patch-Paket für Ihr Entwicklungsteam.
  2. Ihr Entwicklungsteam prüft die Änderungen. Bei einem Pull Request bittet die Checkliste um eine Vorschau- oder Staging-Umgebung, nicht den Live-Shop, und um eine Prüfung der betroffenen Seiten, auch allein mit der Tastatur.
  3. Ihr Entwicklungsteam führt den Pull Request zusammen oder spielt das Patch-Paket ein.
  4. Ihr Entwicklungsteam kompiliert die Stylesheets und stellt das Theme bereit: Die LESS-Änderungen werden wirksam, sobald die statischen Dateien des Themes bereitgestellt sind.
  5. Sobald die Änderungen live sind, prüft ein Verifizierungsscan die betroffenen Seiten erneut.

Ein Pull Request

Mit Zugriff auf Ihr Repository legt Validiscan einen neuen Branch mit dem Namen validiscan/a11y-<date>-<id> an, committet jede Korrektur einzeln und öffnet einen Pull Request mit einer Übersichtstabelle, einer Erklärung jeder Änderung und einer Checkliste für die Prüfung. In Ihren Standard-Branch wird nichts übertragen. Die Checkliste bittet Ihr Entwicklungsteam, den Branch in einer Vorschau- oder Staging-Umgebung bereitzustellen, nicht im Live-Shop, und die betroffenen Seiten dort vor dem Zusammenführen zu prüfen, auch allein mit der Tastatur.

Ein Patch-Paket

Aus dem hochgeladenen ZIP bereitet Validiscan ein ZIP-Archiv vor und schickt es Ihrem Entwicklungsteam. Es enthält die PATCH.md mit jeder Änderung und der Anleitung, wie sie eingespielt wird, alle Änderungen in einer Patch-Datei, die sich mit git apply einspielen lässt, eine Patch-Datei je Korrektur, die vollständigen geänderten Dateien und eine README.md. Ihr Entwicklungsteam spielt die Änderungen ein, testet sie und stellt das Theme bereit. Was ein Pull Request und ein Patch-Paket enthalten

Die Styles kompilieren

Ein Theme auf Basis von Luma oder Blank legt seine Styles als LESS-Quellen ab, und Magento kompiliert sie zu dem CSS, das es ausliefert. Das Werkzeug von Magento für die Bereitstellung statischer Dateien, bin/magento setup:static-content:deploy, kompiliert die LESS-Dateien und veröffentlicht das Ergebnis, wie die Dokumentation von Adobe zur CSS- und LESS-Vorverarbeitung es beschreibt. Die LESS-Änderungen werden daher wirksam, sobald Ihr Entwicklungsteam die statischen Dateien des geänderten Themes bereitstellt. Bringt das Theme zusätzlich eine kompilierte web/css/styles-m.css mit, liefert Magento diese Datei unverändert aus; die Rezepte nehmen deshalb dieselbe Änderung auch dort vor, damit beide Dateien im Gleichschritt bleiben. Wohin Korrekturen in einem Magento-Theme gehören und was ein Theme-Update rückgängig machen kann

Was ändern die Rezepte in einem Magento-Theme?

Jedes der 20 Rezepte von Validiscan für Magento-Themes ist eine deterministische Änderung für eine Art von Fehler: Derselbe Code erhält immer dieselbe Änderung. Ein Rezept ändert nur dort etwas, wo der Code des Themes zeigt, welche Änderung die richtige ist; wo er es nicht zeigt, ändert es nichts.

Seitenstruktur und Navigation

  • Seitensprache aus dem Locale Ihres Stores html-lang Gibt die Überschreibung des Root-Templates in Ihrem Theme ein eigenes lang oder keines aus, gibt sie wieder die eigenen Attribute von Magento aus, sodass jede Seite ein gültiges lang erhält.

    Magento legt die Sprache einer Seite anhand des Locales ihrer Store View fest, etwa en für das Locale en_US, und gibt sie über sein Root-Template aus. Überschreibt Ihr Theme dieses Template und gibt ein eigenes lang aus, meist den Locale-Code en_US, der kein gültiges Sprach-Tag ist, oder gar kein lang, gibt das Template wieder die eigenen Attribute von Magento aus, sodass jede Seite ein gültiges lang erhält. Ein lang, das im Layout-XML in der Locale-Form gesetzt ist, etwa de_DE, wird zu de-DE. Eine Seite, deren Inhalt in einer anderen Sprache verfasst ist als ihre Store View, etwa eine deutsche Rechtsseite in einem englischen Store, bleibt Ihnen überlassen: Liefern Sie sie aus einer Store View in dieser Sprache aus, oder zeichnen Sie die Sprache im Inhalt selbst aus.

    Abgedeckte Regeln
    • html-has-lang AUTO geprüft durch vs-lang
    • html-lang-valid AUTO geprüft durch vs-lang
    • vs-lang AUTO
    Geänderte Dateitypen
    .phtml
    fixes the vs-lang finding in root.phtml and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <html lang="<?= $block->escapeHtmlAttr($htmlLocale) ?>">
    18 Hinzugefügt <html <?= /* @noEscape */ $htmlAttributes ?>>
    19 19 <head <?= /* @noEscape */ $headAttributes ?>>
    20 20 <?= /* @noEscape */ $requireJs ?>
    21 21 <?= /* @noEscape */ $headContent ?>
  • Ein Titel auf jeder Seite document-title-template Leere Titel, die Ihr Theme im Layout-XML setzt, werden entfernt, sodass der eigene Titel von Magento wieder gilt.

    Magento gibt jeder Seite einen eigenen Titel, etwa den Namen des Produkts oder der Kategorie oder „Search results for:“ und den Suchbegriff, mit dem Präfix oder Suffix, das für Ihren Store festgelegt ist. Ein Theme kann ihn mit einem leeren <title> im Layout-XML überschreiben, und die Seite hat dann keinen Titel. Das Rezept entfernt solche leeren Titel, sodass der eigene Titel von Magento wieder gilt. Titel mit Text sind Ihr Wortlaut und bleiben, wie sie sind. Leert keine Layout-Datei des Themes den Titel, ändert das Rezept nichts: Der Titel kommt dann von der Seite selbst und aus den HTML-Head-Einstellungen im Magento-Adminbereich.

    Abgedeckte Regeln
    • document-title AUTO
    Geänderte Dateitypen
    .xml
    removes the blank search results title and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml Änderungen an app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml: 0 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml: 0 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <title> </title>
    8 7 </head>
    9 8 <body>
    10 9 <referenceBlock name="search_result_list" template="Magento_Catalog::product/list.phtml"/>
  • Überschriften ohne übersprungene Ebenen heading-levels Eine Überschrift, die eine Ebene überspringt, rückt mit den folgenden Überschriften ihres Templates auf, sofern sich die Ebene davor ablesen lässt; ein mit display: none ausgeblendeter Seitentitel wird stattdessen nur visuell ausgeblendet.

    Eine Überschrift, die eine Ebene überspringt, etwa ein h4 direkt nach einem h2, rückt zur nächsten Ebene auf, und die Überschriften, die ihr im selben Template auf ihrer Ebene oder tiefer folgen, rücken mit. Klassen bleiben erhalten, sodass Styles, die das Theme über Klassen setzt, weiter gelten; Styles, die das Theme über das Tag der Überschrift setzt, prüft Ihr Entwicklungsteam. Lässt sich die Ebene der vorangehenden Überschrift weder aus dem Scan noch aus demselben Template ablesen, bleibt die Überschrift einem Menschen überlassen. Magento gibt den Titel jeder Seite als h1 aus. Ein Theme, das den Titel auf einer Seite mit display: none ausblendet, entfernt das einzige h1 der Seite; das Rezept blendet ihn deshalb stattdessen nur visuell aus, so wie die eigenen Styles von Magento Text ausblenden, und das h1 bleibt in der Gliederung, die Screenreader verwenden. Ein Titel, der im Layout-XML entfernt wurde, bleibt einem Menschen überlassen, weil ihn wiederherzustellen das Aussehen der Seite verändern würde.

    Abgedeckte Regeln
    • heading-order AUTO geprüft durch vs-headings-landmarks
    • page-has-heading-one AUTO geprüft durch vs-headings-landmarks
    • vs-headings-landmarks AUTO
    Geänderte Dateitypen
    .css.html.less
    keeps the hidden home page title as the h1 and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 6 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 6 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt display: none;
    1096 Hinzugefügt position: absolute;
    1097 Hinzugefügt width: 1px;
    1098 Hinzugefügt height: 1px;
    1099 Hinzugefügt overflow: hidden;
    1100 Hinzugefügt clip: rect(0 0 0 0);
    1101 Hinzugefügt 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 Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 6 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 6 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1070 1070 }
    1071 1071
    1072 1072 .cms-index-index .page-title-wrapper {
    1073 Entfernt display: none;
    1073 Hinzugefügt position: absolute;
    1074 Hinzugefügt width: 1px;
    1075 Hinzugefügt height: 1px;
    1076 Hinzugefügt overflow: hidden;
    1077 Hinzugefügt clip: rect(0 0 0 0);
    1078 Hinzugefügt white-space: nowrap;
    1074 1079 }
    1075 1080
    1076 1081 .block-promo .info,
    moves the journal headings from h4 to h3 and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 3 hinzugefügt, 3 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 3 hinzugefügt, 3 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <h4 class="journal-title">Layering for wet autumn days</h4>
    155 Hinzugefügt <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 Entfernt <h4 class="journal-title">Caring for technical shells</h4>
    160 Hinzugefügt <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 Entfernt <h4 class="journal-title">Running through the dark season</h4>
    165 Hinzugefügt <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>

Tastaturbedienung und Fokus

  • Ein sichtbarer Fokusrahmen focus-visible-styles Ein Fokusrahmen für die Tastaturbedienung in der Markenfarbe des Themes, angepasst auf einen Kontrast von mindestens 3:1 gegenüber dem Seitenhintergrund.

    Das Stylesheet des Themes erhält einen Fokusrahmen für die Tastaturbedienung: 2 Pixel breit, durchgezogen und 2 Pixel vom Element entfernt, in der Markenfarbe des Themes. Die Farbe stammt aus einer Variablen für die Marken- oder Primärfarbe, sonst von der primären Schaltfläche, sonst von der Linkfarbe und wird angepasst, bis sie gegenüber dem Seitenhintergrund einen Kontrast von mindestens 3:1 hat. Flächen mit eigenem Hintergrund, etwa eine dunkle Kopfleiste, erhalten eine Farbe für den Fokusrahmen, die dort diesen Kontrast hat. Regeln des Themes, die den Fokusrahmen von Links, Schaltflächen und anderen Bedienelementen beim Fokussieren entfernen, werden herausgenommen, außer sie zeigen den Fokus auf andere Weise, etwa durch einen Rand oder einen Schatten.

    Abgedeckte Regeln
    • vs-focus-visible AUTO
    Geänderte Dateitypen
    .css.less
    adds the outline, removes the outline: none rule and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 10 hinzugefügt, 12 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 10 hinzugefügt, 12 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1079 1079 color: #fff;
    1080 1080 }
    1081 1081
    1082 Entfernt // VALIDISCAN-SEEDED vs-focus-visible: the theme removes the focus ring from links and actions.
    1083 Entfernt .navigation a:focus,
    1084 Entfernt .header.links a:focus,
    1085 Entfernt .product-item-link:focus,
    1086 Entfernt .footer a:focus,
    1087 Entfernt .action:focus,
    1088 Entfernt .logo:focus,
    1089 Entfernt .block-promo:focus,
    1090 Entfernt .journal-link:focus {
    1091 Entfernt outline: none;
    1092 Entfernt }
    1093 Entfernt
    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 Hinzugefügt
    1256 Hinzugefügt /* validiscan:focus-visible-styles */
    1257 Hinzugefügt :focus-visible {
    1258 Hinzugefügt outline: 2px solid #1979c3;
    1259 Hinzugefügt outline-offset: 2px;
    1260 Hinzugefügt }
    1261 Hinzugefügt .panel.wrapper :focus-visible {
    1262 Hinzugefügt outline-color: #a1d0f3;
    1263 Hinzugefügt }
    1264 Hinzugefügt /* /validiscan:focus-visible-styles */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 10 hinzugefügt, 11 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 10 hinzugefügt, 11 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1058 1058 color: #fff;
    1059 1059 }
    1060 1060
    1061 Entfernt .navigation a:focus,
    1062 Entfernt .header.links a:focus,
    1063 Entfernt .product-item-link:focus,
    1064 Entfernt .footer a:focus,
    1065 Entfernt .action:focus,
    1066 Entfernt .logo:focus,
    1067 Entfernt .block-promo:focus,
    1068 Entfernt .journal-link:focus {
    1069 Entfernt outline: none;
    1070 Entfernt }
    1071 Entfernt
    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 Hinzugefügt
    1225 Hinzugefügt /* validiscan:focus-visible-styles */
    1226 Hinzugefügt :focus-visible {
    1227 Hinzugefügt outline: 2px solid #1979c3;
    1228 Hinzugefügt outline-offset: 2px;
    1229 Hinzugefügt }
    1230 Hinzugefügt .panel.wrapper :focus-visible {
    1231 Hinzugefügt outline-color: #a1d0f3;
    1232 Hinzugefügt }
    1233 Hinzugefügt /* /validiscan:focus-visible-styles */
  • Eine Tab-Reihenfolge, die der Seite folgt remove-positive-tabindex Trägt ein gemeldetes Element einen tabindex größer als 0, wird jeder feste positive tabindex in den Templates des Themes entfernt oder auf 0 gesetzt.

    Ein tabindex größer als 0 zieht ein Element an den Anfang der Tastaturreihenfolge. Solche Werte wirken nur relativ zueinander auf der ganzen Seite; sobald sich zeigt, dass ein gemeldetes Element in den Templates des Themes einen trägt, entfernt das Rezept jeden festen positiven tabindex in den Templates des Themes, auch bei Elementen, die der Befund nicht aufgeführt hat. Links, Schaltflächen und Formularfelder verlieren das Attribut; andere Elemente erhalten tabindex="0", sodass sie erreichbar bleiben, während die Tab-Taste der Reihenfolge der Seite folgt. Ein tabindex, den PHP-Code berechnet, bleibt einem Menschen überlassen. Die Prüfung vs-focus-order von Validiscan meldet auch einen Fokus, der aus anderen Gründen auf der Seite umherspringt, etwa weil Styles Inhalt an eine andere Stelle setzen; sie hat die Stufe MANUAL, sodass ihre Befunde mit einer Anleitung kommen, nicht mit dieser Änderung.

    Abgedeckte Regeln
    • tabindex AUTO
    • vs-focus-order MANUAL
    Geänderte Dateitypen
    .phtml
    removes tabindex 1-4 from the login form and the CAPTCHA and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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 Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 3 hinzugefügt, 3 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 3 hinzugefügt, 3 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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 Entfernt <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 Hinzugefügt <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 Entfernt <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 Hinzugefügt <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 und Touch-Ziele

  • Zoomen auf dem Smartphone erlaubt meta-viewport-zoom user-scalable=no und jedes maximum-scale unter 2 verschwinden aus dem Viewport-Tag des Themes, sodass Besucherinnen und Besucher die Seite auf dem Smartphone zoomen können; ein Wert, den PHP-Code berechnet, wird für Ihr Entwicklungsteam aufgeführt.

    Das Rezept entfernt user-scalable=no und jedes maximum-scale unter 2 aus dem Viewport-Tag im Layout-XML des Themes, etwa in der default_head_blocks.xml, wo Luma es deklariert, oder in seinen Templates, sodass Besucherinnen und Besucher die Seite auf dem Smartphone zoomen können. Bei der Regel zur guten Praxis meta-viewport-large liegt die Grenze bei 5. Die übrigen Viewport-Einstellungen bleiben, wie sie waren. Ein Viewport-Wert, den PHP-Code berechnet, wird für Ihr Entwicklungsteam zur Prüfung aufgeführt. Stammt das Tag, das den Zoom sperrt, nicht aus dem Theme, etwa aus den HTML-Head-Einstellungen im Magento-Adminbereich oder aus einem Modul, ändert das Rezept nichts.

    Abgedeckte Regeln
    • meta-viewport AUTO
    • meta-viewport-large AUTO
    Geänderte Dateitypen
    .xml
    removes the zoom block from default_head_blocks.xml and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"/>
    6 Hinzugefügt <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)"/>
  • Größere Touch-Ziele target-size-padding Schaltflächen und Links, die der Scan als zu klein gefunden hat, erhalten eine Mindestgröße von 24 × 24 Pixel, über Klassen, die das Stylesheet des Themes ansprechen kann.

    Schaltflächen und Links, die der Scan als zu klein gefunden hat, etwa Social-Media-Icons oder Mengenschaltflächen, erhalten in einem Block am Ende des Stylesheets des Themes eine Mindestgröße von 24 × 24 Pixel. Der Block verwendet die Selektoren wieder, mit denen das Theme sie klein gemacht hat, oder ihre eigenen Klassen, und setzt eine Mindestbreite und -⁠höhe, die sich gegen eine kleinere Breite oder Höhe durchsetzt. Die Icons darin und das Layout darum herum bleiben, wie sie sind. Ein Link oder ein anderes Inline-Element ohne display-Regel wird zu inline-flex, weil Inline-Elemente eine Mindestgröße ignorieren. Ein Bedienelement ohne eine Klasse, die das Stylesheet ansprechen kann, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • vs-target-size AUTO
    Geänderte Dateitypen
    .css.less
    sizes the three flagged controls and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1264 1264 height: 18px;
    1265 1265 stroke-width: 3;
    1266 1266 }
    1267 Hinzugefügt
    1268 Hinzugefügt /* validiscan:target-size-padding */
    1269 Hinzugefügt .social-link,
    1270 Hinzugefügt .actions-secondary .action,
    1271 Hinzugefügt .qty-step {
    1272 Hinzugefügt min-width: 24px;
    1273 Hinzugefügt min-height: 24px;
    1274 Hinzugefügt }
    1275 Hinzugefügt /* /validiscan:target-size-padding */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1232 1232 height: 18px;
    1233 1233 stroke-width: 3;
    1234 1234 }
    1235 Hinzugefügt
    1236 Hinzugefügt /* validiscan:target-size-padding */
    1237 Hinzugefügt .social-link,
    1238 Hinzugefügt .actions-secondary .action,
    1239 Hinzugefügt .qty-step {
    1240 Hinzugefügt min-width: 24px;
    1241 Hinzugefügt min-height: 24px;
    1242 Hinzugefügt }
    1243 Hinzugefügt /* /validiscan:target-size-padding */

Bewegung, Slideshows und Ton

  • Weniger Bewegung auf Wunsch der Besucherinnen und Besucher reduced-motion-guard Ist das Gerät auf reduzierte Bewegung eingestellt, werden die Animationen, die Übergänge von 5 Sekunden oder mehr und das sanfte Scrollen ausgeschaltet, die die Stylesheets des Themes starten.

    Ist das Gerät von Besucherinnen und Besuchern auf reduzierte Bewegung eingestellt, schaltet ein Block am Ende jedes Stylesheets des Themes die Animationen, die Übergänge von 5 Sekunden oder mehr und das sanfte Scrollen aus, die dieses Stylesheet startet, Selektor für Selektor. Starten die eigenen Skripte des Themes in web/js einen Slider mit eingeschaltetem automatischem Abspielen, startet der Slider für diese Besucherinnen und Besucher ohne automatisches Abspielen. Eine Regel, die in einer anderen LESS-Regel verschachtelt ist, wird für Ihr Entwicklungsteam aufgeführt. Animationen aus dem eigenen Code von Magento oder aus Extensions stehen nicht in den Dateien des Themes und brauchen ihre eigene Absicherung.

    Abgedeckte Regeln
    • vs-motion AUTO
    Geänderte Dateitypen
    .css.less
    guards the badge and slider animations and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1264 1264 height: 18px;
    1265 1265 stroke-width: 3;
    1266 1266 }
    1267 Hinzugefügt
    1268 Hinzugefügt /* validiscan:reduced-motion-guard */
    1269 Hinzugefügt @media (prefers-reduced-motion: reduce) {
    1270 Hinzugefügt .product-label,
    1271 Hinzugefügt .slick-track {
    1272 Hinzugefügt animation: none;
    1273 Hinzugefügt }
    1274 Hinzugefügt }
    1275 Hinzugefügt /* /validiscan:reduced-motion-guard */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1232 1232 height: 18px;
    1233 1233 stroke-width: 3;
    1234 1234 }
    1235 Hinzugefügt
    1236 Hinzugefügt /* validiscan:reduced-motion-guard */
    1237 Hinzugefügt @media (prefers-reduced-motion: reduce) {
    1238 Hinzugefügt .product-label,
    1239 Hinzugefügt .slick-track {
    1240 Hinzugefügt animation: none;
    1241 Hinzugefügt }
    1242 Hinzugefügt }
    1243 Hinzugefügt /* /validiscan:reduced-motion-guard */
  • Slideshows, die sich nur auf Wunsch der Besucherinnen und Besucher bewegen slider-pause-control Auf Magento keine Pause-Schaltfläche: Bei den Page-Builder-Slidern in den Dateien des Themes wird das automatische Abspielen ausgeschaltet, sodass sie nur wechseln, wenn Besucherinnen und Besucher die Punkte oder Pfeile benutzen.

    Auf Magento fügt dieses Rezept keine Pause-Schaltfläche hinzu. Der Page-Builder-Slider läuft mit den eigenen Skripten von Magento, und ein Theme kann ihm keine Pause-Schaltfläche geben, ohne den Code von Magento zu überschreiben. Das Rezept nutzt stattdessen die eigene Einstellung des Sliders: Bei jedem Page-Builder-Slider mit automatischem Abspielen in den Dateien des Themes wird das automatische Abspielen ausgeschaltet, wie es der Schalter „Autoplay“ im Page Builder tut, und Pfeile werden eingeschaltet, wo der Slider sonst keine Möglichkeit hätte, zwischen Slides zu wechseln. Endlose CSS-Animationen, die einen Slider von selbst bewegen, werden entfernt. Die Slides wechseln dann nur, wenn Besucherinnen und Besucher die Punkte oder Pfeile benutzen: Nichts bewegt sich von selbst, also gibt es nichts anzuhalten. Ein Slider, der in der Magento-Datenbank gespeichert ist, ist keine Datei des Themes: Sein automatisches Abspielen schalten Sie mit der Einstellung „Autoplay“ im Page Builder aus. Ein Slider, den die eigenen Skripte des Themes mit automatischem Abspielen starten, etwa ein Slick- oder Swiper-Slider, braucht eine Pause-Schaltfläche, die in dieses Skript eingebaut wird; das bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • vs-carousel AUTO
    Geänderte Dateitypen
    .css.html.less
    turns off the Page Builder autoplay and the track animation, and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    3 3 class="pagebuilder-slider slick-slider"
    4 4 data-content-type="slider"
    5 5 data-appearance="default"
    6 Entfernt data-autoplay="true"
    6 Hinzugefügt 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 Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 0 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 0 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1176 1176 .slick-track {
    1177 1177 display: flex;
    1178 1178 width: 300%;
    1179 Entfernt 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 Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 0 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 0 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1147 1147 .slick-track {
    1148 1148 display: flex;
    1149 1149 width: 300%;
    1150 Entfernt animation: nw-slider-autoplay 9s ease-in-out infinite;
    1151 1150 }
    1152 1151 .slick-slide {
    1153 1152 flex: 0 0 33.3333%;
  • Kein Ton, der von selbst startet mute-autoplay Ein Video in den Templates des Themes, das von selbst abspielt, wird stummgeschaltet, und Audio startet nicht mehr von selbst, außer PHP-Code schaltet das automatische Abspielen ein; auf Magento wird das Rezept für Befunde von vs-media nicht verwendet.

    Ein Video in den Templates des Themes, das von selbst abspielt, erhält muted und playsinline, sodass es stumm und auf dem Smartphone innerhalb der Seite weiterläuft. Audio startet nicht mehr von selbst. Eingebettete YouTube- und Vimeo-Player, die von selbst starten, werden so eingestellt, dass sie stumm starten. Automatisches Abspielen, das PHP-Code einschaltet, bleibt einem Menschen überlassen. In einem Scan meldet die Medienprüfung vs-media von Validiscan Ton, der von selbst startet; sie tritt an die Stelle der axe-core-Regel, die dieses Rezept abdeckt. vs-media, die auch Untertitel und Transkripte abdeckt, hat die Stufe MANUAL, sodass ein solcher Befund auf Magento mit einer Anleitung kommt statt mit dieser Änderung.

    Abgedeckte Regeln
    • no-autoplay-audio AUTO geprüft durch vs-media
    Geänderte Dateitypen
    .phtml
    mutes the autoplaying product video and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <video class="product-video-player" autoplay loop controls preload="none" width="560" height="315" poster="<?= $escaper->escapeUrl($product->getData('care_video_poster')) ?>">
    47 Hinzugefügt <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>

Formulare, Warenkorb und eingebettete Inhalte

  • Beschriftungen, die mit ihren Feldern verbunden sind label-association Ein Beschriftungstext, der schon vor einem Feld auf der Seite steht, wird mit ihm verbunden, als <label> oder über aria-labelledby.

    Ein Formularfeld, dessen Beschriftung schon auf der Seite steht, vor dem Feld, wird mit diesem Text verbunden. Ein <label> ohne for erhält ein for, das auf das Feld zeigt. Ein Beschriftungstext in einem <span> oder <strong>, etwa ein Text „Sort By“ mit der Klasse sorter-label von Luma neben dem Sortiermenü einer Kategorieseite, wird zu einem <label> mit denselben Klassen. Ein Beschriftungstext in einem Blockelement, etwa <div class="label">, behält sein Tag und wird über aria-labelledby verbunden. Der Text muss in einem Container ohne ein weiteres Feld stehen, damit er nicht zu einem anderen gehören kann. Screenreader lesen die Beschriftung dann vor, wenn das Feld den Fokus erhält. Ein Feld, das nur einen Platzhalter hat, bleibt einem Menschen überlassen, weil eine Beschriftung zu schreiben eine Inhaltsentscheidung ist.

    Abgedeckte Regeln
    • label AUTO geprüft durch vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    Geänderte Dateitypen
    .phtml
    turns the "Sort By" text into the sorter label and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <span class="sorter-label"><?= $escaper->escapeHtml(__('Sort By')) ?></span>
    15 Hinzugefügt <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>
  • Konto-, Adress- und Kontaktfelder, die Browser ausfüllen können autocomplete-tokens Felder in den Templates des Themes, die nach den eigenen Daten der Kundinnen und Kunden fragen, in Adress-, Konto-, Anmelde-, Kontakt- und Newsletter-Formularen, erhalten den autocomplete-Wert für das, wonach sie fragen, außer der Code eines Templates schreibt ihn.

    Felder in den Templates des Themes, die nach den eigenen Daten der Kundinnen und Kunden fragen, in Adress-, Konto-, Anmelde-, Kontakt- und Newsletter-Formularen, erhalten den autocomplete-Wert für das, wonach sie fragen, etwa E-Mail-Adresse, Name, Telefonnummer, Straßenadresse, Postleitzahl oder Passwort. Der Wert wird aus Typ, Name, ID, Beschriftung, Platzhalter und Titel des Felds abgeleitet, nach denselben Regeln wie die Formularprüfung von Validiscan, und Felder für die Rechnungs- und die Versandadresse erhalten ihren Abschnitt, wie in shipping given-name. Sobald ein Feld eines Formulars gemeldet wird, wird jedes Feld dieses Formulars bearbeitet. Passwörter erhalten new-password in Formularen zur Registrierung und zum Zurücksetzen des Passworts und in Formularen mit mehr als einem Passwortfeld und sonst current-password. Felder für Gutschein, Suche, Geschenkempfänger, Kommentar, Menge und CAPTCHA erhalten nie einen Wert. Ein Wert, den der Code eines Templates schreibt, oder ein gültiger Wert, der für das Feld falsch aussieht, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • autocomplete-valid AUTO geprüft durch vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    Geänderte Dateitypen
    .phtml
    adds tokens to the newsletter, login and contact forms and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 3 hinzugefügt, 3 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 3 hinzugefügt, 3 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <div class="control"><input name="name" id="name" title="<?= $escaper->escapeHtmlAttr(__('Name')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserName()) ?>" class="input-text" type="text"></div>
    24 Hinzugefügt <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 Entfernt <div class="control"><input name="email" id="email" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserEmail()) ?>" class="input-text" type="email"></div>
    28 Hinzugefügt <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 Entfernt <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 Hinzugefügt <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 Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 2 hinzugefügt, 2 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 2 hinzugefügt, 2 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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 Entfernt <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 Hinzugefügt <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 Änderungen an app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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">
  • Änderungen bei Preis, Bestand und Warenkorb werden angesagt live-region-cart-variant Die Container in den Templates des Themes, die die Skripte von Magento neu schreiben, etwa die Preisbox und der Zähler des Mini-Warenkorbs, werden zu Live-Regionen; die Skripte selbst werden nicht geändert.

    Die eigenen Skripte von Magento schreiben den Text in festen Containern neu, wenn Kundinnen und Kunden eine Größe oder Farbe wählen oder ein Produkt in den Warenkorb legen. Das Rezept macht diese Container in den Templates des Themes zu Live-Regionen, sodass Screenreader den neuen Wert vorlesen, ohne dass die Kundinnen und Kunden dorthin wechseln müssen. Die Preisbox und der Zähler des Mini-Warenkorbs werden bei einer Änderung vollständig vorgelesen; die Bestandsmeldung und die Seitenmeldungen, etwa der Hinweis, dass ein Produkt in den Warenkorb gelegt wurde, erhalten role="status". Die Skripte selbst werden nicht geändert. Markiert das Theme die ganze Seite als Live-Region, was Screenreader jede Änderung vorlesen lässt, wird das entfernt. Fügt das Skript einer Extension sie hinzu, während die Seite läuft, bleibt das einem Menschen überlassen.

    Abgedeckte Regeln
    • vs-live-updates AUTO
    Geänderte Dateitypen
    .phtml
    makes the price box and the stock message live regions and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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 Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    11 11 ?>
    12 12 <div class="product-info-stock-sku">
    13 13 <?php if ($block->displayProductStockStatus()): ?>
    14 Entfernt <div class="stock available" title="<?= $escaper->escapeHtmlAttr(__('Availability')) ?>"><span><?= $escaper->escapeHtml(__('In stock')) ?></span></div>
    14 Hinzugefügt <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>
  • Titel für eingebettete Karten und Videos iframe-title Ein eingebetteter Frame ohne Titel erhält einen übersetzbaren Titel, der sagt, was er zeigt, sofern der Code es verrät.

    Ein eingebetteter Frame ohne Titel, etwa eine Karte, ein YouTube- oder Vimeo-Video, ein Kalender, ein Formular oder ein Bewertungs-Widget, erhält einen übersetzbaren Titel, der sagt, was er zeigt. Das Rezept liest aus der Adresse des Frames, einschließlich der festen Teile einer Adresse, die PHP-Code zusammensetzt, sowie aus seinen Klassen, seiner ID und seinem Namen, was der Frame zeigt. Ein Frame, dessen Inhalt der Code nicht verrät, erhält vom Rezept keinen Titel und bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • frame-title AUTO
    Geänderte Dateitypen
    .phtml
    titles the store map on the contact page and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <iframe src="<?= $escaper->escapeUrl($block->getBaseUrl() . 'media/wysiwyg/store-map.html') ?>" width="480" height="260" loading="lazy"></iframe>
    51 Hinzugefügt <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>

Kontrast, Bilder und Bedienelemente, die eine Einschätzung verlangen

Textkontrast, Textalternativen für Bilder und Namen für unbenannte Bedienelemente verlangen meist eine Einschätzung: welche Farbe zu Ihrer Marke passt, welche Worte ein Bild beschreiben. Die Regeln, die sie melden, haben die Stufe ASSISTED, wie die Listen unten zeigen. Für einen Befund einer ASSISTED-Regel entwirft KI nur dann eine Änderung, wenn Sie KI-Entwürfen zugestimmt haben, und Validiscan prüft jede Änderung, bevor sie ausgeliefert wird.

Die vier Rezepte unten sind für keine Regel die Standardkorrektur. Jedes erfasst nur die engen Fälle, in denen allein der Code des Themes belegt, wie die Änderung aussehen muss. In einem Projekt wird button-semantics auf Befunde der Slideshow-Prüfung vs-carousel angewendet, die AUTO ist: Die Korrektur-Engine probiert es aus, wenn das Rezept für Slider oben einen solchen Befund nicht behebt. Auf Magento decken die anderen drei nur Regeln der Stufe ASSISTED ab: Ein Befund dieser Regeln geht den Weg ASSISTED, und diese drei Rezepte werden darauf nicht angewendet.

  • Textfarben mit ausreichendem Kontrast contrast-tokens Eine Textfarbe, die die Kontrastprüfung nicht besteht und an genau einer Stelle definiert ist, wechselt zur nächsten Farbe desselben Farbtons, die auf jedem gemessenen Hintergrund besteht; in einem Projekt nicht angewendet.

    Besteht Text die Kontrastprüfung nicht und ist seine Farbe an genau einer Stelle im Theme definiert, wird diese Stelle auf die nächste Farbe desselben Farbtons geändert, die gegenüber jedem Hintergrund, den der Scan dafür gemessen hat, den erforderlichen Kontrast erreicht. Eine Stelle kann eine LESS-Variable oder CSS-Variable sein, die nur für die Textfarbe verwendet wird, oder eine einzelne color-Regel. Liefert das Theme eine kompilierte styles-m.css mit, erhält sie dieselbe Änderung. Eine Farbe, die an mehreren Stellen verwendet wird, auch als Hintergrund oder Rand, oder in Regeln, deren Hintergrund der Scan nicht gemessen hat, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • color-contrast ASSISTED
    Geänderte Dateitypen
    .css.less
    darkens the single #929292 token and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1099 1099 // VALIDISCAN-SEEDED color-contrast: #929292 on white is 3.1:1.
    1100 1100 .block-promo .info,
    1101 1101 .toolbar-amount {
    1102 Entfernt color: #929292;
    1102 Hinzugefügt 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 Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1075 1075
    1076 1076 .block-promo .info,
    1077 1077 .toolbar-amount {
    1078 Entfernt color: #929292;
    1078 Hinzugefügt color: #767676;
    1079 1079 }
    1080 1080
    1081 1081 .block-promo-wrapper {
  • Dekorative Bilder, vor Screenreadern verborgen decorative-image-alt Nur Bilder, bei denen das Template belegt, dass sie dekorativ sind, erhalten ein leeres alt oder aria-hidden; in einem Projekt nicht angewendet.

    Ein Bild wird nur dann als dekorativ markiert, wenn das Template belegt, dass es nichts beiträgt: Es steht in einem Link oder einer Schaltfläche, die schon einen Text oder einen Namen hat, etwa eine Aktionskachel mit eigener Überschrift; es ist ein Icon, höchstens 48 Pixel groß oder mit einer Icon-Klasse oder einem Icon-Dateinamen, neben seiner eigenen Textbeschriftung; oder es ist ein Abstandshalter oder Trenner. Ein <img> erhält dann ein leeres alt, und ein SVG-Icon erhält aria-hidden="true", sodass Screenreader es überspringen, statt einen Dateinamen vorzulesen. Jedes andere Bild gilt als Inhalt, und seine Textalternative braucht Worte, die ein Mensch wählt.

    Abgedeckte Regeln
    • image-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    Geänderte Dateitypen
    .html
    marks the promo tile image decorative and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <img src="/magento/media/wysiwyg/home/home-main.svg" width="400" height="240" />
    114 Hinzugefügt <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"
  • Bedienelemente nur für die Maus, als Schaltflächen umgesetzt button-semantics Anklickbare <div>- und <span>-Elemente in Slidern und Cookie-Bannern werden zu echten Schaltflächen, sofern der Code sie als Bedienelemente ausweist; in einem Projekt wird das Rezept auf Befunde von vs-carousel angewendet.

    Anklickbare <div>- und <span>-Elemente in Slidern und Cookie-Bannern werden zu echten Schaltflächen. Das Rezept zählt ein Element nur dann als Bedienelement, wenn der Code es so ausweist: Es hat role="button", einen Klick-Handler oder ein Click-Binding von Knockout oder eine Klasse oder ein Data-Attribut, das das Skript des Themes anspricht, um Klicks zu verarbeiten. Klassen, Data-Attribute und ARIA-Attribute bleiben erhalten, sodass die Styles und Skripte des Themes das Bedienelement wie bisher finden, und die Eingabetaste und die Leertaste bewirken nun, was ein Klick bewirkt. Ein kleines Style-Reset am Ende des Stylesheets des Themes bewahrt sein Aussehen, auch bei Hover und Fokus, und Fokusrahmen werden nicht angetastet. Ein Bedienelement, das Blöcke, Links oder Felder enthält oder keine Klasse hat, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Geänderte Dateitypen
    .css.less.phtml
    turns span controls of the cookie bar into buttons and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml: 2 hinzugefügt, 2 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml: 2 hinzugefügt, 2 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Entfernt <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 Hinzugefügt <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 Hinzugefügt <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 Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 30 hinzugefügt, 0 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 30 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1264 1264 height: 18px;
    1265 1265 stroke-width: 3;
    1266 1266 }
    1267 Hinzugefügt
    1268 Hinzugefügt /* validiscan:button-semantics */
    1269 Hinzugefügt button.amgdprcookie-button.-allow,
    1270 Hinzugefügt button.amgdprcookie-button.-decline {
    1271 Hinzugefügt -webkit-appearance: none;
    1272 Hinzugefügt appearance: none;
    1273 Hinzugefügt margin: 0;
    1274 Hinzugefügt padding: 0;
    1275 Hinzugefügt box-shadow: none;
    1276 Hinzugefügt font: inherit;
    1277 Hinzugefügt letter-spacing: inherit;
    1278 Hinzugefügt text-align: inherit;
    1279 Hinzugefügt text-transform: inherit;
    1280 Hinzugefügt text-shadow: none;
    1281 Hinzugefügt }
    1282 Hinzugefügt button.amgdprcookie-button.-allow:hover,
    1283 Hinzugefügt button.amgdprcookie-button.-allow:focus,
    1284 Hinzugefügt button.amgdprcookie-button.-allow:active {
    1285 Hinzugefügt background: @nw-primary;
    1286 Hinzugefügt border: 0;
    1287 Hinzugefügt color: #fff;
    1288 Hinzugefügt }
    1289 Hinzugefügt button.amgdprcookie-button.-decline:hover,
    1290 Hinzugefügt button.amgdprcookie-button.-decline:focus,
    1291 Hinzugefügt button.amgdprcookie-button.-decline:active {
    1292 Hinzugefügt background: #fff;
    1293 Hinzugefügt border: 1px solid @nw-border;
    1294 Hinzugefügt color: @nw-text;
    1295 Hinzugefügt }
    1296 Hinzugefügt /* /validiscan:button-semantics */

    app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 30 hinzugefügt, 0 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 30 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    1232 1232 height: 18px;
    1233 1233 stroke-width: 3;
    1234 1234 }
    1235 Hinzugefügt
    1236 Hinzugefügt /* validiscan:button-semantics */
    1237 Hinzugefügt button.amgdprcookie-button.-allow,
    1238 Hinzugefügt button.amgdprcookie-button.-decline {
    1239 Hinzugefügt -webkit-appearance: none;
    1240 Hinzugefügt appearance: none;
    1241 Hinzugefügt margin: 0;
    1242 Hinzugefügt padding: 0;
    1243 Hinzugefügt box-shadow: none;
    1244 Hinzugefügt font: inherit;
    1245 Hinzugefügt letter-spacing: inherit;
    1246 Hinzugefügt text-align: inherit;
    1247 Hinzugefügt text-transform: inherit;
    1248 Hinzugefügt text-shadow: none;
    1249 Hinzugefügt }
    1250 Hinzugefügt button.amgdprcookie-button.-allow:hover,
    1251 Hinzugefügt button.amgdprcookie-button.-allow:focus,
    1252 Hinzugefügt button.amgdprcookie-button.-allow:active {
    1253 Hinzugefügt background: #1979c3;
    1254 Hinzugefügt border: 0;
    1255 Hinzugefügt color: #fff;
    1256 Hinzugefügt }
    1257 Hinzugefügt button.amgdprcookie-button.-decline:hover,
    1258 Hinzugefügt button.amgdprcookie-button.-decline:focus,
    1259 Hinzugefügt button.amgdprcookie-button.-decline:active {
    1260 Hinzugefügt background: #fff;
    1261 Hinzugefügt border: 1px solid #c2c2c2;
    1262 Hinzugefügt color: #333;
    1263 Hinzugefügt }
    1264 Hinzugefügt /* /validiscan:button-semantics */
  • Namen für Schaltflächen und Links, die nur ein Icon zeigen icon-accessible-name Schaltflächen und Links, die nur ein Icon zeigen und deren Zweck der Code verrät, erhalten ein aria-label im Wortlaut des Themes Luma von Magento, wo Luma einen hat; in einem Projekt nicht angewendet.

    Schaltflächen und Links, die nur ein Icon zeigen, etwa für Suche, Mini-Warenkorb, Konto, Wunschliste, Vergleich, Menü, Schließen, Zurück und Weiter sowie die Auswahl eines Cookie-Banners, erhalten ein aria-label, das sagt, was sie tun, im Wortlaut des Themes Luma von Magento, wo Luma einen hat, etwa „Search“, „My Cart“ oder „Allow Cookies“. Der Zweck wird aus den Klassen, der ID, den Data-Attributen und dem Linkziel des Bedienelements, aus seinem Icon und aus dem Formular oder Cookie-Banner darum herum abgelesen. Ein Bedienelement, dessen Zweck der Code nicht verrät, etwa ein Social-Media-Link, der in einer Schleife aus einer als Daten gespeicherten Adresse gebaut wird, oder ein Link, dessen einziger Inhalt ein Produktfoto ist, bleibt einem Menschen überlassen, weil sein Name von Ihren Inhalten abhängt.

    Abgedeckte Regeln
    • button-name ASSISTED
    • link-name ASSISTED
    • vs-cookie-banner ASSISTED
    Geänderte Dateitypen
    .phtml
    names the icon-only search button and validates Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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 Beispieldaten

    app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml: 1 hinzugefügt, 1 entfernt

    Änderungen an app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <a class="action showcart" href="<?= $escaper->escapeUrl($block->getShoppingCartUrl()) ?>" data-bind="scope: 'minicart_content'" aria-haspopup="true" aria-expanded="closed">
    16 Hinzugefügt <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>
Details: die Stufen, das Testtheme, die Prüfungen jeder Änderung und Text in den Sprachen Ihres Shops

Ein Rezept ist eine deterministische Änderung für eine Art von Fehler: Derselbe Code erhält immer dieselbe Änderung. Validiscan hat 20 Rezepte für Magento-Themes. Jedes ändert nur dort etwas, wo der Code des Themes zeigt, welche Änderung die richtige ist. Wo er es nicht zeigt, ändert das Rezept nichts. Es rät nicht.

Unter jedem Rezept finden Sie die Regeln, die es abdeckt, mit der Stufe jeder Regel im Regelkatalog von Validiscan für Magento. AUTO bedeutet, dass ein Rezept die Standardkorrektur der Regel ist. ASSISTED bedeutet, dass die Befunde der Regel meist eine Einschätzung verlangen. MANUAL bedeutet, dass die Regel die Entscheidung eines Menschen braucht und mit einer Anleitung kommt. In einem Projekt werden Rezepte auf Befunde von Regeln der Stufe AUTO angewendet. Führt ein Rezept zusätzlich eine Regel der Stufe ASSISTED oder MANUAL auf, geht ein Befund dieser Regel stattdessen den Weg ASSISTED oder MANUAL. Eine Regel, die durch eine andere Prüfung geprüft wird, läuft in einem Scan nicht für sich; die andere Prüfung meldet denselben Fehler.

Die Dateitypen und das Vorher und Nachher jedes Rezepts stammen aus den eigenen Tests von Validiscan. Sie laufen auf dem Magento-Testtheme von Validiscan, einem Child-Theme des Themes Luma von Magento, in das absichtlich Fehler der Barrierefreiheit eingebaut wurden. Magento lässt sich in der Testumgebung nicht rendern, deshalb rendert kein Test eine Seite: Jeder Test vergleicht die Änderung mit einem gespeicherten Diff und prüft den geänderten Quellcode, zum Beispiel, ob er der korrigierten Version des Testthemes entspricht. Die Dateien Ihres Themes sehen anders aus.

Bevor Validiscan eine Änderung prüft, werden die geänderten Dateien kontrolliert. Jeder Pfad muss, wie oben beschrieben, innerhalb des Themes liegen. .phtml-Templates durchlaufen die eigene Syntaxprüfung von PHP, die die Datei liest, ohne sie auszuführen. Layout-XML wird als XML geprüft, Stylesheets erhalten eine Strukturprüfung, und HTML-Templates und JavaScript werden mit einem Parser gelesen.

Fügt ein Rezept Worte hinzu, etwa den Text eines Skip-Links oder den Namen eines Navigationsbereichs, schreibt es sie auf Englisch, im Wortlaut des Themes Luma von Magento, wo Luma einen hat, etwa „Skip to Content“. Hat Ihr Theme in seinem Ordner i18n eine deutsche Übersetzungsdatei, fügt das Rezept den deutschen Text dort hinzu, sofern der String nicht schon übersetzt ist. Text für die anderen Sprachen Ihres Shops wird nicht hinzugefügt.

Was bleibt auf Magento MANUAL?

Fehler, die eine Entscheidung über Ihre Inhalte oder darüber verlangen, wie sich ein Teil der Seite verhält, die ein Rezept nicht trifft, etwa Untertitel und Transkripte für Ihre Videos und Audioinhalte, bleiben auf Magento MANUAL. Für einen Befund einer MANUAL-Regel gibt Validiscan eine Anleitung, keine Codeänderung.

Die unten aufgeführten Regeln werden in Scans ausgeführt und haben auf Magento die Stufe MANUAL; Regeln zur guten Praxis sind nicht aufgeführt.

  • meta-refresh Zeitverzögerte Aktualisierung unter 20 Stunden darf nicht verwendet werden
  • nested-interactive Interaktive Bedienelemente dürfen nicht verschachtelt sein
  • scrollable-region-focusable Scrollbare Bereiche müssen per Tastatur erreichbar sein
  • server-side-image-map Serverseitige Imagemaps dürfen nicht verwendet werden
  • vs-keyboard-trap Der Tastaturfokus darf nie festhängen
  • vs-focus-order Die Fokusreihenfolge muss der visuellen Reihenfolge folgen
  • vs-dragging Reine Ziehbewegungen brauchen eine Alternative per Tippen oder Klicken
  • vs-media Videos brauchen Untertitel, Audio braucht ein Transkript, und nichts darf automatisch mit Ton starten
  • vs-documents Verlinkte Dokumente brauchen eine manuelle Prüfung der Barrierefreiheit
Details: was ein Befund der Stufe MANUAL erhält, die Regel zur Tab-Reihenfolge und was ein Projekt nicht umfasst

Für einen Befund einer MANUAL-Regel gibt Validiscan eine Anleitung zur Behebung, keine Änderung an Ihrem Code. Diese Fehler verlangen eine Entscheidung über Ihre Inhalte oder darüber, wie sich ein Teil der Seite verhält, die ein Rezept nicht trifft: Untertitel und Transkripte für Ihre Videos und Audioinhalte, ein Ausweg aus einem Widget, das den Tastaturfokus festhält, eine zweite Möglichkeit, ein Bedienelement zu benutzen, das nur durch Ziehen funktioniert, eine Fokusreihenfolge, die zum Layout passt, eine Seite, die sich nach einer Verzögerung selbst neu lädt, oder die Barrierefreiheit verlinkter PDFs und anderer Dokumente. Eine erzwungene Tab-Reihenfolge durch einen tabindex größer als 0 meldet auch die axe-core-Regel tabindex, die das Rezept für die Tab-Reihenfolge weiter oben behebt.

Die Arbeit an Befunden der Stufe MANUAL, bei denen Sie selbst inhaltlich entscheiden müssen, ist nicht Teil eines Projekts, PDFs ebenso wenig. Was automatisierte Tests der Barrierefreiheit nachweisen können und was nicht

Was stellen Sie bereit?

Sie stellen bereit: Ihre schriftliche Einwilligung in einen vollständigen Scan, einen Weg in Ihr Theme, Ihre Antwort zu KI-Entwürfen für ASSISTED-Korrekturen, ein Entwicklungsteam, das die Änderungen prüft, die Stylesheets kompiliert und das Theme bereitstellt, einige Änderungen im Magento-Adminbereich, Übersetzungen des hinzugefügten Texts für weitere Sprachen und Ihre Entscheidungen darüber, was MANUAL bleibt.

  1. Ihre schriftliche Einwilligung in einen vollständigen Scan Ihres Shops. Ein vollständiger Scan legt ein Produkt in den Warenkorb und öffnet den ersten Schritt im Checkout, ohne einen Kauf abzuschließen oder Zahlungsdaten einzugeben.
  2. Einen Weg in Ihr Theme: den Zugriff auf das GitHub-Repository, in dem es liegt, oder ein ZIP des Theme-Ordners unter app/design/frontend, das im Kundenportal hochgeladen wird.
  3. Ihre Antwort darauf, ob KI Korrekturen der Stufe ASSISTED entwerfen darf. KI-Entwürfe sind ausgeschaltet, bis Sie zustimmen.
  4. Ein Entwicklungsteam, das die Änderungen prüft, den Pull Request zusammenführt oder das Patch-Paket einspielt, die Stylesheets kompiliert und das Theme bereitstellt.
  5. Die Änderungen im Magento-Adminbereich, die die Korrekturen nicht vornehmen: die Store View oder die Sprachauszeichnung für Inhalte, die in einer anderen Sprache verfasst sind als ihr Store, Seitentitel und HTML-Head-Einstellungen sowie das Ausschalten des automatischen Abspielens bei Page-Builder-Slidern, die in der Datenbank gespeichert sind.
  6. Übersetzungen des Texts, den Korrekturen hinzufügen, für die anderen Sprachen Ihres Shops. Die Rezepte schreiben Englisch und fügen Deutsch nur dort hinzu, wo Ihr Theme schon eine deutsche Übersetzungsdatei hat.
  7. Ihre Entscheidungen zu dem, was MANUAL bleibt, etwa Untertitel für Ihre Videos.
Details: wenn die Änderungen live sind, und was ein Projekt umfasst

Sobald die Änderungen live sind, prüft ein Verifizierungsscan die betroffenen Seiten erneut, und das Remediation Evidence Package hält das Ergebnis fest. Der Ablauf eines Projekts, Schritt für Schritt

Ein Projekt gilt für einen Shop: eine Domain und ein Theme. Eine Headless-Storefront, bei der die Seiten statt von einem Theme von einer eigenen Frontend-Anwendung erzeugt werden, ist auf Anfrage möglich.

Quellen

Eine Quelle, für diese Seite geprüft am 6. Oktober 2026.

Entwickler­dokumentation von Adobe Commerce 1
  1. CSS and LESS preprocessing · Adobe · geprüft am

Beginnen Sie mit einem kostenlosen Check Ihres Shops.

Senden Sie die Adresse Ihres Shops. Validiscan scannt ihn und antwortet mit jedem Fehler, den der Scan nachweisen kann, jeweils mit der Seite und dem Code.

Kostenlosen Check anfordern

Oder schreiben Sie an info@validiscan.com.

Was der kostenlose Check umfasst und was nicht
Sie senden
die Adresse Ihres Shops
Gescannte Seiten
bis zu 15
Sie erhalten
jeden Fehler, den der Scan nachweisen kann, mit Seite und Code
In Ihrem Shop
nur öffentliche Seiten; keine Anmeldung, nichts gekauft, kein Formular abgeschickt
Was er nicht ist
ein vollständiges Audit

Nachricht an Validiscan

Für einen kostenlosen Check nennen Sie die Adresse Ihres Shops und seine Plattform.

Validiscan verwendet, was Sie senden, um Ihnen zu antworten. Datenschutzerklärung