Projekt

Allgemein

Profil

Extender-Klassen

An verschiedenen Stellen im Shop werden Objekte vom Typ "ExtenderComponent" erzeugt. Diesen Objekten werden Daten übergeben, die für den jeweiligen Kontext relevant sind, z.B. wird nach Abschluss einer Bestellung in der checkout_success.php einem ExtenderComponent-Objekt die gerade erzeugte orders_id übergeben oder nach einem erfolgtem Userlogin die ermittelte customers_id.

Diese Extender können mit Hilfe des ClassOverloadings (siehe Teil 1 ClassOverloading) erweitert werden, so dass sich beliebige Plugins schreiben lassen, die etwa nach jeder ausgeführten Bestellung die aktuelle orders_id übergeben bekommen und ausgeführt werden.

Beispiel eines Extenders in der checkout_success.php:

$coo_checkout_success_extender_component = MainFactory::create_object('CheckoutSuccessExtenderComponent');
$coo_checkout_success_extender_component->set_event_data('orders_id', $last_order);
$coo_checkout_success_extender_component->proceed();
$t_dispatcher_result_array = $coo_checkout_success_extender_component->get_response();

Dem Extender wird über die set_event_data()-Methode die aktuelle orders_id übergeben. Im Anschluss wird die proceed()-Methode aufgerufen und danach mit get_response() ein Array mit möglichen Rückgabenwerten abgerufen und dem Ausgabe-Template zur Verfügung gestellt.

Beispiel eines Plugins für die checkout_success.php:

Im Verzeichnis system/overloads/CheckoutSuccessExtenderComponent befindet sich die Definition einer Klasse TSWidgetCheckoutSuccessExtender, die die proceed-Methode des Extenders überladen soll, um einen order-spezifischen HTML-Code für die Ausgabe zu erzeugen:

class TSWidgetCheckoutSuccessExtender extends TSWidgetCheckoutSuccessExtender_parent
{
    function proceed()
    {
        $obj_widget = MainFactory::create_object('GMTSWidget', array($_SESSION['languages_id']));
        $this->v_output_buffer['TS_RATING'] = $obj_widget->get_rating_link(
            $this->v_event_data_array['orders_id'],
            'GM_TRUSTED_SHOPS_WIDGET_SHOW_CHECKOUT'
        );
        parent::proceed();
    }
}

Innerhalb der Klasse sind die zuvor per set_event_data() übergebenen Inhalte über das Array $this->v_event_data_array erreichbar. In diesem Beispiel wird die übergebene orders_id genutzt, um sich von einem weiteren Objekt ($obj_widget) ein Stück HTML-Code erzeugen zu lassen, welches wiederum in den Output-Buffer des Extenders geschrieben wird:

$this->v_output_buffer['TS_RATING'] = 'abc 123';

Zu beachten ist, dass der Output-Buffer ein assoziatives Array ist, in das jedes Plugin in einen eigenen Index (hier 'TS_RATING') mit aussagekräftiger Bezeichnung schreiben sollte, um Kollisionen mit den Ausgaben anderer Plugins zu vermeiden.

Weiter muss am Ende oder Anfang der proceed()-Methode des Plugins unbedingt die proceed()-Methode der parent-Instanz aufgerufen werden, damit die Ausführungskette ggf. mehrerer installerter Plugins nicht zu unterbrechen.

Das Ergebnis dieses Plugins ist nun, dass in der Template-Datei "checkout_success.html" die Smarty-Variable {$TS_RATING} samt Inhalt zur Verfügung steht.

Wie ihr updatesichere Anpassungen an Template-Dateien vornehmen könnt, erfahrt ihr in Teil 3 Usermods in Templates.

Weitere Stellen, in denen ExtenderComponent-Objekte aufgerufen werden, sind in der Liste aller Extender beschrieben.

Eigene Overload-Klassen sollten unbedingt im dafür vorgesehenen Verzeichnis user_classes/overloads platziert werden, da der Inhalt des system-Verzeichnisses im Rahmen von Updates überschrieben werden kann und somit Änderungen verlorengehen könnten.