Grundpreisberechnung bisher:
in shop/core/oxaerticle.php wird der Grundpreis berechnet (zur Laufzeit, wird nicht in DB abgelegt), Zeilen 3915ff:
//price per unit handling
if ((double) $this->oxarticles__oxunitquantity->value && $this->oxarticles__oxunitname->value) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value, $oCur);
}
Dies nützt nur in wenigen Fällen, Problem: Bei z. B. 500ml Himbeersirup wird der Grundpreis für 1ml berechnet, richtig wäre aber für 1Liter,
bei 200g-Tafel Schokolade wird der Grundpreis für 1g berechnet, richtig wären 100g, bei 0,3L Bio-Kölsch wird 1Liter berechnet, richtig wären (meines Wissens) 100ml.
Problemlösung (Vorschlag von einem Ahnungslosen bez. PHP und Smarty, also alles unverbindlich und bitte gern Verbesserungsvorschläge):
[B]1. [/B]Weil ich die Daten aus oxunitquantity und oxunitname nicht nur zur Grundpreisberechnung nutze, sondern auch in den Templates zum Anzeigen des
Inhalts der Artikel (was ja juristisch fraglos auch nötig ist, was oxid aber nicht berücksichtigt), muss zunächst eine String-Variable definiert
werden, die die Berechnungsbasis des Grundpreises (z. B. ‘100ml’) anzeigen wird:
nach Zeile 177 in shop/core/oxaerticle.php einfügen:
protected $_Grundpreiseinheit = '';
[B]
2.[/B] Die ursprünglichen Zeilen zum price per unit handling (s. o.) ersetzen durch:
//price per unit handling, Ehlert: modifiziert!
if ((double) $this->oxarticles__oxunitquantity->value && $this->oxarticles__oxunitname->value) { //berechne nur, wenn beide Werte vorliegen
switch($this->oxarticles__oxunitname->value) {
case 'g':
if ($this->oxarticles__oxunitquantity->value<=400) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value * 100, $oCur);$this->_Grundpreiseinheit->value='100g';
break; }
if ($this->oxarticles__oxunitquantity->value>400) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value * 1000, $oCur);$this->_Grundpreiseinheit->value='Kg';
break; }
case 'Kg':
if ($this->oxarticles__oxunitquantity->value<=0.4) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value / 10, $oCur);$this->_Grundpreiseinheit->value='100g';
break; }
if ($this->oxarticles__oxunitquantity->value>0.4) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value, $oCur);$this->_Grundpreiseinheit->value='Kg';
break; }
case 'ml':
if ($this->oxarticles__oxunitquantity->value<=400) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value * 100, $oCur);$this->_Grundpreiseinheit->value='100ml';
break; }
if ($this->oxarticles__oxunitquantity->value>400) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value * 1000, $oCur);$this->_Grundpreiseinheit->value='L';
break; }
case 'L':
if ($this->oxarticles__oxunitquantity->value<=0.4) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value / 10, $oCur);$this->_Grundpreiseinheit->value='100ml';
break; }
if ($this->oxarticles__oxunitquantity->value>0.4) {
$this->_fPricePerUnit = oxLang::getInstance()->formatCurrency($dPrice / (double) $this->oxarticles__oxunitquantity->value, $oCur);$this->_Grundpreiseinheit->value='L';
break; }
} //switch-Ende
}
//Ehlert ENDE
Hier kann natürlich nach Bedarf ergänzt werden (z. B. Meter/ml). ‘Stück’ ist hier nicht berücksichtigt, weil zumindest in meiner Branche bei Stückangaben kein Grundpreis nötig ist.
Es kann sein, dass ich mich bei der Splittung <=400 irre, muss nochmal in der Grundpreisverordnung gucken.
[B]3.[/B] Grundpreis in Templates einbauen:
z. B. in details.tpl einbauen:
[{if $product->getPricePerUnit()}]
<div id="test_product_price_unit" class="pperunit">
([{$product->getPricePerUnit()}][{$currency->sign}]/[{$product->_Grundpreiseinheit->value}])
</div>
[{/if}]
Sicherlich kann man die Fallunterscheidung auch viel eleganter lösen.
Aber worauf es mir ankam: Bei mir funktionerts!
Tschö
Ralf