Skip to content

Commit

Permalink
Merge pull request #2523 in NEXT/platform from next-2923/fix-language…
Browse files Browse the repository at this point in the history
…-switch to master

* commit '1e487f883786b49639d73749ec0435038b88e42b':
  NEXT-2923 - Implement language switch route to redirect to new language domain
  NEXT-2923 - Support different url types
  NEXT-2923 - Fix language detection for domain switch
  • Loading branch information
janbuecker committed May 7, 2019
2 parents 543508a + 2c513e6 commit ef83208
Show file tree
Hide file tree
Showing 8 changed files with 406 additions and 63 deletions.
8 changes: 8 additions & 0 deletions DependencyInjection/services.xml
Expand Up @@ -7,6 +7,11 @@
<services>
<defaults autowire="true"/>

<service id="Shopware\Storefront\Framework\Routing\Router" decorates="router">
<argument type="service" id="Shopware\Storefront\Framework\Routing\Router.inner" />
<argument type="service" id="request_stack"/>
</service>

<service id="Shopware\Storefront\Framework\Twig\TemplateDataExtension">
<tag name="twig.extension"/>
<argument type="service" id="request_stack"/>
Expand Down Expand Up @@ -258,6 +263,9 @@
<argument type="service" id="translator"/>
<argument type="service" id="media.repository"/>
<argument type="service" id="Shopware\Core\Checkout\Payment\PaymentService"/>
<argument type="service" id="sales_channel_domain.repository"/>
<argument type="service" id="request_stack"/>
<argument type="service" id="router"/>
</service>

<service id="Shopware\Storefront\PageController\ErrorPageController" public="true">
Expand Down
10 changes: 6 additions & 4 deletions Framework/Routing/RequestTransformer.php
Expand Up @@ -14,6 +14,8 @@

class RequestTransformer
{
public const SALES_CHANNEL_BASE_URL = 'sw-sales-channel-base-url';

/**
* @var Connection
*/
Expand Down Expand Up @@ -54,14 +56,14 @@ public function transform(SymfonyRequest $request): SymfonyRequest
$server = array_merge(
$_SERVER,
[
'REQUEST_URI' => $baseUrl . $resolved['pathInfo'],
'SCRIPT_NAME' => $baseUrl . '/index.php',
'SCRIPT_FILENAME' => $baseUrl . '/index.php',
'REQUEST_URI' => $resolved['pathInfo'],
]
);

$clone = $request->duplicate(null, null, null, null, null, $server);

$clone->attributes->set(self::SALES_CHANNEL_BASE_URL, $baseUrl);

$clone->attributes->set(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID, $salesChannel['salesChannelId']);
$clone->attributes->set(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST, true);
$clone->attributes->set(SalesChannelRequest::ATTRIBUTE_DOMAIN_LOCALE, $salesChannel['locale']);
Expand Down Expand Up @@ -159,6 +161,6 @@ private function resolveSeoUrl(Request $request, string $baseUrl, string $salesC
return (new SeoResolver($this->connection))->resolveSeoPath($salesChannelId, $seoPathInfo);
}

return ['pathInfo' => $request->getPathInfo()];
return ['pathInfo' => $seoPathInfo];
}
}
105 changes: 105 additions & 0 deletions Framework/Routing/Router.php
@@ -0,0 +1,105 @@
<?php declare(strict_types=1);

namespace Shopware\Storefront\Framework\Routing;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Router as SymfonyRouter;
use Symfony\Component\Routing\RouterInterface;

class Router implements RouterInterface, RequestMatcherInterface
{
/**
* @var SymfonyRouter
*/
private $decorated;

/**
* @var RequestStack
*/
private $requestStack;

public function __construct(SymfonyRouter $decorated, RequestStack $requestStack)
{
$this->decorated = $decorated;
$this->requestStack = $requestStack;
}

public function matchRequest(Request $request)
{
return $this->decorated->matchRequest($request);
}

public function setContext(RequestContext $context)
{
return $this->decorated->setContext($context);
}

public function getContext()
{
return $this->decorated->getContext();
}

public function getRouteCollection()
{
return $this->decorated->getRouteCollection();
}

public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH)
{
$generated = $this->decorated->generate($name, $parameters, $referenceType);

if (!$this->isStorefrontRoute($name)) {
return $generated;
}

$url = $this->getBaseUrl();

switch ($referenceType) {
case self::NETWORK_PATH:
case self::ABSOLUTE_URL:
$host = $this->getContext()->getHost();

return str_replace(
$host,
$host . rtrim($url, '/'),
$generated
);

case self::RELATIVE_PATH:
return ltrim($url, '/') . $generated;

case self::ABSOLUTE_PATH:
default:
return rtrim($url, '/') . $generated;
}
}

public function match($pathinfo)
{
return $this->decorated->match($pathinfo);
}

