Hallo, versuche mit folgendem Code die Versandmethode zuzuweisen, scheitere aber. Es gibt keine Exception und kein Error, es tut sich nur nix. Was mache ich falsch?
<?php declare(strict_types=1);
namespace WtShippingCalc\Core\Checkout\Cart;
use JetBrains\PhpStorm\NoReturn;
use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\CartBehavior;
use Shopware\Core\Checkout\Cart\CartProcessorInterface;
use Shopware\Core\Checkout\Cart\LineItem\CartDataCollection;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use ShippingCalc\Service\ContactDatabaseShipping;
use Shopware\Core\Framework\Context;
use Shopware\Core\System\SalesChannel\SalesChannel\SalesChannelContextSwitcher;
use Shopware\Core\Framework\Validation\DataBag\DataBag;
class ShippingProcessor implements CartProcessorInterface
{
private SalesChannelContextSwitcher $contextSwitcher;
private SystemConfigService $systemConfigService;
private ContactDatabaseShipping $database;
public function __construct(SalesChannelContextSwitcher $contextSwitcher, SystemConfigService $systemConfigService, ContactDatabaseShipping $database)
{
$this->contextSwitcher = $contextSwitcher;
$this->systemConfigService = $systemConfigService;
$this->database = $database;
}
#[NoReturn] public function process(CartDataCollection $data, Cart $original, Cart $toCalculate, SalesChannelContext $context, CartBehavior $behavior): void
{
/* !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !!
Nicht vergessen: $_SESSION['itemsDuble'] nach dem Checkout/Bezahlvorgang ODER(!) dem Abbruch in den entsprechenden Subscriber
unbedingt löschen!!
*/
$LaengeVorgabe = $this->systemConfigService->get('WtShippingCalc.config.laenge', null);
$HoeheVorgabe = $this->systemConfigService->get('WtShippingCalc.config.hoehe', null);
$BreiteVorgabe = $this->systemConfigService->get('WtShippingCalc.config.breite', null);
$spezOneVorgabe = $LaengeVorgabe * $BreiteVorgabe * $HoeheVorgabe;
$spezTwoVorgabe = $this->systemConfigService->get('WtShippingCalc.config.gewicht', null);
if (session_status() === PHP_SESSION_NONE)
session_start();
//um der nachträglichen Hinzufügung von Artikeln in den Warenkorb gerecht zu werden, wird mit 2 SESSION-Arrays gearbeitet
if (!empty($_SESSION['itemsDuble'])) {
$orderGewicht = $_SESSION['items'][0] + $_SESSION['itemsDuble'][0];
$orderLaenge = $_SESSION['items'][1] + $_SESSION['itemsDuble'][1];
$orderBreite = $_SESSION['items'][2] + $_SESSION['itemsDuble'][2];
$orderHoehe = $_SESSION['items'][3] + $_SESSION['itemsDuble'][3];
$_SESSION['itemsDuble'][0] = $orderGewicht;
$_SESSION['itemsDuble'][1] = $orderLaenge;
$_SESSION['itemsDuble'][2] = $orderBreite;
$_SESSION['itemsDuble'][3] = $orderHoehe;
} else {
$_SESSION['itemsDuble'] = $_SESSION['items'];
}
$spezOneOrder = $_SESSION['itemsDuble'][1] * $_SESSION['itemsDuble'][2] * $_SESSION['itemsDuble'][3];
$spezTwoOrder = $_SESSION['itemsDuble'][0];
//hole alle Shippingobjekte und packe sie in ein Array
$shippingMethods = $this->database->readTableShipping(Context::createDefaultContext());
foreach ($shippingMethods as $key => $value) {
$arShippingId[] = $key;
$arShippingObj[] = $value;
}
/* in arShippingObj sind alle relevanten Shipping-Objekte. Je nach Abgleich soll das erste oder zweite Objekt verwendet
werden! Trifft kein Kriterium zu, wird, sofern vorhanden, das dritte Objekt(Versandmethode) verwendet.
*/
if (isset($arShippingId) && isset($arShippingObj) && count($arShippingId) == 2) {
$obj = $this->DecideShippingFromTwo($spezOneOrder, $spezOneVorgabe, $spezTwoOrder, $spezTwoVorgabe, $arShippingObj, $context);
} elseif (isset($arShippingId) && isset($arShippingObj) && count($arShippingId) > 2) {
$obj = $this->DecideShippingFromMoreThanTwo($spezOneOrder, $spezOneVorgabe, $spezTwoOrder, $spezTwoVorgabe, $arShippingObj, $context, $original, $toCalculate);
}
$data->set($obj->getId(), $obj);
$this->assignShippingObject($obj, $context);
}
#[NoReturn] private function DecideShippingFromTwo(float $spezOne, int $spezVorgabeOne, float $spezTwo, int $SpezVorgabeTwo, array $arShippingObj, SalesChannelContext $context): void
{
/* spezOne mit spezVorgabeOne abgleichen; spezTwo mit spezVorgabeTwo abgleichen, um zu eruieren, welche
Versandmethode ausgewählt werden soll
*/
foreach ($arShippingObj as $item) {
if (str_contains(strtolower($item->getName()), 'volume')) {
$shipingVolumeObj = $item;
} else {
$shipingObjStandard = $item;
}
}
//jetzt sind die ShippingObjekte aus dem Array gezogen und zugewiesen. Verwende Sie je nach Auswertung der Übergabeparameter
if (isset($shipingVolumeObj) && $spezOne >= $spezVorgabeOne) {
$shippingObject = $shipingVolumeObj;
} else {
$shippingObject = $shipingObjStandard;
}
if (isset($shippingObject)) {
$deliveries = $original->getDeliveries();
$deliveries->first()->setShippingMethod($shippingObject);
$toCalculate->setDeliveries($deliveries);
$original->setDeliveries($deliveries);
}
return $shippingObject;
#[NoReturn] private function DecideShippingFromMoreThanTwo(float $spezOne, int $spezVorgabeOne, float $spezTwo, int $spezVorgabeTwo, array $arShippingObj, SalesChannelContext $context, Cart $original, Cart $toCalculate): object
{
/* spezOne mit spezVorgabeOne abgleichen; spezTwo mit spezVorgabeTwo abgleichen, um zu eriuieren, welche
Versandmethode ausgewählt werden soll
*/
foreach ($arShippingObj as $item) {
if (str_contains(strtolower($item->getName()), 'weight')) {
$shipingWeightObj = $item;
} elseif (str_contains(strtolower($item->getName()), 'volume')) {
$shipingVolumeObj = $item;
} else {
$shipingObjStandard = $item;
}
}
//jetzt sind die ShippingObjekte aus dem Array gezogen und zugewiesen. Verwende Sie je nach Auswertung der Übergabeparameter
if (isset($shipingVolumeObj) && $spezOne >= $spezVorgabeOne) {
$shippingObject = $shipingVolumeObj;
} elseif (isset($shipingWeightObj) && $spezTwo > $spezVorgabeTwo) {
$shippingObject = $shipingWeightObj;
} elseif (isset($shipingObjStandard)) {
$shippingObject = $shipingObjStandard;
}
if (isset($shippingObject)) {
$deliveries = $original->getDeliveries();
$deliveries->first()->setShippingMethod($shippingObject);
$toCalculate->setDeliveries($deliveries);
$original->setDeliveries($deliveries);
}
return $shippingObject;
}
//jetzt wurde das Versandobjekt bestimmt. Verbleibt noch die Zuweisung an den SalesChannel.
#[NoReturn] private function assignShippingObject(object $shippingObject, SalesChannelContext $context): void
{
$folder = getcwd();
$file = 'output.txt';
$output = $folder . DIRECTORY_SEPARATOR . $file;
$name = $shippingObject->getName();
file_put_contents($output, "$name shipping has been used sending product", FILE_APPEND);
file_put_contents($output, PHP_EOL, FILE_APPEND);
$shippingId = $shippingObject->getId();
$contextToken = $context->getToken();
$dataBag = new DataBag([
'id' => $shippingId,
]);
$this->contextSwitcher->update($dataBag, $context);
$salesChannels = $this->database->readTableSalesChannel(Context::createDefaultContext());
// Prepare the data for updating sales channels
foreach ($salesChannels as $salesChannel) {
$shippingMethods = $salesChannel->getShippingMethods();
$shippingMethodIds = [];
foreach ($shippingMethods as $shippingMethod) {
$shippingMethodIds[] = ['id' => $shippingObject->getId()];
}
}
$salesChannelData[] = [
'id' => $salesChannel->getId(),
'shippingMethods' => $shippingMethodIds,
];
$this->database->updateSalesChannel(Context::createDefaultContext(), $salesChannelData);
}
}