Wie man das PrestaShop-Override-System nutzt, ohne den Kern zu beschädigen

Das PrestaShop-Override-System ermöglicht es Ihnen, das Kernverhalten anzupassen, ohne die Originaldateien zu verändern. Bei unachtsamer Anwendung entstehen jedoch instabile Shops, die bei Updates nicht mehr funktionieren. Dieser Leitfaden von Knowband erklärt die Funktionsweise von Overrides, wann sie sinnvoll sind und welche drei wichtigen Fallstricke jeder Entwickler kennen sollte.

Was ist das Override-System?

PrestaShop nutzt PHP-Vererbung, um Ihnen zu ermöglichen, Ihre eigene Version jeder Kernklasse einzubinden, ohne die Originale zu verändern. Jede Kernklasse trägt das Suffix „Core“, beispielsweise „ProductCore“. Wenn Sie die Datei `/override/classes/Product.php` mit einer Klasse namens „Product“ erstellen, die von „ProductCore“ erbt, lädt PrestaShop Ihre Version. Dasselbe gilt für Controller.

Überschreiben Sie nur die Methoden, die Sie ändern müssen, und kopieren Sie niemals eine ganze Klassendatei. Dadurch bleibt Ihr Code schlank und es treten deutlich seltener Konflikte mit zukünftigen Aktualisierungen auf.

Beispiel: So geben Sie den Namen des aktuellen Controllers in Ihrer Header-Vorlage an:

Wo Sie Ihre Überschreibungsdateien ablegen sollen

Überschreibungen können an zwei Orten gespeichert werden. Das globale Verzeichnis `/override/` im Stammverzeichnis Ihrer Installation ist sofort nach dem Leeren des Caches aktiv. Es empfiehlt sich jedoch, Überschreibungen in einem Modul zu bündeln.

Wenn eine Überschreibung innerhalb eines Moduls platziert wird (z. B. /modules/mymodule/override/classes/Product.php), kopiert PrestaShop diese bei der Installation nach /override/ und entfernt sie bei der Deinstallation vollständig. Dies ist die empfohlene Vorgehensweise.

Ein kurzes Beispiel für eine Klassenüberschreibung. Angenommen, Sie möchten den Namen des aktuellen Controllers in Ihrer Header-Vorlage verfügbar machen:

// /override/classes/controllers/FrontController.php

class FrontController extends FrontControllerCore {

    public function initHeader() {

        self::$smarty->assign('currentController', get_class($this));

        return parent::initHeader();

    }}

Rufen Sie immer die übergeordnete Methode auf, es sei denn, Sie haben einen triftigen Grund, dies nicht zu tun. Andernfalls wird die Kernfunktionalität unbemerkt beeinträchtigt.

Überschreiben von Modulklassen und Controllern

Seit PrestaShop 1.6 können Sie auch Modulklassen überschreiben. Hängen Sie dazu „Override“ an den Klassennamen an (z. B. BlockUserInfoOverride, abgeleitet von BlockUserInfo) und legen Sie die Datei unter /override/modules/ ab. Das gleiche Vorgehen gilt für Modul-Controller. Nach jeder Überschreibung müssen Sie den Cache leeren, insbesondere die Datei /cache/class_index.php löschen, da die Änderung sonst nicht wirksam wird.

Wann man Überschreibungen NICHT verwenden sollte

Überschreibungen sind exklusiv – es darf nur eine pro Klasse geben. Sie sind außerdem in Marktplatzmodulen verboten und sollten für Anpassungen im privaten Shop reserviert bleiben. Bevor Sie eine Überschreibung vornehmen, ziehen Sie eine der folgenden Alternativen in Betracht:

  • Haken: PrestaShop löst bei jedem Seitenaufruf Hook-Ereignisse aus – Sie können diese von einem Modul aus nutzen, um benutzerdefinierten Code auszuführen oder Inhalte auf die Seite zu übertragen, ohne sich auch nur in die Nähe einer Kernklasse begeben zu müssen.
  • Symfony-Service-Überschreibungen: Teile von PrestaShop, die auf Symfony migriert wurden, ermöglichen einen übersichtlicheren Umgang mit dem Service-Container. Anstatt die Klasse selbst zu verändern, können Sie einen Service anpassen oder ersetzen.
  • Benutzerdefiniertes Objektmodell: Müssen Sie einer Kernentität Felder hinzufügen? Erstellen Sie Ihr eigenes Objektmodell mit eigener Tabelle, anstatt das bestehende zu patchen.

