<?php
declare(strict_types=1);
namespace App\Controller\Front;
use App\Config\Pages;
use App\Entity\Page\Page;
use App\Entity\Page\PageTranslation;
use App\Provider\PageProviderInterface;
use DateTime;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("", name="front-")
*/
class PageController extends AbstractController
{
private array $locales = [];
//private SessionInterface $session;
/**
* @var ParameterBagInterface
*/
private ParameterBagInterface $parameterBag;
private RequestStack $session;
public function __construct(
//SessionInterface $session,
ParameterBagInterface $parameterBag,
RequestStack $session
) {
$this->locales = $parameterBag->get('app.supported_locales_data');
$this->parameterBag = $parameterBag;
$this->session = $session;
}
// /**
// * @Route(
// * "",
// * name="language-choice",
// * methods={"GET"},
// * )
// */
// public function languageChoiceAction(
// Request $request,
// PageProviderInterface $pageProvider
// ): Response {
// $requestedChangeOfLanguage = (bool)$request->query->get('changeLanguage', null);
// $requestedEnglish = (bool)$request->query->get('en', null);
//
// if ($requestedEnglish) {
// $request->query->remove('en');
// }
//
// $mainPage = $pageProvider->getOneByMigrationId(1);
//
// $isLocaleAlreadyChosen = ($_locale = $this->session->getSession()->get('_locale')) && !$requestedChangeOfLanguage;
// $isLoggedIn = $this->getUser() !== null;
//
// if ($isLocaleAlreadyChosen || $isLoggedIn || $requestedEnglish) {
// $_locale = ($requestedEnglish) ? "en" : $_locale;
// $mainPageUrl = $mainPage->translate($_locale, false)->getUrl();
//
// return $this->redirectToRoute('front-page', [
// "url" => $mainPageUrl,
// "_locale" => $_locale,
// ]);
// }
//
// $viewParams = [
// "mainPage" => $mainPage,
// ];
//
// return $this->render('front/languages.twig', $viewParams);
// }
/**
* @Route(
* path="/{url}",
* name="page",
* requirements={
* "_locale": "%app.supported_locales%",
* "url": "[^.]+"
* }
* ),
* @ParamConverter(
* "pageTranslation",
* options={
* "mapping": {
* "url": "url"
* }
* }
* )
*/
public function getPageAction(
Request $request,
PageTranslation $pageTranslation,
string $_locale = 'pl',
string $url = ''
): Response {
if ($_locale) {
if (!$locale = $this->locales[$_locale]) {
return $this->createNotFoundException("Could not find page translation for locale \"$_locale\"");
}
$this->session->getSession()->set('_locale', $_locale);
$request->setLocale($_locale);
//$request->setDefaultLocale($_locale);
//dd($request->getDefaultLocale());
}
$user = $this->getUser();
$page = $pageTranslation->getTranslatable();
if (!$page->getIsPublished() && !$user) {
throw new HttpException(404, 'This page is not available yet');
}
if ($forwardResponse = $this->getForwardResponseForPage($page, $request)) {
return $forwardResponse;
}
$templatePath = $page->getTemplatePath() ?? ($page->getType() == Page::POST ? 'front/post.twig' : 'front/index.twig');
$viewParams = [
"entity" => $page,
"currentUrl" => [
"locale" => $request->getLocale(),
]
];
if ($request->query->get('shopType')) {
$viewParams['shopType'] = (string)$request->query->get('shopType');
}
$response = $this->render($templatePath, $viewParams);
if ("GET" === $request->getMethod()) {
$response->setPublic();
$response->setExpires(new DateTime("+1 hour"));
$response->setMaxAge(3600);
}
return $response;
}
private function getForwardResponseForPage(Page $page, Request $request)
{
$configForTypes = [
Pages::CATEGORY => BlogController::class . "::router",
];
$configForSpecificPages = [
//Pages::BLOG_LIST => BlogController::class . "::router",
];
$controller = $configForSpecificPages[$page->getMigrationId()]
?? $configForTypes[$page->getType()]
?? null;
if (!$controller) {
return;
}
return $this->forward(
$controller,
[
"page" => $page,
"originalRequest" => $request,
]
);
}
}