Hooks in PrestaShop 9: wie sie funktionieren, welche Sie nutzen sollten und wie Sie eigene erstellen
Hooks sind der saubere Weg, PrestaShop zu erweitern, ohne den Core anzufassen. Wir erklären die beiden Typen, wie man sie richtig registriert und die häufigsten stillen Fehler.
Ein Hook ist ein Einhängepunkt, den PrestaShop in seinem Code vorsieht, damit ein Modul Inhalte hinzufügen oder auf ein Ereignis reagieren kann, ohne den Core zu verändern. Er ist das Bauteil, das es möglich macht, dass ein Shop hundert Module hat und trotzdem aktualisierbar bleibt. Wenn Sie für PrestaShop entwickeln, erspart Ihnen ein gutes Verständnis der Hooks die Hälfte der Probleme.
Zwei Familien: display und action
- Anzeige-Hooks (
display*): Sie liefern HTML zurück, das an einer bestimmten Stelle der Seite ausgegeben wird. Zum BeispieldisplayProductAdditionalInfoauf der Produktseite oderdisplayFooterim Footer. - Aktions-Hooks (
action*): Sie geben nichts aus, sondern werden ausgeführt, wenn etwas passiert.actionValidateOrderbeim Anlegen einer Bestellung,actionObjectProductUpdateAfterbeim Speichern eines Produkts.
Außerdem gibt es Hooks, die Daten zurückgeben, die der Core zusammenführt, etwa paymentOptions, an den jedes Zahlungsmodul seine PaymentOption liefert.
Einen Hook richtig registrieren
Die Registrierung erfolgt bei der Installation des Moduls und wird in der Tabelle hook_module gespeichert:
public function install()
{
return parent::install()
&& $this->registerHook('displayProductAdditionalInfo')
&& $this->registerHook('actionValidateOrder');
}
public function hookDisplayProductAdditionalInfo(array $params)
{
$this->context->smarty->assign(['product' => $params['product']]);
return $this->fetch('module:' . $this->name . '/views/templates/hook/info.tpl');
}
Die Methode heißt hook + der Name des Hooks mit großem Anfangsbuchstaben. PrestaShop unterscheidet beim Hook-Namen nicht zwischen Groß- und Kleinschreibung, aber die PHP-Methode muss existieren.
install() nicht erneut ausgeführt wird. Das muss in einem Skript unter upgrade/ geschehen.Positionen und Ausnahmen
Wenn mehrere Module am selben Hook hängen, werden sie in der Reihenfolge der Spalte position ausgeführt. Das ändern Sie unter Design > Positionen, wo Sie für ein Modul auch einzelne Seiten ausschließen können. Wenn ein Block dort erscheint, wo er nicht hingehört, schauen Sie zuerst dort nach, bevor Sie Code anfassen.
Eigene Hooks erstellen
Ein Theme oder ein Modul kann einen Hook aufrufen, den es im Core nicht gibt: {hook h='displayMiTiendaCabecera'} in Smarty oder Hook::exec('displayMiTiendaCabecera') in PHP. Beim ersten Mal, wenn ein Modul ihn registriert, legt PrestaShop ihn in der Tabelle hook an. Das ist der sauberste Weg, in eigenen Entwicklungen Erweiterungspunkte anzubieten, und den nutzen wir zum Beispiel, damit jeder Abschnitt einer Startseite separat bearbeitet werden kann.
Warum ein Modul „nichts anzeigt“
- Das Modul ist installiert, aber nicht an diesem Hook registriert (siehe Positionen).
- Das Theme ruft diesen Hook nicht auf. Ein Hook aus Classic existiert in Hummingbird vielleicht nicht oder liegt in einem anderen Bereich.
- Es ist eine Seitenausnahme konfiguriert.
- Das Modul ist für diesen Shop deaktiviert: In PrestaShop hängt „aktiv“ von der Zeile in
module_shopab, nicht nur von der Spalteactive. - Das Template des Moduls ist im Theme überschrieben und diese Kopie ist leer oder veraltet.
Bewährte Praktiken
- Geben Sie in Anzeige-Hooks leere Strings zurück, wenn es nichts anzuzeigen gibt: keine leeren Container, die das Layout zerstören.
- Werfen Sie in Aktions-Hooks keine unkontrollierten Exceptions: Ein Fehler dort kann das Speichern einer Bestellung blockieren.
- Cachen Sie in Hooks, die auf allen Seiten ausgeführt werden (
displayHeader,displayTop): Sie vervielfachen sich mit jedem Besuch.
Gut eingesetzte Hooks sorgen dafür, dass ein Modul PrestaShop-Updates und Theme-Wechsel übersteht. Wenn Ihnen jemand für etwas, das mit einem Hook machbar ist, einen Override vorschlägt, seien Sie misstrauisch.