Mit Modul Artikelpreise im Warenkorb beeinflussen

Guten Abend,

ich sitze gefühlte Ewigkeiten vor meinem ersten eigenen Modul. Google und auch das Forum wurden durchsucht, sowie zwei Oxid-Bücher durchforstet… leider hat das nichts geholfen. Ich würde mich über Denkanstöße freuen. Es geht um folgendes:

Funktionalität: Ich möchte erreichen, dass der Preis eines Artikels, der in den Warenkorb gelegt wird, um den Betrag X erhöht oder reduziert wird, und dass der geänderte Artikelpreis auch im “kleinen” und großen Warenkorb sichtbar ist. Wenn die Anzahl des Artikels geändert wird, soll der geänderte Preis beibehalten werden. Dies soll nur für Artikel gelten, nicht für Rabatte oder Versandkosten.

Nun habe ich zwei Ansätze: Der erste ist, die Methode oxbasketitems->setPrice() zu überschreiben. Der zweite Ansatz ist, über oxbasket->_calcItemsPrice() zu gehen.

Was würdet ihr empfehlen? Oder gibt es einen besseren Ansatz?

Vielen vielen Dank!

Christian

oxbasketitems->setPrice() sollte funktionieren.

Vielen Dank Leofonic,

ich hab nun dies ausprobiert


class doublePriceInBasket extends doublePriceInBasket_parent{  

       /**
       * Sets $this->oPrice * 2
       *
       * @param object $oPrice price
       *
       * @return null
       *
       *
       */
      public function setPrice( $oPrice )
      {
          $this->_oPrice = oxNew( 'oxprice' );
          $this->_oPrice->setBruttoPriceMode();
          $this->_oPrice->setVat( $oPrice->getVAT() );

          $myArticle = $this->getArticle();
          $oPrice->setPrice( $oPrice->getNettoPrice() * 2 );
          
          $this->_oPrice->addPrice( $oPrice );
          $this->_oPrice->multiply( $this->getAmount() );

          $this->_oUnitPrice = oxNew( 'oxprice' );
          $this->_oUnitPrice->setBruttoPriceMode();
          $this->_oUnitPrice->setVat( $oPrice->getVAT() );
          $this->_oUnitPrice->addPrice( $oPrice );

          $this->_setDeprecatedValues();
      }     
}

jedoch wird dann folgende Exception geworfen:

Fatal error: oxSession::_validateBasket(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition “doublePriceInBasket” of the object you are trying to operate on was loaded before unserialize() gets called or provide a __autoload() function to load the class definition in C:\xampp\htdocs\hshop\core\oxsession.php on line 718

Ich habe versucht, den Fehler zu beheben, doch das ist noch ein wenig “zuviel” für mich.

Hat jemand einen Tipp für mich?

Grüße!

Cookies löschen, dann sollte der Fehler weg sein.

Hallo leofonic,

vielen Dank!!

Ich versuche nun, in diesem Modul an das Land des Users zu kommen und dies abzufragen (oxcountryid). Kannst Du mir sagen, wie ich das User-Objekt übergeben muss? Geht das überhaupt?

Konkret möchte ich, je nachdem aus welchem Land der User kommt, den Preis anpassen.

Wichtig: Das ist rein für mich, um mich ins System einzufinden.

:slight_smile:

An den angemeldeten User kommst du mit:


$oUser = $this->getUser();

(getUser ist in oxsupercfg.php von dem alle Klassen erben.)
Du kannst dir oxdeliverylist::_getList anschauen wie das dann genau eingesetzt werden kann. Das Land des Users ist allerdings erst verfügbar wenn sich der User eingeloggt hat.

Hallo leofonic,

vielen lieben Dank. Also, ich hab nun folgenden Code, bislang habe ich nur Deutschland im Array, das Ziel ist, alle EU Länder zu erfassen.

Die Nettopreise aller Länder außerhalb der EU sollen um 19% angehoben werden (zur Berechnung der zusätzlichen 19% gibt es sicherlich schönere Lösungen).


public function setPrice( $oPrice )
{
	
	if ($oUser = $this->getUser()) {

	$countriesEU = array(
		'a7c40f631fc920687.20179984',	// Germany
	);
		
		if (!in_array($oUser->oxuser__oxcountryid->value, $countriesEU)) {
	
			$this->_oUnitPrice = clone $oPrice;
			$this->_oPrice = clone $oPrice;
			$this->_oPrice->setPrice( round(($oPrice->getNettoPrice() / 100 * 119),2) );
			$this->_oPrice->multiply( $this->getAmount() );
			$this->_oUnitPrice->setPrice( round(($oPrice->getNettoPrice() / 100 * 119),2) );
		}
	}
 }
	  
}

Nun bekomme ich folgende Fehlermeldung:

Fatal error: Call to a member function getBruttoPrice() on a non-object in C:\xampp\htdocs\hshop\core\oxpricelist.php on line 56

Woran kann das liegen?

So, die Fehlermeldung ist nun weg, es funktioniert soweit. Bis auf das, daß die Mehrwertsteuer falsch berechnet wird. Könnte ich das über die netto2brutto-Formel machen, auch wenn dem Kunden keine MWST berechnet wird?

Am liebsten würde ich von der oxbasketitem Klass und der Methode setPrice() aus direkt auf die Brutto(!)-Preise meiner Artikel zugreifen.

Ich hab schon einige Sachen durch, jedoch habe ich keine Chance, an sie zu kommen.

Hab mir das Ganze auch mit var_dump ausgeben lassen, bei einem Kunden aus dem EU-Ausland steht in _dBrutto der Nettopreis, für mein Vorhaben bräuchte ich hier allerdings den Brutto-Preis.

Das Land selber steht bei den Ländereinstellungen auf “Nettopreis”.

Danke und Gruss!

Nach einigem Testen weiß ich nun, welchen Wert ich brauche: In der Datenban > Tabelle “oxarticles”, Feld “oxprice”. Die Frage ist nur, wie ich von der oxbasketitem Klasse darauf zugreifen kann.

$oArticle = oxNew( "oxarticle" );
$oArticle->load( $oBasketItem->getProductId() );
echo $oArticle->oxarticles__oxprice->value

Vielen lieben Dank, Foxido!

Leider bekomme ich, wenn ich den Code einbaue, die Fehlermeldung

Fatal error: Call to a member function getProductId() on a non-object in

Ich baue den code in die Funktion “setPrice” der oxbasketitem Klasse bzw. deren Erweiterung ein.

Das steht hier irgendwo. Dann heißt das Objekt anders oder wird anders geschrieben oder wenn du in der Dateei oxbasketitem bist, dann heißt es $this

Vielen Dank :slight_smile: