<?php
namespace App\EventSubscriber;
use App\Env;
use App\Func;
use App\DTO\AppDTO;
use App\DTO\PageDTO;
use App\Entity\Cart;
use App\Entity\Sett;
use App\Entity\User;
use App\Entity\Block;
use App\Entity\Order;
use App\Entity\Timer;
use Twig\Environment;
use App\Entity\Banner;
use App\Entity\Labels;
use App\Model\Wishlist;
use App\Entity\Template;
use App\GlobalVars\Blocks;
use App\Service\Auth\Auth;
use App\Entity\Transaction;
use App\GlobalVars\Templates;
use App\Entity\Page as EntityPage;
use App\Repository\PageRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\GlobalVars\Sett as GlobalVarsSett;
use Symfony\Contracts\Cache\ItemInterface;
use App\Entity\Translation\PageTranslation;
use App\Entity\Translation\SettTranslation;
use Symfony\Contracts\Cache\CacheInterface;
use App\Entity\Translation\TimerTranslation;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use App\GlobalVars\Labels as GlobalVarsLabels;
use App\Entity\Translation\TemplateTranslation;
use Symfony\Contracts\Cache\TagAwareCacheInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class GlobalVars implements EventSubscriberInterface
{
private $no_cache = false;
private Environment $twig;
private EntityManagerInterface $em;
private CacheInterface $Cache;
private Auth $Auth;
private Env $Env;
private Func $Func;
private Wishlist $Wishlist;
private ?AppDTO $app;
// Temp
private $_pagename;
public function __construct(AppDTO $app, Environment $twig, EntityManagerInterface $em, TagAwareCacheInterface $appCache, Auth $Auth, Env $Env, Func $Func, Wishlist $Wishlist, Security $security)
{
$this->twig = $twig;
$this->em = $em;
$this->app = $app;
$this->Cache = $appCache;
$this->Auth = $Auth;
$this->Auth->setUser($security->getUser());
$this->Env = $Env;
$this->Func = $Func;
$this->Wishlist = $Wishlist;
}
public function onKernelController(ControllerEvent $event): void
{
$this->setDefaultLocale($event->getRequest());
$this->setLang($event->getRequest());
$this->setEnv($event->getRequest());
$this->setOpt($event->getRequest());
$this->setFunc($event->getRequest());
$this->setArgs($event->getRequest());
$this->setSett($event->getRequest());
$this->setLabels($event->getRequest());
$this->setBlocks($event->getRequest());
$this->setTemplates($event->getRequest());
$this->setPage($event->getRequest());
$this->setBc($event->getRequest());
$this->setServerVars($event->getRequest());
$this->setIsCallAvailable($event->getRequest());
$this->setSearchQueries($event->getRequest());
$this->setAuth();
$this->setWishlistArray();
}
private function setDefaultLocale(Request $request)
{
if (!$request->getLocale()) {
$request->setLocale($request->getDefaultLocale());
}
}
private function setLang(Request $request)
{
$this->app->lang = $request->getLocale();
}
private function setEnv(Request $request)
{
$this->twig->addGlobal('env', $this->Env);
}
private function setOpt(Request $request)
{
if (Env::is_opt()) {
$this->em->getClassMetadata(EntityPage::class)->setPrimaryTable(['name' => 'opt_page']);
$this->em->getClassMetadata(PageTranslation::class)->setPrimaryTable(['name' => 'opt_page_translation']);
$this->em->getClassMetadata(Banner::class)->setPrimaryTable(['name' => 'opt_banner']);
$this->em->getClassMetadata(Cart::class)->setPrimaryTable(['name' => 'opt_cart']);
$this->em->getClassMetadata(Order::class)->setPrimaryTable(['name' => 'opt_order']);
$this->em->getClassMetadata(Sett::class)->setPrimaryTable(['name' => 'opt_sett']);
$this->em->getClassMetadata(SettTranslation::class)->setPrimaryTable(['name' => 'opt_sett_translation']);
$this->em->getClassMetadata(Template::class)->setPrimaryTable(['name' => 'opt_template']);
$this->em->getClassMetadata(TemplateTranslation::class)->setPrimaryTable(['name' => 'opt_template_translation']);
$this->em->getClassMetadata(Timer::class)->setPrimaryTable(['name' => 'opt_timer']);
$this->em->getClassMetadata(TimerTranslation::class)->setPrimaryTable(['name' => 'opt_timer_translation']);
$this->em->getClassMetadata(Transaction::class)->setPrimaryTable(['name' => 'opt_transaction']);
$this->em->getClassMetadata(User::class)->setPrimaryTable(['name' => 'opt_user']);
}
}
private function setFunc(Request $request)
{
$this->twig->addGlobal('func', $this->Func);
}
private function setArgs(Request $request)
{
$args = preg_split("/\//", $request->getPathInfo(), -1, PREG_SPLIT_NO_EMPTY);
if (in_array($request->getLocale(), $args)) {
array_shift($args);
}
$this->twig->addGlobal('args', $args);
}
private function setSett(Request $request)
{
if ($this->no_cache) {
$this->Cache->delete('sett_'.$request->getLocale());
}
$sett = $this->Cache->get('sett_'.$request->getLocale(), function(ItemInterface $item) {
$item->expiresAfter(3000000);
$item->tag(['sett']);
$Setts = $this->em->getRepository(Sett::class);
$fromDb = $Setts->findAll();
return $this->toArray($fromDb);
});
$sett_array = [];
foreach ($sett as $key => $value)
{
$sett_array[$key] = (string) $value;
}
$this->app->sett = new GlobalVarsSett($sett_array);
$this->twig->addGlobal('sett', $this->app->sett);
}
private function setLabels(Request $request)
{
if ($this->no_cache) {
$this->Cache->delete('labels_'.$request->getLocale());
}
$labels = $this->Cache->get('labels_'.$request->getLocale(), function(ItemInterface $item) {
$Labels = $this->em->getRepository(Labels::class);
$item->expiresAfter(3000000);
$item->tag(['labels']);
$fromDb = $Labels->findAll();
return $this->toArray($fromDb);
});
$labels_array = [];
foreach ($labels as $key => $value)
{
$labels_array[$key] = (string) $value;
}
$this->app->labels = new GlobalVarsLabels($labels_array);
$this->twig->addGlobal('labels', $this->app->labels);
}
private function setBlocks(Request $request)
{
if ($this->no_cache) {
$this->Cache->delete('blocks_'.$request->getLocale());
}
$blocks = $this->Cache->get('blocks_'.$request->getLocale(), function(ItemInterface $item) {
$item->expiresAfter(3000000);
$item->tag(['block']);
$Blocks = $this->em->getRepository(Block::class);
$fromDb = $Blocks->findAll();
return $this->toArray($fromDb);
});
$blocks_array = [];
foreach ($blocks as $key => $value)
{
$blocks_array[$key] = (string) $value;
}
$this->app->blocks = new Blocks($blocks_array);
$this->twig->addGlobal('blocks', $this->app->blocks);
}
private function setTemplates(Request $request)
{
if ($this->no_cache) {
$this->Cache->delete('templates_'.$request->getLocale());
}
$templates = $this->Cache->get('templates_'.$request->getLocale(), function(ItemInterface $item) {
$item->expiresAfter(3000000);
$item->tag(['template']);
$Templates = $this->em->getRepository(Template::class);
$fromDb = $Templates->findAll();
return $this->toArray($fromDb);
});
$templates_array = [];
foreach ($templates as $key => $value)
{
$templates_array[$key] = (string) $value;
}
$this->app->templates = new Templates($templates_array);
$this->twig->addGlobal('templates', $this->app->templates);
}
private function setPage(Request $request)
{
$this->app->page = new PageDTO();
$this->_pagename = $this->pageName($request->getLocale(), $request->getPathInfo());
$pageFromCache = $this->Cache->get('page_'.$this->_pagename.'_'.$request->getLocale(), function(ItemInterface $item) {
$intname = trim(str_replace("_", "/", $this->_pagename), "/");
$Pages = $this->em->getRepository(EntityPage::class);
$item->expiresAfter(3000000);
$item->tag(['page']);
$pageFromDb = $Pages->findOneBy(['intname' => $intname]);
return $pageFromDb;
});
if ($pageFromCache) {
$this->app->page->intname = $pageFromCache->getIntname();
$this->app->page->title = $pageFromCache->getTitle();
$this->app->page->descr = $pageFromCache->getDescr();
$this->app->page->kw = $pageFromCache->getKw();
$this->app->page->h1 = $pageFromCache->getH1();
$this->app->page->cont = $pageFromCache->getCont();
}
$this->twig->addGlobal('page', $this->app->page);
}
private function setBc(Request $request)
{
$this->app->page->bc = ['/'.$request->getLocale().'/' => $this->app->labels->get('home')];
$this->twig->addGlobal('bc', $this->app->page->bc);
}
private function setServerVars(Request $request)
{
$this->app->host = $_SERVER['HTTP_HOST'];
$this->twig->addGlobal('host', $_SERVER['HTTP_HOST']);
$this->twig->addGlobal('request_uri', $_SERVER['REQUEST_URI']);
}
private function setIsCallAvailable(Request $request)
{
$isCallAvailable = 1;
if ($this->app->labels->get('tel-timezone')) {
//date_default_timezone_set($this->app->labels->get('tel-timezone'));
}
if((date('H') < (int)$this->app->labels->get('tel-start')) || (date('H') >= (int) $this->app->labels->get('tel-end'))) {
$isCallAvailable = 0;
}
$this->twig->addGlobal('isCallAvailable', $isCallAvailable);
}
private function setSearchQueries(Request $request)
{
$queries = json_decode($this->app->labels->get('search_queries_'.Env::site()), true);
$rqueries = [];
if(is_array($queries)) {
$c = count($queries);
if ($c > 8) $c = 8;
$rqueries = array_rand($queries, $c);
}
$this->twig->addGlobal('search_queries', $queries);
$this->twig->addGlobal('search_queries_rand', $rqueries);
}
private function setAuth()
{
$this->twig->addGlobal('Auth', $this->Auth);
}
private function setWishlistArray()
{
$ids = $this->Wishlist->getProdIds($this->Auth->userid());
$this->twig->addGlobal('wishlistids', $ids);
}
private function toArray(array $entities): array
{
$arr = [];
foreach ($entities as $k => $v) {
$arr[$v->getIntname()] = $v->getValue();
}
return $arr;
}
private function pageName(string $locale, string $pathInfo): string
{
$name = str_replace($locale."/", '', $pathInfo);
return str_replace("/", "_", $name);
}
public static function getSubscribedEvents(): array
{
return [
'kernel.controller' => 'onKernelController',
];
}
}