<?php
namespace WebBundle\Controller;
use Exception;
use FlexApp\DTO\RequestCatalogDTO;
use FlexApp\Helper\MetaHelper;
use Import1CBundle\Helper\v4\TranslitNameHelper;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use WebBundle\Helper\App;
use WebBundle\Helper\CookieHelper;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\PathHelper;
use WebBundle\Helper\RequestHelper;
use WebBundle\Helper\UserHelper;
use WebBundle\Repository\CollectionRepository;
use WebBundle\Repository\FilterRepository;
use WebBundle\Repository\IdeaRepository;
use WebBundle\Repository\InteriorHistoryRepository;
use WebBundle\Repository\PublicationRepository;
use WebBundle\Service\PublicationService;
use WebBundle\Service\SearchService;
use WebBundle\Service\WidjetReviewService;
class HomeController extends ExtendedController
{
/** @required */
public PublicationService $publicationService;
/** @required */
public WidjetReviewService $widgetReviewService;
/** @required */
public FilterRepository $filterRepository;
/** @required */
public CollectionRepository $collectionRepository;
/** @required */
public PublicationRepository $publicationRepository;
/** @required */
public IdeaRepository $ideaRepository;
/** @required */
public InteriorHistoryRepository $interiorHistoryRepository;
public function rusAction(): Response
{
return $this->render('@Web/Home/rus.html.twig');
}
/**
* Главная страница.
*
* @return Response
* @throws Exception
*/
public function mainAction(): Response
{
$publications = $this->publicationService->page(1, 16);
$metaManager = MetaHelper::getManager();
$topCarousel = $this->filterRepository->getItemsForTopCollectionCarouselMenu();
$title = $metaManager->getTitle();
$title = TranslitNameHelper::converTitle($title);
$output = [
'publications' => $publications,
'topCarousel' => $topCarousel,
'meta' => [
'title' => $title,
'description' => $metaManager->getDescription(),
'keywords' => $metaManager->getKeywords(),
],
];
// отслеживаем посещения главной страницы
$visitCount = CookieHelper::get('visitCount', 0);
if ($visitCount < 5) {
$output['isFirstFourVisit'] = true;
$visitCount++;
CookieHelper::set('visitCount', $visitCount);
}
$ides = $this->collectionRepository->getCollectionIdes(1, 1);
$collections = $this->collectionRepository->getCollections(['ides' => $ides]);
$collection = $collections[0] ?? null;
if ($collection) {
$urlFirstCollection = PathHelper::pathGenerate('m-main', $collection);
} else {
$urlFirstCollection = '';
}
// получаем ключ блога по образцам
$output['samples'] = $this->publicationRepository->getKey(2232, App::getCurLocale());
$output['imagePreload'] = $urlFirstCollection;
return $this->render('@Web/Home/main.html.twig', $output);
}
/**
* Render carousel template
* @param string $type
* @param int $page
* @return Response
* @throws Exception
*/
public function carouselAction(string $type = 'last-collection', int $page = 1)
{
$favorites = $this->ideaRepository->getInteriorsIdeasByToken(UserHelper::getInstance()->getToken());
$limit = 20;
if ($type == 'last-collection') {
$ides = $this->collectionRepository->getCollectionIdes($page, $limit);
$colls = $this->collectionRepository->getCollections(['ides' => $ides]);
foreach ($colls as $i => $coll) {
// получение данных по наградам
if (isset($colls[$i]['awards'])) {
$colls[$i]['awards'] = [];
}
if (!empty($coll['awards'])) {
$aAwards = $this->filterRepository->getAwards($coll['awards']);
if ($aAwards) {
$colls[$i]['awards'] = $aAwards;
}
}
// проверяем наличие выставок и получаем по ним данные, если есть
$exhibitions = [];
// скрыл бирки выставок с карусели новинок сайта
// if (!empty($coll['exhibition'])) {
// $exhibitions = $filterRepo->getExhibitions($coll['exhibition']);
// }
$colls[$i]['exhibition'] = $exhibitions;
$colls[$i]['priceSort'] = LocaleHelper::getPrMin($colls[$i]);
$colls[$i]['priceSortCur'] = LocaleHelper::getCurrency();
$colls[$i]['priceSortMea'] = LocaleHelper::getUserMeasure();
}
if ($page == 1) {
$response = $this->render(
'@Web/Home/carousel-element.html.twig',
[
'type' => $type,
'withDate' => 1,
'collections' => $colls,
'favourites' => $favorites,
]
);
} else {
$response = new JsonResponse([
'html' => $this->render(
'@Web/Home/carousel-items.html.twig',
[
'withDate' => 1,
'collections' => $colls,
'favourites' => $favorites,
]
)->getContent(),
]
);
}
} else {
$colls = [];
CookieHelper::set('homeTopCarousel', $type);
if ($type == 'top-week') {
$withDate = 2;
$collTop = $this->interiorHistoryRepository->getCollections(7, $page);
CookieHelper::set('carousel', 'top-week');
} elseif ($type == 'top-month' || $type == 'top-20') {
$withDate = 2;
$collTop = $this->interiorHistoryRepository->getCollections(30, $page);
} else {
$withDate = 3;
$ides = $this->collectionRepository->getCollectionIdes($page, $limit, 'c.rating DESC, c.id');
$colls = $this->collectionRepository->getCollections(['ides' => $ides, 'order' => 'c.rating DESC, c.id']);
}
if (!empty($collTop)) {
$collections = $this->collectionRepository->getCollections(['ides' => array_keys($collTop), 'showMain' => true]);
foreach ($collections as $row) {
$colls[$collTop[$row['id']]['key']] = array_merge($row, $collTop[$row['id']]);
}
ksort($colls);
}
// получение данных по наградам
foreach ($colls as $i => $coll) {
if (isset($colls[$i]['awards'])) {
$colls[$i]['awards'] = [];
}
if (!empty($coll['awards'])) {
$aAwards = $this->filterRepository->getAwards($coll['awards']);
if ($aAwards) {
$colls[$i]['awards'] = $aAwards;
}
}
// проверяем наличие выставок и получаем по ним даныне, если есть
$exhibitions = [];
if (!empty($coll['exhibition'])) {
$exhibitions = $this->filterRepository->getExhibitions($coll['exhibition']);
}
$colls[$i]['exhibition'] = $exhibitions;
$colls[$i]['priceSort'] = LocaleHelper::getPrMin($colls[$i]);
$colls[$i]['priceSortCur'] = LocaleHelper::getCurrency();
$colls[$i]['priceSortMea'] = LocaleHelper::getUserMeasure();
}
if ($page == 1 && !RequestHelper::isAjax()) {
$response = $this->render(
'@Web/Home/carousel-element.html.twig',
[
'type' => $type,
'withDate' => $withDate,
'collections' => $colls,
'favourites' => $favorites,
]
);
} else {
$response = new JsonResponse([
'html' => $this->render(
'@Web/Home/carousel-items.html.twig',
[
'type' => $type,
'withDate' => $withDate,
'collections' => $colls,
'favourites' => $favorites,
]
)->getContent(),
]
);
}
}
return $response;
}
public function setVarSessionAlertPopupAction(): JsonResponse
{
$session = $this->get('session');
if (!$session->get('alert_popup')) {
$session->set('alert_popup', '1');
}
return new JsonResponse($session->get('alert_popup'));
}
/**
* @param Request $request
* @return Response
* @throws Exception
*/
public function reviewsAction(Request $request): Response
{
$reviews = $this->widgetReviewService->getReviews($request);
$response = $this->render('@Web/Home/reviews.html.twig', [
'reviews' => $reviews,
]);
if (App::isGeneral()) {
$response->setCache([
'max_age' => 300,
's_maxage' => 300,
'public' => true,
]);
}
return $response;
}
}