private function getBaseUrl(): string
{
$request = $this->requestStack->getMasterRequest();
if (!$request) {
return '';
}

$url = (string) $request->attributes->get(RequestTransformer::SALES_CHANNEL_BASE_URL);

if (empty($url)) {
return $url;
}

return '/' . trim($url, '/') . '/';
}

private function isStorefrontRoute(string $name): bool
{
return strncmp($name, 'frontend.', 9) === 0 || strncmp($name, 'widgets.', 8) === 0;
}
}
72 changes: 71 additions & 1 deletion PageController/CheckoutPageController.php
Expand Up @@ -25,22 +25,29 @@
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Routing\Exception\LanguageNotFoundException;
use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
use Shopware\Core\Framework\Validation\Exception\ConstraintViolationException;
use Shopware\Core\System\SalesChannel\Aggregate\SalesChannelDomain\SalesChannelDomainEntity;
use Shopware\Core\System\SalesChannel\SalesChannel\SalesChannelContextSwitcher;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Framework\Controller\StorefrontController;
use Shopware\Storefront\Framework\Page\PageLoaderInterface;
use Shopware\Storefront\Framework\Routing\RequestTransformer;
use Shopware\Storefront\Framework\Routing\Router;
use Shopware\Storefront\Page\Checkout\AddressList\CheckoutAddressListPageLoader;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoader;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoader;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoader;
use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoader;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Contracts\Translation\TranslatorInterface;

class CheckoutPageController extends StorefrontController
Expand Down Expand Up @@ -110,6 +117,21 @@ class CheckoutPageController extends StorefrontController
*/
private $paymentService;

/**
* @var EntityRepositoryInterface
*/
private $domainRepository;

/**
* @var RequestStack
*/
private $requestStack;

/**
* @var RouterInterface
*/
private $router;

public function __construct(
CartService $cartService,
PageLoaderInterface $cartPageLoader,
Expand All @@ -123,7 +145,10 @@ public function __construct(
SalesChannelContextSwitcher $contextSwitcher,
TranslatorInterface $translator,
EntityRepositoryInterface $mediaRepository,
PaymentService $paymentService
PaymentService $paymentService,
EntityRepositoryInterface $domainRepository,
RequestStack $requestStack,
RouterInterface $router
) {
$this->cartService = $cartService;
$this->cartPageLoader = $cartPageLoader;
Expand All @@ -138,6 +163,10 @@ public function __construct(
$this->translator = $translator;
$this->mediaRepository = $mediaRepository;
$this->paymentService = $paymentService;
$this->domainRepository = $domainRepository;

$this->requestStack = $requestStack;
$this->router = $router;
}

/**
Expand Down Expand Up @@ -343,6 +372,47 @@ public function configure(Request $request, RequestDataBag $data, SalesChannelCo
return $this->redirectToRoute($route, $parameters);
}

/**
* @Route("/checkout/language", name="frontend.checkout.switch-language", methods={"POST"})
*/
public function switchLanguage(Request $request, SalesChannelContext $context): RedirectResponse
{
if (!$request->request->has('languageId')) {
throw new MissingRequestParameterException('languageId');
}

$languageId = $request->request->get('languageId');

$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('languageId', $languageId));
$criteria->addFilter(new EqualsFilter('salesChannelId', $context->getSalesChannel()->getId()));
$criteria->setLimit(1);

$domain = $this->domainRepository->search($criteria, $context->getContext())->first();

/** @var SalesChannelDomainEntity $domain */
if (!$domain) {
throw new LanguageNotFoundException($languageId);
}

$route = $request->request->get('redirectTo', 'frontend.home.page');

$params = $request->request->get('redirectParameters', json_encode([]));

if (is_string($params)) {
$params = json_decode($params, true);
}

$mappingRequest = new Request([], [], [], [], [], ['REQUEST_URI' => $domain->getUrl()]);

$this->requestStack->getMasterRequest()->attributes->set(RequestTransformer::SALES_CHANNEL_BASE_URL, $mappingRequest->getPathInfo());

$this->router->getContext()->setMethod('GET');
$url = $this->router->generate($route, $params, Router::ABSOLUTE_URL);

return new RedirectResponse($url);
}

/**
* @Route("/checkout/line-item/delete/{id}", name="frontend.checkout.line-item.delete", defaults={"XmlHttpRequest": true}, methods={"POST", "DELETE"})
*/
Expand Down
Expand Up @@ -3,7 +3,7 @@
<div class="top-bar-nav-item top-bar-language">
{% block layout_header_actions_language_widget_form %}
<form method="post"
action="{{ path('frontend.checkout.configure') }}"
action="{{ path('frontend.checkout.switch-language') }}"
class="language-form"
data-form-auto-submit="true">
{% block layout_header_actions_language_widget_content %}
Expand Down
26 changes: 0 additions & 26 deletions StorefrontRequest.php

This file was deleted.

0 comments on commit ef83208

Please sign in to comment.