Hallo Leute,
ich wollte die Klasse oxorder um eine Methode erweitern die ich auf der Seite thankyou.tpl aufrufe. Der Aufruf sieht so aus:
[{$order->saveReferrer()}]
Und die Methode die ich in der Klasse oxorder spreiche sieht so aus.
[{ public function saveReferrer()
{
//Speichern nur wenn Session vorhanden
if( !empty( oxSession::getInstance()->getVar('ReferrerID') ) ) {
$oDb = oxDb::getDb();
$timestamp = date("Y-m-d");
$referrer = oxSession::getVar('ReferrerID');
$sSql = "INSERT INTO affiliate_referrer SET oxorderid = " .$this->oxorder__oxordernr->value. " , referrer = '" .$referrer . "' , timestamp = '" .$timestamp. "' ";
$oDb->execute( $sSql );
}
}}]
Lokal funktioniert auch alles, die Daten werden in die Tabelle gespeichert. Aber online gibt es ein Problem mit dem Sofortüberweisung Modul, da er auf die Methode nicht zugreifen kann. Das Modul ist leider auch verschlüsselt, sodass man selber nichts ändern kann. trosofortueberweisungoxorder->saveReferrer().
Er versucht aber auch auf die Methode oxSuperCfg->__call(‘saveReferrer’, Array).
Jetzt meine Idee, die Methode in die Klasse oxSuperCfg einzubinden. Ich weiß, es ist nicht schön, aber ich weiß nicht wie ich es anders machen kann. Aber wie kann ich von der Template Seite auf die Methode oxSuperCfg zugreifen?
Vielleicht kann mir ja jemand helfen. Oder vielleicht hat jemand von euch ja auch eine bessere und einfachere Idee, wie ich den Parameter in die Tabelle bekomme.
oxSuperCfg kannst du ganz easy aus einem Template aufrufen, denn eigentlich jeder Controller leitet im Endeffekt von oxSuperCfg ab. Das wird dein Problem jedoch nicht lösen.
Pack dein Modul in die Ableitungen ganz nach vorne, sodass deine Funktion vor der von Sofortüberweisung aufgerufen wird und rufe am Ende deiner Funktion parent::saveReferrer() auf.
Ansonsten könntest du deiner Funktion auch einfach einen anderen Namen geben. Dann stört auch kein anderes Modul.
trosofortueberweisungoxorder->saveReferrer() steht da nur weil SÜ das letzte Modul in der Kette ist und somit das Objekt diesen Typ erhält. Wenn deine Methode nicht gefunden wird, (“Method/Function not found”) dann liegt das daran dass dein Modul nicht korrekt installiert ist. Evtl. verwendest du Großbuchstaben im extends array, aber das ist nur geraten. Kann auch irgendeine andere Ursache haben. Schau erstmal auf die Seite “Module”, “installierte Module” ob oxorder evtl. mehrfach auftaucht und ob deine Erweiterung dort erscheint.
Vielen Dank für eure Antworten. Ich kenne mich mit der Oxid Modul-Entwicklung leider nicht aus, darum habe ich den Code wie oben geschrieben, direkt in das Shop Template “thankyou.tpl” geschrieben. Gibt es denn keine Möglichkeit wie ich die Methode aufrufen kann?
Also PHP Code direkt in ein Template zu schreiben geht so, wie du es da hast, nicht und man macht es auch nicht. Es gibt hier im Forum ja wirklich zahlreiche Threads, die die Modulentwicklung behandeln. Schau dich da doch einfach noch mal um, wie man ein Objekt um eine neue Funktion erweitert und dann kannst du diese auch im Template ausführen 
Ich habe jetzt ein Modul erstellt. Lokal funktioniert auch alles wieder wie es soll. Aber sobald ich es online stelle, wird die Seite payment weiß dargestelt. Der Error-Log von OXID ist aber leer.
Meine Klasse sieht so aus:
class referer_oxorder extends referer_oxorder_parent {
public function finalizeOrder( oxBasket $oBasket, $oUser, $blRecalculatingOrder = false ) {
$result = parent::finalizeOrder($oBasket, $oUser, $blRecalculatingOrder);
$this->_saveReferer();
}
public function _saveReferer() {
/*Speichern nur wenn Session vorhanden */
if( !empty( oxSession::getInstance()->getVar('ReferrerID') ) ) {
$oDb = oxDb::getDb();
$timestamp = date("Y-m-d");
$referrer = oxSession::getVar('ReferrerID');
$sSql = "INSERT INTO affiliate_referrer SET oxorderid = " .$this->oxorder__oxordernr->value. " , referrer = '" .$referrer . "' , timestamp = '" .$timestamp. "' ";
$oDb->execute( $sSql );
}
}
}
Wie genau kann ich denn die Reihenfolge der Module ändern?
Meine metadata.php sieht so aus:
$aModule = array(
‘id’ => ‘referer’,
‘title’ => ‘Referer - Speichert zu jeder Bestellung einen Referer’,
‘version’ => ‘1’,
‘extend’ => array(
‘oxorder’ => ‘referer/referer_oxorder’
)
);
Oder müsste ich noch irgendwie versuchen die oxviewconfig mit rein zu bringen?
So, ich konnte den Fehler zumindest eingrenzen. Wenn ich die Variablen oxSession::getVar(‘ReferrerID’) und oxSession::getInstance()->getVar(‘ReferrerID’) ) entferne, dann werden die Daten auch online gespeichert. Scheinbar gibt es da ein Problem das er auf die Werte nicht zugreifen kann. Kann mir jemand helfen wie man dieses Problem lösen kann?
ich greife jetzt direkt auf die Session Variable zu, jetzt klappt es. 