Bugfix: Magento Configurable Swatches
Seit der Version 1.9.1.0 ist das Magento RWD Theme um praktische Configurable Swatches erweitert: kleine Schalter, mit denen auf Produktseiten ohne umständliches Dropdown-Gehangel ganz einfach zwischen den unterschiedlichen Varianten und Attribut-Kombinationen hin- und hergeschaltet werden kann, wobei sich das angezeigte Produktbild entsprechend ändert. Normalerweise.
Das Problem: Keine Änderung des Produktbilds
Leider tritt hierbei in der Praxis immer wieder ein Fehler auf. Aber eben nur manchmal – und dann geht das Umschalten doch wieder? Wir haben den Bug hier mal eingefangen. Normalerweise ändert sich das Produktbild beim Wechseln der Farbe über die Swatches (wie oben). Es gibt aber Fälle, in denen sich (in unserem Beispiel) nach der Auswahl einer Größe beim Umschalten der Farbe das Produktbild unverändert bleibt.
Die Ursache: Unsauber kopierter Code
Warum funktioniert das manchmal nicht – und manchmal doch? Schaut man sich den Code dazu an, wird die Sache allmählich klar. Beim Betätigen der Swatches wird der Schnitt aus zwei Arrays, in unserem Beispiel den passenden Produkt-IDs für die Farbe und den Produkt-IDs für die Größe gebildet. Hier im Screenshot ist links die Methode arrayIntersect dargestellt, auf der rechten Seite sind die Listen a und b zu sehen:
Der Code für diese Methode stammt direkt von Stackoverflow und entspricht bis in den Kommentar in Zeile 39 dem Original. Allerdings findet sich dort zehn Zeilen weiter oben ein etwas ausführlicherer Kommentar, dessen Inhalt beim Kopieren der Methode für das Vergleichen der Arrays nicht beachtet wurde:
Die Listen müssen sortiert sein, bevor sie im Hinblick auf eine Schnittmenge miteinander verglichen werden. Das wurde im Code für die Configurable Swatches nicht beachtet. Und die zufällige Reihenfolge der Elemente der Listen führt im Frontend dazu, dass das Umschalten des Produktbilds mal funktioniert – und mal nicht.
Die Lösung: Produkt-IDs sortieren lassen
Wie so oft ist der eigentliche Fix dann schnell und einfach zu haben: Man muss vor jedem Aufruf von arrayIntersect sicherstellen, dass die Liste sortiert ist. Wir haben das so gelöst:
Hier gibt es den Patch als Gist bei GitHub.