Hallo,
Ich habe ein benutzerdefiniertes Plugin hinzugefügt, um zu überprüfen, ob die Lieferadresse aus der Kasse null ist oder nicht. Darüber hinaus prüft es auch, ob die Entfernung zwischen der Shop-Adresse und der Lieferadresse null ist oder nicht. Wenn ich jedoch versuche, mit einer gültigen Adresse zur Kasse zu gehen, wird immer noch die Fehlermeldung angezeigt, auch wenn die Bedingungen erfüllt sind.
Hier sind meine Codes.
service.xml
<service id="Mymodule\CustomhippingCost\Subscriber\ShippingMethodValidator">
<tag name="shopware.cart.validator"/>
<argument type="service" id="Mymodule\CustomhippingCost\Service\ConfigService"/>
<argument type="service" id="Mymodule\CustomhippingCost\Service\GoogleMapsApiService"/>
<argument type="service" id="request_stack"/>
</service>
Validator class
<?php
declare(strict_types=1);
namespace Mymodule\CustomhippingCost\Subscriber;
use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\CartValidatorInterface;
use Shopware\Core\Checkout\Cart\Error\ErrorCollection;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Mymodule\CustomhippingCost\Core\Checkout\Cart\Shipping\Error\InvalidShippingAddressError;
use Mymodule\CustomhippingCost\Service\ConfigService;
use Mymodule\CustomhippingCost\Service\GoogleMapsApiService;
use Mymodule\CustomhippingCost\Exception\GoogleMapsApiResponseException;
use Mymodule\CustomhippingCost\Exception\InvalidDistanceBasedShippingCostConfigException;
use Psr\Cache\InvalidArgumentException;
use GuzzleHttp\Exception\GuzzleException;
use Mymodule\CustomhippingCost\Helper\AddressHelper;
use Shopware\Core\Framework\Context;
use Symfony\Component\HttpFoundation\RequestStack;
class ShippingMethodValidator implements CartValidatorInterface
{
private ConfigService $configService;
private GoogleMapsApiService $gmapsApiService;
private RequestStack $requestStack;
public function __construct(
ConfigService $configService,
GoogleMapsApiService $gmapsApiService,
RequestStack $requestStack
) {
$this->configService = $configService;
$this->gmapsApiService = $gmapsApiService;
$this->requestStack = $requestStack;
}
public function validate(Cart $cart, ErrorCollection $errorCollection, SalesChannelContext $salesChannelContext): void
{
$shippingMethod = $shippingMethodId = $salesChannelContext->getShippingMethod();
if (!$this->isValidShippingMethod($shippingMethod, $salesChannelContext)) {
$errorCollection->add(new InvalidShippingAddressError($shippingMethod->getId()));
return;
}
$session = $this->requestStack->getSession();
$session->getFlashBag()->get('danger');
$session->getFlashBag()->get('warning');
return;
}
private function isValidShippingMethod($shippingMethod, $salesChannelContext): bool
{
$context = Context::createDefaultContext();
$config = $this->configService->getValidConfig($context);
try {
if ($config->getShippingMethodId() === $shippingMethod->getId()) {
if ($salesChannelContext->getShippingLocation()->getAddress() === null) {
throw new GoogleMapsApiResponseException("Shipping Address cannot be null", 500);
}
$distanceInMeters = $this->gmapsApiService->getDistanceInMeters(
$config->getGoogleMapsApiKey(),
$config->getStoreAddress(),
AddressHelper::getShippingAddressAsStr($salesChannelContext->getShippingLocation()->getAddress())
);
if (is_null($distanceInMeters)) {
return false;
}
}
} catch (\Exception | GuzzleException | InvalidArgumentException | InvalidDistanceBasedShippingCostConfigException | GoogleMapsApiResponseException $e) {
return false;
}
return true;
}
}