de_DEus

Theme Refactoring

Ein sehr häufiges Problem in 2014 war „Ich habe auf Magento 1.8 aktualisiert und jetzt funktioniert das (Login|Warenkorb)-Formular nicht mehr“. Der Grund war, dass seit Magento 1.8 der form key in mehr Formularen genutzt wird, als Security Feature (verhindert CSRF-Angriffe). Aber in jedem Theme, das eine eigene Version der jeweiligen Templates enthielt, fehlte der Form Key, so dass die serverseitige Validierung fehlschlug, leider ohne jede Fehlermeldung.

Natürlich gibt es Themes, deren Markup so verschieden vom Default Theme ist, dass die meisten Templates aus gutem Grund überschrieben wurden. Aber ich sehe mindestens genauso viele Themes, insbesondere Eigenentwicklungen, bei denen erst einmal alle Templates aus base/default kopiert und dann angepasst wurden. Für das Überschreiben von Layout-XML-Dateien gibt es fast keine Entschuldigung, das Layout kann man in allen erdenklichen Möglichkeiten mit einer Theme-spezifischen local.xml Datei anpassen.

Das obengenannte Problem ist ein gutes Beispiel für die Gründe des „Achte auf Updatefähigkeit“ Mantras. Die Fehler hätten vermieden werden können, wenn nur Dateien kopiert worden wären, die wirklich Anpassung benötigten.

In diesem Artikel möchte ich meinen Prozess zum Theme Refactoring darlegen (nur den strukturellen Teil, der HTML-Quelltext wird anschließend exakt gleich aussehen wie vorher, abgesehen von Änderungen durch neuere Versionen der Default-Templates). Ein sehr hilfreiches Werkzeug waren Kalen Jordan’s magerun-addons mit ihrem diff:theme Befehl. Ich habe ein paar Features hinzugefügt, um meinen Prozess besser zu unterstützen, aber sie sind bereits gemerged, also kann man sie mit der neuesten Version der Addons direkt nutzen:

  • Der --raw Parameter gibt nur die Dateinamen aus anstelle einer menschenlesbaren Tabelle, so dass sie an andere Befehle gepiped werden können
  • Der --filter Parameter ermöglicht das Filtern der Ergebnisse. Derzeit gibt es zwei Filter, only-equal und only-different
  • Der --ignore-copyright Parameter nimmt die „license“ und „copyright“ Zeilen vom Diff aus, so dass identische Dateien von verschiedenen Magento-Versionen als identisch gewertet werden

Um das Tool zu nutzen, benötigt man das Magento Kommandozeilen-Werkzeug n98-magerun mit den magerun-addons als Plugin (es gibt verschiedene Möglichkeiten der Installation). Die verlinkten Ressourcen enthalten ausreichend Dokumentation, also gehe ich hier nicht auf die Details ein und komme direkt zum Refaktorisieren:

Schritt 1. Exakte Kopien entfernen

Das kann mit dem Befehl zum Theme Vergleich der magerun-addons gemacht werden. Doch häufig ist das Theme eine Kopie von base/default oder default/modern einer älteren Magento Version, also benötigen wir die Originaldateien zum Vergleich.

Wie findet man heraus, auf welcher Version das Theme basiert? Ein Blick in den Copyright Hinweis in den Template Dateiköpfen hilft. Die folgende Tabelle zeigt, welche Versionen von Magento CE welchen Copyright Hinweis haben. Um Magento 1.4 von Magento 1.5 zu unterscheiden, muss man sich allerdings die tatsächlichen Diffs anschauen:

Version @copyright
Magento 1.9 Copyright (c) 2006-2014 X.commerce, Inc. (http://www.magento.com)
Magento 1.8 Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)
Magento 1.7 Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
Magento 1.6 Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
Magento 1.4.1-1.5 Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
Magento 1.4.0 Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
Magento 1.0-1.3 Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)

Nehmen wir nun an, unser Theme „legacy/default“ basiert auf dem modern theme von Magento 1.5, dann laden wir Magento 1.5 herunter und kopieren die Theme Dateien wie folgt:

  • magento15/default ←base/default
  • magento15/modern ← default/modern

anschließend führen wir folgenden Befehl aus:

Voilà, die Duplikate sind entfernt.

Schritt 2. Identische Modifikationen in default Theme überführen

Bei einem Shop mit mehreren ähnlichen Themes sollten identische Modifikationen in ein gemeinsames „default“ Theme übernommen werden. Wenn also unser „legacy“ Package zwei Themes „crap“ und „crapper“ hat, suchen wir wieder nach identischen Dateien, aber dieses Mal ohne sie direkt zu löschen:

Das liefert uns eine Liste von identischen Dateien, die nach „legacy/default“ verschoben werden sollten.

Step 3. XML Diff

Jetzt kommt der erste Teil, der echtes Nachdenken und Magento Detailwissen erfordert. Wir schauen uns die Änderungen an, die in den Layout-XML-Dateien gemacht wurden und versuchen, sie alle zu Anpassungen in die local.xml zu konvertieren. Dieser Befehl zeigt den Diff:

Zum Schluss sind idealerweise keine Dateien mehr in legacy/default/layout außer local.xml. Oder, in Magento CE 1.9 / EE 1.14 und höher, in legacy/default/etc/theme.xml, siehe diesen Blogbeitrag.

Ergebnis

Und so kann ein Commit einer erfolgreich refaktorisierten Theme-Struktur aussehen:

Das ist gut, wenn man bedenkt, dass der beste Code gar kein Code ist.

Fabian Schmengler

Fabian Schmengler ist Diplom-Informatiker und Magento Entwickler bei integer_net. Seine Schwerpunkte sind Backend-Entwicklung, Konzeptionierung und Test-Automatisierung. Seit 2011 ist er Magento Certified Developer, seit 2014 Magento Certified Solution Specialist.

Dieser Beitrag hat 3 Kommentare

Einen Kommentar hinterlassen