<?php
namespace Maxia\MaxiaTaxSwitch6\Storefront\Controller;
use Maxia\MaxiaTaxSwitch6\Storefront\Service\TaxSwitchService;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Core\PlatformRequest;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Shopware\Storefront\Framework\Routing\Annotation\NoStore;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
/**
* @RouteScope(scopes={"storefront"})
*/
class TaxSwitchController extends StorefrontController
{
/**
* @var TaxSwitchService
*/
private $taxSwitchService;
/**
* @param TaxSwitchService $taxSwitchService
*/
public function __construct(TaxSwitchService $taxSwitchService)
{
$this->taxSwitchService = $taxSwitchService;
}
/**
* @param Request $request
*
* @RouteScope(scopes={"storefront"})
* @NoStore
* @Route(
* "/maxia-tax-switch",
* name="frontend.plugins.maxia-tax-switch.update",
* options={"seo"="false"},
* methods={"GET"},
* defaults={"XmlHttpRequest"=true}
* )
* @return \Symfony\Component\HttpFoundation\Response
*/
public function updateSetting(Request $request)
{
/** @var SalesChannelContext $context */
$context = $request->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$config = $this->taxSwitchService->getContext($context);
if (!$config['pluginEnabled']) {
throw new NotFoundHttpException();
}
$isNet = (bool)$request->query->get('net');
$this->taxSwitchService->setDisplayNet($context, $isNet);
$returnUrl = $this->getReturnUrl($request, $config['urlParameterName']);
if ($request->isXmlHttpRequest()) {
$response = new JsonResponse(['success' => true, 'returnUrl' => $returnUrl]);
} else {
$response = $this->redirect($returnUrl);
}
$response->headers->set('X-Robots-Tag', 'noindex,nofollow');
return $response;
}
/**
* @param Request $request
*
* @RouteScope(scopes={"storefront"})
* @NoStore
* @Route(
* "/maxia-tax-switch/popup",
* name="frontend.plugins.maxia-tax-switch.popup",
* options={"seo"="false"},
* methods={"GET"},
* defaults={"XmlHttpRequest"=true}
* )
* @return Response
*/
public function showPopup(Request $request)
{
/** @var SalesChannelContext $context */
$context = $request->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$config = $this->taxSwitchService->getContext($context);
if ($config['pluginEnabled']) {
$context->addExtension('maxiaTaxSwitch', new ArrayEntity($config));
if (!$config['popupTestMode']) {
$hidePopupFlag = $request->getSession()->get('maxia-tax-switch-hide-popup', false);
// hide modal if customer is logged in
if ($context->getCustomer() !== null) {
$hidePopupFlag = true;
}
$request->getSession()->set('maxia-tax-switch-hide-popup', true);
} else {
$hidePopupFlag = false;
}
return new JsonResponse([
'sessionHideModalFlag' => $hidePopupFlag,
'template' => $this->renderView(
'@Storefront/storefront/plugins/maxia_tax_switch/modal.html.twig',
['context' => $context]
)
]);
}
return $this->redirect($request->getBaseUrl());
}
/**
* Returns the absolute redirect url based on the 'return' parameter or referer of the request.
*
* @param Request $request
* @return string
*/
protected function getReturnUrl(Request $request)
{
/** @var SalesChannelContext $context */
$context = $request->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$config = $this->taxSwitchService->getContext($context);
$returnPath = $request->get('return');
if (!$returnPath && $request->headers->get('Referer')) {
$returnPath = $request->headers->get('Referer');
}
$url = parse_url($returnPath);
if (!empty($url['host']) && $url['host'] !== $request->getHttpHost()) {
$url = $request->get('return', '/');
}
$url['host'] = $request->getHttpHost();
$url['scheme'] = $request->getScheme();
if ($request->getPort()) {
$url['port'] = $request->getPort();
}
if (isset($url['query'])) {
parse_str($url['query'] ?? '', $query);
if ($query) {
if (isset($query[$config['urlParameterName']])) {
unset($query[$config['urlParameterName']]);
}
$url['query'] = http_build_query($query);
}
}
return $this->buildUrl($url);
}
/**
* Build URL string from parse_url result.
*
* @param array $url
* @return bool
*/
protected function buildUrl(array $url)
{
if (!$url) {
return false;
}
$newUrl = '';
if (isset($url['scheme'])) {
$newUrl .= $url['scheme'] . '://';
}
if (isset($url['user'])) {
$newUrl .= $url['user'];
if (isset($url['pass'])) {
$newUrl .= ':'.$url['pass'];
}
$newUrl .= '@';
}
if (isset($url['host'])) {
$newUrl .= $url['host'];
}
if (isset($url['port'])) {
$newUrl .= ':'.$url['port'];
}
if (isset($url['path'])) {
$newUrl .= $url['path'];
}
if (isset($url['query'])) {
parse_str($url['query'], $params);
if ($params) {
$newUrl .= '?'.http_build_query($params);
}
}
if (isset($url['fragment'])) {
$newUrl .= '#'.$url['fragment'];
}
return $newUrl;
}
}