<?php
namespace Uniski\CMSBundle\Controller;
// IvoryGoogleMapBundle eliminado en migración Sf4 — mapa renderizado con JS directo
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Uniski\CMSBundle\Entity\Offer;
use Uniski\CMSBundle\Entity\Page;
use Uniski\CMSBundle\Form\WebForm\InfoFormType;
use Uniski\CMSBundle\Form\WebForm\InfoSchoolGroupsFormType;
use Uniski\ConfigBundle\Entity\Category;
use Uniski\ConfigBundle\Factory\ConfigurationFactory;
use Uniski\ResourceBundle\Controller\BaseController;
use Uniski\ResourceBundle\Entity\Hotel;
use Uniski\ResourceBundle\Entity\Product;
class PageController extends BaseController
{
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
$offerManager = $this->get('app.offer_manager');
$offers = $offerManager->getOffers(['frontpage' => 'all']);
$topPosts = $this->getRepository(\Uniski\CMSBundle\Entity\Post::class)->findByStick(true, ['created' => 'DESC']);
$posts = $this->getRepository(\Uniski\CMSBundle\Entity\Post::class)->findByStick(false, ['created' => 'DESC'], 8);
$config = $this->get('app.config_manager')
->get(ConfigurationFactory::HOMEPAGE)
->getSettings();
$sections = [
[
'offers' => $offerManager->filterByFrontpage($offers, Offer::FRONTPAGE_SECTION_1),
'title' => $config['section_1']['title']
],
[
'offers' => $offerManager->filterByFrontpage($offers, Offer::FRONTPAGE_SECTION_2),
'title' => $config['section_2']['title']
],
[
'offers' => $offerManager->filterByFrontpage($offers, Offer::FRONTPAGE_SECTION_3),
'title' => $config['section_3']['title']
],
];
$response = $this->render("page/home.html.twig", [
'sliderOffers' => $offerManager->filterByFrontpage($offers, Offer::FRONTPAGE_SLIDER),
'sections' => $sections,
'topPosts' => $topPosts,
'posts' => $posts,
'menu' => 'homepage',
'search' => $this->get('app.search_manager')->createSearch(),
'config' => $config
]);
$response->setSharedMaxAge(86400);
$response->headers->addCacheControlDirective('must-revalidate', true);
return $response;
}
/**
* @Route("hoteles", name="hotels_page")
*/
public function hotelsAction(Request $request)
{
return $this->forward('Uniski\CommerceBundle\Controller\SearchController::searchAction', [
'target' => 'hotels',
'request' => $request
]);
}
/**
* @Route("destinos", name="destinations_page")
*/
public function destinationsAction(Request $request)
{
return $this->forward('Uniski\CommerceBundle\Controller\SearchController::searchAction', [
'target' => 'destinations',
'request' => $request
]);
}
/**
* @Route("hotel/{slug}", name="hotel_show")
*/
public function hotelShowAction(Hotel $hotel, Request $request)
{
$productPriceService = $this->get('app.product_price_service');
$offerManager = $this->get('app.offer_manager');
$searchManager = $this->get('app.search_manager');
$search = $searchManager->createSearch();
$map = null;
$products = [];
$search['entity']['value'] = $hotel->getId();
$allProducts = $this->getRepository(\Uniski\ResourceBundle\Entity\Product::class)->findByZone($hotel->getZone());
foreach ($allProducts as $product) {
$products[] = [
'product' => $product,
'minPrice' => $offerManager->calculateMinPrice($product)
];
}
if ($hotel->getAddress() &&
$hotel->getAddress()->hasCoordinates()) {
$map = [
'latitude' => $hotel->getAddress()->getLatitude(),
'longitude' => $hotel->getAddress()->getLongitude(),
'zoom' => 15,
];
}
return $this->render('hotel/show.html.twig',[
'hotel' => $hotel,
'map' => $map,
'search' => $search,
'products' => $products
]);
}
/**
* @Route("/ofertas/ski/{slug}")
*/
public function destinationsByZoneAction(Category $zone, Request $request)
{
return $this->forward('Uniski\CommerceBundle\Controller\SearchController::searchAction', [
'target' => $zone,
'request' => $request
]);
}
/**
* @Route("/contacto", name="contact_page")
*/
public function contactAction(Request $request)
{
$form = $this->get('app.webform_manager')->submitWebForm($request);
return $this->render('page/contact.html.twig', [
'form' => $form->createView(),
'menu' => 'contact'
]);
}
/**
* @Route("/aviso-legal", name="legal_notice_page")
*/
public function legalNoticeAction()
{
return $this->render('page/legal_notice.html.twig', []);
}
public function footerMenuAction($region)
{
$menus = $this->getRepository(\Uniski\CMSBundle\Entity\Menu::class)->findAll();
$menu = $menus[$region];
return $this->render("page/footer-menu.html.twig", [
'menu' => $menu
]);
}
/**
* @Route("/politica-cookies", name="cookies_policy_page")
*/
public function cookiesPolicyAction()
{
return $this->render('page/cookies_policy.html.twig', []);
}
public function backgroundAction()
{
$background = null;
$imageRepo = $this->getRepository(\Uniski\ResourceBundle\Entity\Image::class);
$config = $this->get('app.config_manager')
->get(ConfigurationFactory::HOMEPAGE)
->getSettings();
if (!empty($config['background'])) {
$background = $imageRepo->find($config['background']);
}
return $this->render('default/background.html.twig', [
'background' => $background
]);
}
/**
* @Route("/{prefix}/{slug}", name="show_page",)
* @Route("/{slug}")
*/
public function showPageAction(Page $page, Request $request)
{
//Avoid duplicated pages
if ($request->get('_route') != 'show_page' && $page->getPrefix()) {
return $this->redirectToRoute("show_page", [
'prefix' => $page->getPrefix(),
'slug' => $page->getSlug()
], 301);
}
$webformService = $this->get('app.webform_manager');
$form = null;
$template = null;
if ($page->getWebForm()) {
$form = $webformService->submitWebForm($request, $page->getWebForm(), [
'page' => $page
]);
$template = $this->getTemplateFromForm($page->getWebForm());
}
$offerManager = $this->get('app.offer_manager');
$offers = $offerManager->getOffers(['page' => $page]);
$response = $this->render('page/show.html.twig', [
'page' => $page,
'offers' => $offers,
'menu' => $page->getSlug(),
'form' => $form ? $form->createView() : null,
'webformTemplate' => $template,
'search' => $this->get('app.search_manager')->createSearch(),
]);
$response->setSharedMaxAge(86400);
$response->headers->addCacheControlDirective('must-revalidate', true);
return $response;
}
/**
*
*
* DO NOT ADD MORE ROUTES AFTER THIS LINES!!!!!
*
*
*/
private function getTemplateFromForm($webform)
{
switch ($webform) {
case InfoFormType::class:
return 'webform/info.html.twig';
case InfoSchoolGroupsFormType::class:
return 'webform/school_groups.html.twig';
}
}
}