Schönen guten Morgen zusammen,
was ist denn der beste Ansatz, wenn ich die Artikelpreise nicht direkt ausgeben möchte, sondern noch Preis- und Gebindeeinheiten mit verrechnen möchte. Die Daten hierfür stehen bereits in der Datenbank.
Ich kann zwar alles direkt im Template berechnen, aber die Logik sollte ja eigentlich nicht in den Templates rein - außerdem müsste das in einigen Templates alles angepasst werden.
Der Preis soll folgendermaßen berechnet werden: (Preis x Menge x Gebindeeinheit) / Preiseinheit
Gibt es eine zentrale Klasse, die ich hier erweitern kann?
Ich denke, der Ansatzpunkt könnte die Funktion setPrice in der Klasse oxPrice sein, soweit ich das bisher überblicke:
/**
* Sets new price and VAT percent(optional). Recalculates price by
* price entering mode
*
* @param double $newPrice new price
* @param double $dVat (optional)
*
* @return null
*/
public function setPrice($newPrice, $dVat = null)
{
if (isset($dVat)) {
$this->_dVat = (double) $dVat;
}
if ($this->_blNetPriceMode) {
$this->_dNetto = $newPrice;
} else {
$this->_dBrutto = $newPrice;
}
$this->_recalculate();
}
Allerdings “weiß” die Methode ja nicht, um welchen Artikel es sich handelt. Das müsste sie aber, damit ich die Preis- und Gebindeeinheit mit verrechnen könnte.
Hat jemand eine Idee?
Im Prinzip würde es auch erst einmal reichen, wenn ich alle Artikel, die im Warenkorb sind, preislich verändere. Dazu muss ich aber in obiger Funktion an die Preis- und Gebindeeinheit kommen.
Bitte nicht hauen, aber ich habe hierzu die Felder oxPriceB und oxPriceC zweckentfremdet, um keine neuen Datenbankattribute (wegen der Updatefähigkeit) anlegen zu müssen.
Jetzt wäre also meine Frage: Wie komme ich in obiger Funktion an den B- und C- Preis eines Artikels ran? Habe hierfür noch keine Funktion gefunden.
Sobald ich das habe, würde ich die Änderung in ein Modul auslagern. Damit wäre mir fürs erste schon sehr geholfen…
Habe die o.G. Funktion erweitert und in ein Modul ausgelagert. Anbei die Umsetzung, hilft evtl. dem ein oder anderen beim Verständnis:
<?php
/**
* Additional functions for the basket
*
* Last change: 22.06.2011 -- creation
*
**/
class mybasketitemfunctions extends mybasketitemfunctions_parent {
/**
* Sets $this->oPrice
*
* @param object $oPrice price
*
* @return null
*
* Calculates the price in a different way than normal: Price = (Preis x Menge x Verkaufsgebindeenheit) / Verkaufspreiseinheit
* Attention: PriceB and PriceC contain the data for "Verkaufsgebindeeinheit" and "Verkaufspreiseinheit"
*
*/
public function setPrice( $oPrice )
{
$this->_oPrice = oxNew( 'oxprice' );
$this->_oPrice->setBruttoPriceMode();
$this->_oPrice->setVat( $oPrice->getVAT() );
$myArticle = $this->getArticle();
$VKPE = $myArticle->oxarticles__oxpriceb->value;
$VkGE = $myArticle->oxarticles__oxpricec->value;
$oPrice->setPrice( (($oPrice->getNettoPrice() * $VkGE ) / $VKPE) );
$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();
}
}
?>
Das ganze habe ich unter [I]modules/own/mybasketitemfunctions.php[/I] abgespeichert. Anschließend das Modul noch im Backend registrieren:
[I]oxbasketitem => own/mybasketitemfunctions[/I]