<?php
/**
* File FrontController.php.
*
* @package AWCmsBundle\Controller
* @author Fabien UNG
* @since 10/12/2015 16:58
* @version 1.0.0
* @copyright Copyright (c) 2015, Fabien UNG
*/
namespace AWCmsBundle\Controller;
use AWCmsBundle\Element\ElementFactory;
use AWCmsBundle\Entity\Banner;
use AWCmsBundle\Entity\Element\Element;
use AWCmsBundle\Entity\FlashInfo;
use AWCmsBundle\Entity\FlashInfoConfiguration;
use AWCmsBundle\Entity\Page;
use AWCmsBundle\Entity\PageVersion;
use AWCmsBundle\Entity\PopIn;
use AWCmsBundle\Entity\Site;
use AWCmsBundle\Entity\Slug\Slug;
use AWCmsBundle\EventListener\CacheListener;
use AWCmsBundle\Exception\CmsException;
use AWCmsBundle\Manager\BlocManager;
use AWCmsBundle\Manager\MenuTreeManager;
use AWCmsBundle\Manager\PageManager;
use AWCmsBundle\Manager\RedirectionManager;
use AWCmsBundle\Manager\SiteManager;
use AWCmsBundle\Manager\SlugManager;
use AWCmsBundle\Repository\FlashInfoRepository;
use AWCmsBundle\Manager\SitemapManager;
use AWCmsBundle\Security\CurrentUserProvider;
use AWCmsBundle\Slug\SlugRedirector;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Class FrontController
* @package AWCmsBundle\Controller
*/
class FrontController extends AbstractController
{
/**
* @Route("/robots.txt", name="_robots")
* @param SiteManager $siteManager
* @return Response
*/
public function robotsAction(SiteManager $siteManager)
{
$site = $siteManager->getSite();
if(!$site){
throw new NotFoundHttpException();
}
$siteMap = 'Sitemap: '.$this->generateUrl('_sitemap', [], UrlGeneratorInterface::ABSOLUTE_URL);
$response = new Response($site->getRobot($siteMap));
$response->headers->set('Content-Type', 'text/plain');
return $response;
}
/**
* @Route("/sitemap.xml",name="_sitemap")
* @param SiteManager $siteManager
* @param SitemapManager $sitemapManager
* @return Response
*/
public function sitemapAction(SiteManager $siteManager, SitemapManager $sitemapManager)
{
$site = $siteManager->getSite();
$xml = $sitemapManager->generateXml($site);
$response = new Response($xml);
$response->headers->set('Content-Type','text/xml');
return $response;
}
/**
* @Route("/page/{page}",name="show_page")
* @param MenuTreeManager $menuTreeManager
* @param SiteManager $siteManager
* @param BlocManager $blocManager
* @param Request $request
* @param Page $page
* @param PageManager $pageManager
* @param CurrentUserProvider $currentUserProvider
* @param null $pageVersion
* @return array|RedirectResponse|Response
* @Template
*/
public function pageAction(MenuTreeManager $menuTreeManager,
SiteManager $siteManager,
BlocManager $blocManager,
Request $request,
Page $page,
PageManager $pageManager,
CurrentUserProvider $currentUserProvider,
$pageVersion = null
)
{
$this->get('twig')->addGlobal('current_page', $page);
$isViewer = $siteManager->isViewer();
$isPreview = $siteManager->isPreview();
$site = $siteManager->getSite();
$user = $currentUserProvider->get();
if($user === null and $site === null){
return $this->redirectToRoute('user_security_admin_login');
} else {
if($pageVersion){
$pageVersion = $this->getDoctrine()->getRepository(PageVersion::class)->find($pageVersion);
}
elseif($isViewer or $isPreview){
$pageVersion = $page->getDraftVersion();
}
else{
$pageVersion = $page->getPublishedVersion();
}
$blocsTemplates = [];
foreach ($pageVersion->getBlocs() as $bloc) {
$blocsTemplates[] = $blocManager->render($bloc, $siteManager->isViewer(), $siteManager->isPreview());
}
$breadcrumb = $menuTreeManager->getBreadcrumb($page->getMenuTree());
/** @var Banner $banner */
$banner = $this->getDoctrine()->getRepository(Banner::class)->findOneBy(['site' => $site, 'typePage' => $page->getTypePage()]);
$images = [];
if ($banner && $banner->getTypeBanner() === 'DP') {
$images = $banner->getImages();
}
$pageManager->setPage($page);
return [
'site' => $site,
'page' => $page,
'isViewer' => $isViewer,
'isPreview' => $siteManager->isPreview(),
'blocsTemplates' => $blocsTemplates,
'breadcrumb' => $breadcrumb,
'images' => $images,
'banner' => $banner,
'status_code' => ($page === $site->getRedirectPageOn404()) ? 404 : 200
];
}
}
public function flashMessageAction(){
return $this->render('@AWCms/front/flash_message.html.twig');
}
public function flashInfoAction(EntityManagerInterface $em, PageManager $pageManager, SiteManager $siteManager){
/** @var FlashInfoConfiguration $configuration */
$configuration = $em->getRepository(FlashInfoConfiguration::class)->findOneBy(['site' => $siteManager->getSite()->getId()]);
$flashInfos = [];
if($configuration){
if($configuration->isOnlyOnHomepage() and $pageManager->getPage() and $pageManager->getPage()->isHomePage()){
$flashInfos = $em->getRepository(FlashInfo::class)->findByActualDateAndEnabled();
}
elseif(!$configuration->isOnlyOnHomepage()){
$flashInfos = $em->getRepository(FlashInfo::class)->findByActualDateAndEnabled();
}
}
return $this->render('@AWCms/front/flash_info.html.twig', [
'flashInfos' => $flashInfos,
'configuration' => $configuration
]);
}
public function popInAction(EntityManagerInterface $em, PageManager $pageManager, SiteManager $siteManager){
/** @var PopIn $configuration */
$popIn = $em->getRepository(PopIn::class)->findOneBy(['site' => $siteManager->getSite()->getId()]);
$render = false;
if($popIn and $popIn->getStatus() == PopIn::STATUS_ONLINE){
if($popIn->getDisplayZone() == PopIn::DISPLAY_ZONE_HOME_PAGE and $pageManager->getPage() and $pageManager->getPage()->isHomePage()){
$render = true;
}
if($popIn->getDisplayZone() == PopIn::DISPLAY_ZONE_ALL_PAGES){
$render = true;
}
}
return $this->render('@AWCms/front/pop_in.html.twig', [
'popIn' => $popIn,
'render' => $render
]);
}
/**
* @param Page $page
* @Route("/style/page{page}.css", name="awcms_page_css")
* @return Response
*/
public function styleAction(Page $page)
{
$response = new Response(
$this->render('@AWCms/front/style.css.twig',
['page' => $page])->getContent(),
200,
array('Content-Type' => 'text/css')
);
$response->setMaxAge(300);
$response->headers->addCacheControlDirective('must-revalidate', false);
$response->headers->addCacheControlDirective('public', true);
$response->headers->set(CacheListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true');
return $response;
}
/**
* @param Page $page
* @Route("/js/page{page}.js", name="awcms_page_js")
* @return Response
*/
public function javaScriptAction(Page $page)
{
$response = new Response(
$this->render('@AWCms/front/java_script.js.twig',
['page' => $page])->getContent(),
200,
array('Content-Type' => 'text/javascript')
);
$response->setMaxAge(300);
$response->headers->addCacheControlDirective('must-revalidate', false);
$response->headers->addCacheControlDirective('public', true);
$response->headers->set(CacheListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true');
return $response;
}
/**
* @Route("/render/{element}", name="awcms_front_element_render", requirements={"element"="\d+"}, options={"expose"=true})
*/
public function renderAction(ElementFactory $elementFactory, Element $element)
{
$elementManager = $elementFactory->getManager($element->getType());
return new Response($elementManager->render($element, false, false));
}
/**
* Removing / at the end of url ex: /fr/contact/ -> /fr/contact
* @Route("/{url}", name="remove_trailing_slash",
* requirements={"url" = "^((?!admin).)*\/$"}, methods={"GET"})
*/
public function removeTrailingSlashAction(Request $request)
{
$pathInfo = $request->getPathInfo();
$requestUri = $request->getRequestUri();
$url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);
return $this->redirect($url, 301);
}
/**
* @Route("/", name="show_home_page")
* @Route(
* "/{slug}",
* name="awcms_front_slug",
* requirements={"slug"="^(?!(admin|api))([a-zA-Z0-9-/]*)"},
* options={"expose"=true}
* )
* @Route(
* "/{uri}",
* name="awcms_front_no_locale",
* requirements={"uri"="^(?!(([a-z]{2}\/admin)|api|_)).+"},
* options={"i18n"=false}
* )
* @ParamConverter("slug", options={"mapping":{"slug":"slug"}})
* @param SiteManager $siteManager
* @param SlugManager $slugManager
* @param Request $request
* @param $slug
* @return Response
*/
public function slugAction(
SiteManager $siteManager,
SlugManager $slugManager,
PageManager $pageManager,
Request $request,
$slug = null, $uri = null)
{
if(!$siteManager->getSite()){
return $this->redirectToRoute('user_security_admin_login');
}
// show homepage
if($slug === null and $uri === null){
$page = $pageManager->getHomePage($siteManager->getSite());
$slugEntity = $page->getSlugEntity();
return $slugManager->forwardSlug($slugEntity, $request);
}
if($slug === null and $uri !== null){
throw new NotFoundHttpException();
}
/** @var Slug|null $slugEntity */
$slugEntity = $slugManager
->findOneBySlugSiteAndLocale($slug, $siteManager->getSite(), $request->getLocale());
if(null === $slugEntity){
throw new NotFoundHttpException();
}
return $slugManager->forwardSlug($slugEntity, $request);
}
}