Funktionsparameter übergeben aus anderer Klasse

Ich habe das Problem, dass ich in core/oxarticle.php die Funktion getBasketPrice() um eine Parameter erweitern muss.


public function getBasketPrice( $dAmount, $aSelList, $oBasket ) //alt
public function getBasketPrice( $dAmount, $aSelList, $oBasket, $orderID = '' ) //neu

Wenn ich die Funktion mit dem zusätzlichen Parameter aus der Klasse oxarticle selbst aufrufe, wird dieser auch ordnungsgemäß übergeben. Wenn ich die Funktion, wie benötigt, aus oxbasket aufrufe, wird der zusätliche Parameter nicht mehr übergeben.

Hat jemand einen Lösungsansatz?

Gruß Fabian K.

Hallo Fabian,

zuerst einmal: Ich rate dir sehr davon ab, OXID-Dateien einfach zu verändern, da diese Änderungen bei einem Update rücksichtslos überschrieben werden und das zu ziemlichen Problemen führen könnte. Erstelle lieber ein neues Modul, welches oxArticle erweitert.

Zu deinem Problem: Es wäre hilfreich, wenn du noch ein bisschen mehr Code posten könntest. Wo rufst du die abgeänderte Funktion wie auf? Wir können sonst nur mutmaßen…

Freue mich auf deine Antwort :slight_smile:

Dass man das nicht sollte, ist mir klar. Wenn der Shop so läuft, wie es soll, schreiben wir alle Änderungen, die wir gemacht haben, in ein Modul.

Nun zu dem gewünschten Code :wink:

oxbasket.php


$oArticle = $oBasketItem->getArticle()

//Zum Test
$ordId = 'test';

//Aufruf aus oxbasket.php
$oBasketPrice = $oArticle->getBasketPrice( $oBasketItem->getAmount(), $oBasketItem->getSelList(), $this, $ordId );

oxarticle.php


 public function getBasketPrice( $dAmount, $aSelList, $oBasket, $ordID = '' )
 {
     $this->_orderID = $ordID;

[QUOTE=fabiank;121443]oxbasket.php


$oArticle = $oBasketItem->getArticle()

//Zum Test
$ordId = 'test';

//Aufruf aus oxbasket.php
$oBasketPrice = $oArticle->getBasketPrice( $oBasketItem->getAmount(), $oBasketItem->getSelList(), $this, $ordId );

[/QUOTE]

Hallo Fabian,

mir ist aufgefallen, dass du in der ersten Zeile am Ende ein Semikolon vergessen hast. Ich denke mal, dass das nur ein C&P-Fehler war und das Semikolon bei dir vorhanden ist. :wink:

Ich habe das ganze mal eben bei mir nachgestellt:
In /application/models/oxarticle.php Zeile 1952 um den Parameter “$sOrderId = ‘’” erweitert und diesen per var_dump() ausgegeben.
In /application/models/oxbasket.php Zeile 797 haben ich mal folgendes gemacht:

$oBasketPrice = $oArticle->getBasketPrice( $oBasketItem->getAmount(), $oBasketItem->getSelList(), $this, 'test' );

Funktioniert bei mir einwandfrei… Hast du dich vielleicht irgendwo vertippt?

Genau, dass Semikolon ist beim Copy&Paste verloren gegangen, im Code jedoch vorhanden.

Der Var-Dump


public function getBasketPrice( $dAmount, $aSelList, $oBasket, $ordID = 'test' )
{
    var_dump($ordID);

liefert jedoch immer nur den Vorgabewert zurück, der bei eigentlich nur kommen soll, wenn der Parameter nicht mit übergeben wurde. Also in diesem Fall:


string(4) 'test'

Gruß Fabian K.

//Zum Test 
$ordId = 'test'; 

Da kommt auch “test”.

Ist mir gar nicht aufgefallen, dass es ein schlechtes Beispiel war :wink:
Aber ich habe es auch mit anderen Vorgabewerten gemacht, und es wurde immer dieser angezeigt.

[QUOTE=fabiank;121553]Ist mir gar nicht aufgefallen, dass es ein schlechtes Beispiel war :wink:
Aber ich habe es auch mit anderen Vorgabewerten gemacht, und es wurde immer dieser angezeigt.[/QUOTE]

Dann übergibst du den Parameter aber auch gar nicht, denn wenn dessen auch nur NULL wäre, würdest du nicht mehr “test” zurück bekommen. Check lieber nochmal genau wo du den Parameter wirklich übergibst…

//Zum Test 
$ordId = 'xy'; 

//Check mit var_dump ob das tatsächlich von hier aufgerufen wird
var_dump ( $ordId );

//Aufruf aus oxbasket.php 
$oBasketPrice = $oArticle->getBasketPrice( $oBasketItem->getAmount(), $oBasketItem->getSelList(), $this, $ordId ); 

Und immer Cookies löschen und neue Teile in den Warenkorb legen wenn oxbasket geändert wird.

Ich glaube du solltest so langsam einen Break machen. In der Zeit hier hättest du jetzt schon 10 Module definieren können, die die Funktion getBasketPrice() erweitern :wink:

Probier es doch einfach mals als Modul, dann sollte es doch klappen :slight_smile: Außerdem hast du hinterher dann auch nicht die Arbeit, deine Änderungen aus den Core-Klassen zusammen zu kratzen. :rolleyes:

So, habe das Problem jetzt gelöst :slight_smile:
Habe es als Modul gemacht, hat dann jedoch immernoch nicht funktioniert.
Der Fehler lag darin, dass ich die Funktion getBasketPrice() in oxarticle überschrieben habe. Jedoch wurde getBasketPrice() in oxorderarticle ausgeführt, welche wiederum getBasketPrice() in oxarticle aufruft. Somit ist klar, wieso der Parameter nicht übergeben wurde.

Trotzdem danke für die Hilfe :slight_smile: