Überall in xt:Commerce sind im System sogenannte Hookpunkte ("Einhängepunkte"), die Plugins erlauben, beliebigen php-Code an dieser Stelle in die Funktion bzw. Datei einzubinden.
Ein Hookpunkt in einer Klasse:
Code Block |
---|
language | php |
---|
title | /xtFramework/classes/class.product.php |
---|
|
($plugin_code = $xtPlugin->PluginCode('class.product.php:_getPrice_center')) ? eval($plugin_code) : false; |
Ein Hookpunkt im Template:
Code Block |
---|
language | xml |
---|
title | /templates/xt_grid/xtCore/pages/account.html |
---|
|
{hook key=account_tpl_module_data_bottom} |
Beispiel xt_countryprices:
Das Plugin xt_countryprices zeigt den Preis in Abhängigkeit zum Herkunftsland des Kunden an, d.h. es lassen sich für die verschiedenen Länder verschiedene Produktpreise einstellen.
Es ist also erforderlich, die Funktion _getPrice() in der Klasse class.products.php zu erweitern bzw. zu verändern. (In der Funktion wird der Preis eines Produkts abgefragt.)
D.h. in der Installations-Datei des Plugins wird ein Hookpunkt erstellt:
Code Block |
---|
language | xml |
---|
title | /plugins/xt_countryprices/installer/xt_countryprices.xml |
---|
|
<code>
<hook>class.product.php:_getPrice_center</hook>
<phpcode><![CDATA[
// hier der phpcode der im Hook class.product.php:_getPrice_center ausgeführt werden soll.
if (isset($_SESSION['customer']->customer_default_address['customers_country_code'])) {
global $db;
$record = $db->Execute("SELECT country_price FROM ".TABLE_PRODUCTS_PRICE_COUNTRY." WHERE products_id='".$this->data['products_id']."' and status='1' and country_code='".$_SESSION['customer']->customer_default_address['customers_country_code']."' LIMIT 0,1");
if($record->RecordCount() == 1){
$products_price = $record->fields['country_price'];
return $true;
}
}
]]></phpcode>
<order>1</order>
<active>1</active>
</code> |
Auszug aus der Funktion _getPrice():
Code Block |
---|
language | php |
---|
title | /xtFramework/classes/class.product.php |
---|
firstline | 260 |
---|
linenumbers | true |
---|
|
// ....
// Products Price
$products_price = $this->data['products_price'];
$format_type = 'default';
// Hookpunkt:
($plugin_code = $xtPlugin->PluginCode('class.product.php:_getPrice_center')) ? eval($plugin_code) : false;
if(isset($plugin_return_value))
return $plugin_return_value;
// special price ?
$special_price_otax = $this->data['flag_has_specials'] ? $this->getSpecialPrice():false;
if ($special_price_otax!=false) {
// .... |
Ist das Plugin installiert, führt der Shop den Code so aus:
Code Block |
---|
language | php |
---|
title | /xtFramework/classes/class.product.php |
---|
firstline | 260 |
---|
linenumbers | true |
---|
|
// ....
// Products Price
$products_price = $this->data['products_price'];
$format_type = 'default';
// Hookpunkt:
($plugin_code = $xtPlugin->PluginCode('class.product.php:_getPrice_center')) ? eval($plugin_code) : false;
// <!-- xt_countryprices start -->
if (isset($_SESSION['customer']->customer_default_address['customers_country_code'])) {
global $db;
$record = $db->Execute("SELECT country_price FROM ".TABLE_PRODUCTS_PRICE_COUNTRY." WHERE products_id='".$this->data['products_id']."' and status='1' and country_code='".$_SESSION['customer']->customer_default_address['customers_country_code']."' LIMIT 0,1");
if($record->RecordCount() == 1){
$products_price = $record->fields['country_price'];
return $true;
}
}
// <!-- xt_countryprices end -->
if(isset($plugin_return_value))
return $plugin_return_value;
// special price ?
$special_price_otax = $this->data['flag_has_specials'] ? $this->getSpecialPrice():false;
if ($special_price_otax!=false) {
// .... |
Anchor |
---|
| Hookpunkte-Hookpunkteinfiles |
---|
| Hookpunkte-Hookpunkteinfiles |
---|
|
Hookpunkte auslagern in Dateien
In der Praxis werden Hookpunkte von uns und auch in Reseller-Plugins oft in Dateien ausgelagert, d.h. dass lediglich ein include() oder require() auf eine Datei in diesen Hooks zu finden sind. Dieses Vorgehen hat zwei entscheidende Vorteile:
- Der Code innerhalb der Hooks kann einfach (und mit einem Editor/IDE) während der Laufzeit des Shops angepasst werden. ( Da der Code ansonsten in der Datenbank stehen würde funktioniert dieses normalerweise nur sehr umständlich.)
- Updates von Plugins gestalten sich einfacher, da die Dateien des Plugins einfach überschrieben werden können, sofern sich an der Datenbank-Struktur des Plugins ansonsten nichts ändert.
Beispiel aus xt_auto_cross_sell:
Code Block |
---|
language | xml |
---|
title | /plugins/xt_auto_cross_sell/installer/xt_auto_cross_sell.xml |
---|
|
<code>
<hook>store_main.php:bottom</hook>
<title>load class</title>
<phpcode><![CDATA[
require _SRV_WEBROOT.'plugins/xt_auto_cross_sell/hooks/store_main_php_bottom.php';
]]></phpcode>
<order>1</order>
<active>1</active>
</code> |
Code Block |
---|
language | xml |
---|
title | /plugins/xt_auto_cross_sell/hooks/store_main_php_bottom.php |
---|
|
<?php
defined('_VALID_CALL') or die('Direct Access is not allowed.');
require _SRV_WEBROOT.'plugins/xt_auto_cross_sell/classes/class.auto_cross_sell.php';
?> |