Sicherheit der Überschreibungen durch Updates

PrestaShop-Updates können Methodensignaturen unbemerkt ändern, sodass Ihre überschriebenen Methoden auf veralteten Annahmen basieren. Überprüfen Sie daher jede überschriebene Methode nach jedem Update. Kommentieren Sie die Änderungen und deren Gründe, prüfen Sie das Änderungsprotokoll und halten Sie die Überschreibung so klein wie möglich. Eine schlanke, gut kommentierte Überschreibung, die die übergeordneten Methoden korrekt aufruft, übersteht Aktualisierungen problemlos. Eine vollständige Klassenkopie hingegen birgt ein Fehlerrisiko.

Der „Geister“-Cache: Warum Ihre Überschreibung unsichtbar erscheint

Der häufigste Grund, warum Entwickler glauben, ihre Überschreibung sei fehlerhaft: PrestaShop durchsucht /override/ nicht bei jeder Anfrage. Stattdessen wird eine Klassenzuordnung in /cache/class_index.php kompiliert. Solange diese Datei nicht gelöscht und neu generiert wird, ist Ihre Überschreibung unsichtbar, egal wie korrekt der Code ist. Das Leeren des Smarty-Caches reicht nicht aus. Löschen Sie class_index.php manuell per FTP/SSH, über „Erweiterte Parameter > Leistung“ im Backend oder über die Symfony-Konsole.

Abbildung 1: Der PrestaShop-Override-Systemablauf und die Rolle von /cache/class_index.php.

 

Die Symfony-Mauer: Legacy-Überschreibungen funktionieren nicht für moderne Controller

Dieses veraltete PHP-System funktioniert nur mit der älteren ObjectModel-Schicht von PrestaShop. Ab PS 1.7 wurden wichtige Bereiche des Backends, darunter die neuen Produktseiten und Bestellbildschirme, in Symfony neu geschrieben. Das PHP-Override-System hat keinen Einfluss auf diese Symfony-Controller. Für diese Zwecke verwenden Sie Service DekorationSie können einen Dienst über die services.yml-Datei Ihres Moduls einbinden oder ersetzen. Falls eine Überschreibung auch nach dem Löschen der class_index.php-Datei keine Wirkung zeigt, ist der Controller wahrscheinlich auf Symfony migriert.

Konfliktlösung: Wenn zwei Module denselben Kurs belegen wollen

Wenn zwei Module dieselbe Klasse überschreiben, gibt PrestaShop bei der zweiten Installation eine Fehlermeldung aus und deaktiviert die Überschreibung. Die Lösung ist manuell: Öffnen Sie beide Dateien, führen Sie alle Methoden in einer einzigen Datei im Verzeichnis `/override/` zusammen, die die Core-Klasse erweitert, und löschen Sie anschließend die Datei `class_index.php`. Fügen Sie Kommentare hinzu, die angeben, welches Modul welche Methode beigesteuert hat. Aus diesem Grund sind Überschreibungen in Marktplatzmodulen nicht zulässig; Konflikte werden so zum Problem des Händlers. Verwenden Sie für andere Anwendungen Hooks.

Abbildung 2: Wie Überschreibungskonflikte entstehen, wenn zwei Module auf dieselbe Klasse abzielen, und die manuelle Zusammenführungslösung.

Über Knowband

Knowband ist ein vertrauenswürdiger Anbieter von E-Commerce-Plugins und -Erweiterungen mit jahrelanger Erfahrung in der Unterstützung von Online-Händlern beim Aufbau schnellerer, intelligenterer und funktionsreicherer Shops. Egal, ob Sie Ihren Shop auf einer Webplattform betreiben. PrestaShop, OpenCartShopify, WooCommerce, MagentoOb Sie nun eine Anwendung auf einer beliebigen anderen großen Plattform verwenden oder nicht – Knowband bietet eine breite Palette an sofort einsatzbereiten Plugins und Erweiterungen, mit denen Sie die Funktionalität verbessern, die Leistung steigern und ein besseres Einkaufserlebnis bieten können, ohne dass Sie von Grund auf neu entwickeln müssen.