<?php declare(strict_types=1);
namespace Cbax\ModulLexicon\Controller;
use Shopware\Core\Framework\Context;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
use Cbax\ModulLexicon\Components\LexiconHelper;
use Cbax\ModulLexicon\Components\LexiconSeo;
use Cbax\ModulLexicon\Components\LexiconReplacer;
use Shopware\Storefront\Page\GenericPageLoader;
use Shopware\Core\PlatformRequest;
use Shopware\Storefront\Framework\Routing\RequestTransformer;
use Shopware\Storefront\Controller\StorefrontController;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Framework\Cache\Annotation\HttpCache;
/**
* @RouteScope(scopes={"storefront"})
*/
class FrontendController extends StorefrontController
{
const CONFIG_PATH = 'CbaxModulLexicon.config';
private $config = null;
private $systemConfigService;
private $helperComponent;
private $lexiconSeo;
private $genericLoader;
private $lexiconReplacer;
public function __construct(
LexiconHelper $helperComponent,
LexiconSeo $lexiconSeo,
GenericPageLoader $genericLoader,
LexiconReplacer $lexiconReplacer,
SystemConfigService $systemConfigService)
{
$this->helperComponent = $helperComponent;
$this->lexiconSeo = $lexiconSeo;
$this->genericLoader = $genericLoader;
$this->lexiconReplacer = $lexiconReplacer;
$this->systemConfigService = $systemConfigService;
}
/**
* @HttpCache()
* @Route("/cbax/lexicon/index", name="frontend.cbax.lexicon.index", options={"seo"=true}, methods={"GET"})
*/
public function index(Request $request, Context $context): Response
{
$salesChannelContext = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$salesChannelId = $salesChannelContext->getSalesChannelId();
$this->config = $this->config ?? $this->systemConfigService->get(self::CONFIG_PATH, $salesChannelId);
if (empty($this->config['active'])) {
return $this->forwardToRoute('frontend.home.page');
}
// Standard Page Object für Breadcrumb erzeugen
$page = $this->genericLoader->load($request, $salesChannelContext);
$lexiconEntries = $this->helperComponent->getAllLexiconEntries($context, $salesChannelId, $this->config, true);
$cbaxModulLexicon['byChar'] = $this->helperComponent->getLexiconEntryByChar($context, $request, $lexiconEntries);
if ($this->config['newestEntriesActive'])
{
$cbaxModulLexicon['newestEntries'] = $this->helperComponent->getNewestEntries($lexiconEntries, $this->config['newestEntriesCount']);
}
if ($this->config['mostreadEntriesActive'])
{
$cbaxModulLexicon['mostReadEntries'] = $this->helperComponent->getMostReadEntries($lexiconEntries, $this->config['mostreadEntriesCount'], empty($this->config['newestEntriesActive']));
}
$cbaxModulLexicon['page'] = 'index';
$linkIndex = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.index', '/cbax/lexicon/index', $context, $request);
$breadcrumbLinkName = $this->container->get('translator')->trans('cbaxLexicon.page.breadcrumb.name');
$breadcrumb[] = array(
'link' => $linkIndex,
'name' => $breadcrumbLinkName,
'active' => true,
'translated' => array(
'name' => $breadcrumbLinkName
)
);
return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
'cbaxModulLexicon' => $cbaxModulLexicon,
'page' => $page,
'breadcrumbList' => $breadcrumb
]);
}
/**
* @HttpCache()
* @Route("/cbax/lexicon/listing/{char?}", name="frontend.cbax.lexicon.listing", options={"seo"=true}, methods={"GET"})
*/
public function listing(Request $request, Context $context): Response
{
$salesChannelContext = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$salesChannelId = $salesChannelContext->getSalesChannelId();
$this->config = $this->config ?? $this->systemConfigService->get(self::CONFIG_PATH, $salesChannelId);
if (empty($this->config['active'])) {
return $this->forwardToRoute('frontend.home.page');
}
// Standard Page Object für Breadcrumb erzeugen
$page = $this->genericLoader->load($request, $salesChannelContext);
$char = $request->get('char');
if (empty($char)) {
return $this->forwardToRoute('frontend.cbax.lexicon.index');
}
$lexiconEntries = $this->helperComponent->getAllLexiconEntries($context, $salesChannelId, $this->config);
$cbaxModulLexicon['byChar'] = $this->helperComponent->getLexiconEntryByChar($context, $request, $lexiconEntries);
$cbaxModulLexicon['char'] = $char;
$cbaxModulLexicon['entries'] = $this->helperComponent->getEntriesByChar($cbaxModulLexicon['byChar'], $char);
$cbaxModulLexicon['page'] = 'listing';
$linkIndex = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.index', '/cbax/lexicon/index', $context, $request);
$linkListing = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.listing' , '/cbax/lexicon/listing/' . $char, $context, $request);
$breadcrumbLinkName = $this->container->get('translator')->trans('cbaxLexicon.page.breadcrumb.name');
$breadcrumb[] = array(
'link' => $linkIndex,
'name' => $breadcrumbLinkName,
'translated' => array(
'name' => $breadcrumbLinkName
)
);
$breadcrumb[] = array(
'link' => $linkListing,
'name' => $char,
'active' => true,
'translated' => array(
'name' => $char
)
);
return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
'cbaxModulLexicon' => $cbaxModulLexicon,
'page' => $page,
'breadcrumbList' => $breadcrumb
]);
}
/**
* @HttpCache()
* @Route("/cbax/lexicon/detail/{id?}", name="frontend.cbax.lexicon.detail", options={"seo"=true}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
*/
public function detail(Request $request, Context $context): Response
{
$salesChannelContext = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$salesChannelId = $salesChannelContext->getSalesChannelId();
$this->config = $this->config ?? $this->systemConfigService->get(self::CONFIG_PATH, $salesChannelId);
if (empty($this->config['active'])) {
return $this->forwardToRoute('frontend.home.page');
}
$lexiconId = $request->get('id');
if (empty($lexiconId)) {
return $this->forwardToRoute('frontend.cbax.lexicon.index');
}
$entry = $this->helperComponent->getEntry($context, $lexiconId);
// vormals ajax page
if ($request->isXmlHttpRequest()) {
$cbaxModulLexicon['entry'] = $entry;
$cbaxModulLexicon['modalTitle'] = $this->config['headline'];
// Impressions hochsetzen -> Muss später in Ajax Funktion
$this->helperComponent->updateImpressions($context, $cbaxModulLexicon['entry']);
return $this->renderStorefront('@Storefront/storefront/cbax-lexicon/page/ajax.html.twig', [
'cbaxModulLexicon' => $cbaxModulLexicon
]);
}
// Standard Page Object für Breadcrumb erzeugen
$page = $this->genericLoader->load($request, $salesChannelContext);
if (empty($entry)) {
return $this->forwardToRoute('frontend.cbax.lexicon.index');
}
$shopUrl = $request->attributes->get(RequestTransformer::STOREFRONT_URL);
if ($this->config['activeLexicon']) {
$translatedEntry = $entry->getTranslated();
$translatedEntry['descriptionLong'] = $this->lexiconReplacer->getReplaceText($translatedEntry['descriptionLong'], $salesChannelId, $shopUrl, $context, $request, $this->config, $lexiconId);
$translatedEntry['description'] = $this->lexiconReplacer->getReplaceText($translatedEntry['description'], $salesChannelId, $shopUrl, $context, $request, $this->config, $lexiconId);
$entry->setTranslated($translatedEntry);
}
$char = $this->helperComponent->getCharByEntry($entry);
// Impressions hochsetzen -> Muss später in Ajax Funktion
$this->helperComponent->updateImpressions($context, $entry);
$lexiconEntries = $this->helperComponent->getAllLexiconEntries($context, $salesChannelId, $this->config);
$cbaxModulLexicon['byChar'] = $this->helperComponent->getLexiconEntryByChar($context, $request, $lexiconEntries);
$cbaxModulLexicon['entry'] = $entry;
$cbaxModulLexicon['char'] = $char;
$cbaxModulLexicon['entries'] = $this->helperComponent->getEntriesByChar($cbaxModulLexicon['byChar'], $char);
$cbaxModulLexicon['products'] = $this->helperComponent->getProducts($context, $entry, $salesChannelContext);
$cbaxModulLexicon['pagination'] = $this->helperComponent->getPagination($cbaxModulLexicon['entries'], $entry);
$cbaxModulLexicon['page'] = 'detail';
$linkIndex = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.index', '/cbax/lexicon/index', $context, $request);
$linkListing = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.listing' , '/cbax/lexicon/listing/' . $char, $context, $request);
$link_detail = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.detail', '/cbax/lexicon/detail/' . $lexiconId, $context, $request);
$breadcrumbLinkName = $this->container->get('translator')->trans('cbaxLexicon.page.breadcrumb.name');
$breadcrumb[] = array(
'link' => $linkIndex,
'name' => $breadcrumbLinkName,
'translated' => array(
'name' => $breadcrumbLinkName
)
);
$breadcrumb[] = array(
'link' => $linkListing,
'name' => $char,
'translated' => array(
'name' => $char
)
);
$breadcrumb[] = array(
'link' => $link_detail,
'name' => $entry->getTranslated()['title'],
'active' => true,
'translated' => array(
'name' => $entry->getTranslated()['title']
)
);
return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
'cbaxModulLexicon' => $cbaxModulLexicon,
'page' => $page,
'breadcrumbList' => $breadcrumb
]);
}
/**
* @HttpCache()
* @Route("/cbax/lexicon/ajax/{id?}", name="frontend.cbax.lexicon.ajax", options={"seo"=true}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
**/
//obsolet!
public function ajax(Request $request, Context $context): Response
{
$salesChannelContext = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$salesChannelId = $salesChannelContext->getSalesChannelId();
$this->config = $this->config ?? $this->systemConfigService->get(self::CONFIG_PATH, $salesChannelId);
if (empty($this->config['active'])) {
return $this->forwardToRoute('frontend.home.page');
}
$lexiconId = $request->get('id');
if (empty($lexiconId)) {
return $this->forwardToRoute('frontend.cbax.lexicon.index');
}
return $this->forwardToRoute('frontend.cbax.lexicon.detail', array('id' => $lexiconId));
/*
if (!$request->isXmlHttpRequest()) {
return $this->forwardToRoute('frontend.cbax.lexicon.detail', array('id' => $lexiconId));
}
$cbaxModulLexicon['entry'] = $this->helperComponent->getEntry($context, $lexiconId);
$cbaxModulLexicon['modalTitle'] = $this->config['headline'];
// Impressions hochsetzen -> Muss später in Ajax Funktion
$this->helperComponent->updateImpressions($context, $cbaxModulLexicon['entry']);
return $this->renderStorefront('@Storefront/storefront/cbax-lexicon/page/ajax.html.twig', [
'cbaxModulLexicon' => $cbaxModulLexicon
]);
*/
}
/**
* @HttpCache()
* @Route("/cbax/lexicon/content", name="frontend.cbax.lexicon.content", options={"seo"=true}, methods={"GET"})
*/
public function content(Request $request, Context $context): Response
{
$salesChannelContext = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
$salesChannelId = $salesChannelContext->getSalesChannelId();
$this->config = $this->config ?? $this->systemConfigService->get(self::CONFIG_PATH, $salesChannelId);
if (empty($this->config['active'])) {
return $this->forwardToRoute('frontend.home.page');
}
// Standard Page Object für Breadcrumb erzeugen
$page = $this->genericLoader->load($request, $salesChannelContext);
$lexiconEntries = $this->helperComponent->getAllLexiconEntries($context, $salesChannelId, $this->config);
$cbaxModulLexicon['byChar'] = $this->helperComponent->getLexiconEntryByChar($context, $request, $lexiconEntries);
$cbaxModulLexicon['page'] = 'content';
$linkIndex = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.index', '/cbax/lexicon/index', $context, $request);
$link_content = $this->lexiconSeo->getSeoUrl('frontend.cbax.lexicon.content' , '/cbax/lexicon/content', $context, $request);
$breadcrumbLinkName = $this->container->get('translator')->trans('cbaxLexicon.page.breadcrumb.name');
$breadcrumbLinkContent = $this->container->get('translator')->trans('cbaxLexicon.page.navigation.linkContent');
$breadcrumb[] = array(
'link' => $linkIndex,
'name' => $breadcrumbLinkName,
'translated' => array(
'name' => $breadcrumbLinkName
)
);
$breadcrumb[] = array(
'link' => $link_content,
'name' => $breadcrumbLinkContent,
'active' => true,
'translated' => array(
'name' => $breadcrumbLinkContent
)
);
return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
'cbaxModulLexicon' => $cbaxModulLexicon,
'page' => $page,
'breadcrumbList' => $breadcrumb
]);
}
}