Hallo tintifax
Besten Dank für die Antwort.
Ich habe mich da gestern Nacht nochmals ran gemacht und mir überlegt wie ich das selbst berechnen kann.
Die Berechnung an sich ist nicht schwer. Es gab jedoch zwei Probleme:
1. Wie kann ich den Versandpreis manuell hinzufügen?
Nach diversen Suchanfragen entdeckte ich die Contao Hooks*. Nachdem ich die calculatePreis() Hook erstellte,
und erfolgreich den Gesamtpreis veränderte, zeigte sich das zweite Problem.
2. Wie komme ich im Hook an die Daten im Warenkorb?
In meinem eigenen Hook schaffte ich es irgendwie nicht, den Warenkorb auszugeben. Durch diverses weiteres
Googeln fand ich dann eine Anleitung von fritzmg um
eigene "surcharges" zu erstellen. Das gab mir neue Hoffnung und nachdem ich alle möglichen Klassen des Isotope durchforstet hatte kam
ich zu folgendem Resultat:
[ MySurcharge.php ]
PHP-Code:
<?php
use Isotope\Model\ProductCollection;
class MySurcharge {
public function calcKartons($total, $klein, $gross=0) {
if($gross==0) {
$gross=$klein;
$klein=0;
}
$aKlein = 0;
$aGross = 0;
if($total % $gross == 0) {
$aGross = $total / $gross;
} else {
$aGross = floor($total / $gross);
if(($total%$gross)>$klein) {
$aGross++;
} else {
$aKlein++;
}
}
return [$aKlein,$aGross];
}
public function findSurchargesForCollection(ProductCollection $collection): array {
//check if "Postversand" is the selected shipping method
if($collection->getShippingMethod()->name == "Postversand") {
$arrItems = $collection->getItems();
$anzahl_1 = 0;
$anzahl_2 = 0;
foreach ($arrItems as $objItem) {
if($objItem->hasProduct()) {
$objProduct = $objItem->getProduct();
$quantity = $objItem->quantity;
//$name = $objProduct->getName();
$groesse = $objProduct->getOptions()['groesse'];
if($groesse==1) {
//75cl
$anzahl_1 += $quantity;
} else if($groesse==2) {
//50cl
$anzahl_2 += $quantity;
}
}
}
$result75 = $this->calcKartons($anzahl_1, 6, 12);
$result50 = $this->calcKartons($anzahl_2, 6, 15);
$preis1 = ($result75[0] + $result50[0]) * 12;
$preis2 = ($result75[1] + $result50[1]) * 16.5;
$surcharge = $preis1 + $preis2;
return [\MySurchargeModel::build($surcharge)];
} else {
return [];
}
}
}
[ model/MySurchchargeModel.php ]
PHP-Code:
<?php
use Isotope\Interfaces\IsotopeProductCollectionSurcharge;
use Isotope\Model\ProductCollectionSurcharge;
class MySurchargeModel extends ProductCollectionSurcharge implements IsotopeProductCollectionSurcharge {
public static function build($var): self {
$surcharge = new self();
$surcharge->label = 'Postversand';
$surcharge->price = '';
$surcharge->total_price = $var;
$surcharge->tax_class = 1;
$surcharge->before_tax = true;
$surcharge->addToTotal = true;
return $surcharge;
}
}
[ config/config.php ]
PHP-Code:
<?php
/**
* Register Isotope model types
*/
\Isotope\Model\ProductCollectionSurcharge::registerModelType('mysurcharge', \MySurchargeModel::class);
/**
* Register Isotope hooks
*/
$GLOBALS['ISO_HOOKS']['findSurchargesForCollection'][] = [\MySurcharge::class, 'findSurchargesForCollection'];
Ich habe keine Ahnung, ob es irgendwie anders gegangen wäre, aber so scheint es nun zu funktionieren.
Der Vorteil ist, ich kann theoretisch auch einen String mit weiteren Informationen übergeben:
z.B 20x 50cl Flaschen im 15er Karton | 3 x 50cl Flaschen im 6er Karton
*Nützliches zu den Hooks:
Contao Hooks
Eigenen Hook einrichten
Isotope Hooks 1
Isotope Hooks 2
eigener surcharge von fritzmg
Vielleicht hilft es ja jemandem weiter.
Lesezeichen