<?php
namespace MentalSchool\AppBundle\EventListener;
use MentalSchool\AppBundle\Entity\IPClient;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class LanguageListener
{
private $token_storage;
private $securityContext;
private $container;
public function __construct(ContainerInterface $containerInterface)
{
$this->container = $containerInterface;
$this->securityContext = $this->container->get('security.authorization_checker');
$this->token_storage = $this->container->get('security.token_storage');;
}
public function setLocale(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$securityToken = $this->token_storage->getToken();
if ($securityToken && $securityToken->getUser() === 'anon.') {
$requestLocale = $event->getRequest()->get('locale');
$referer = $_SERVER['HTTP_REFERER'] ?? "";
if ($requestLocale == 'ru' &&
(
strpos($referer, "google") !== false ||
strpos($referer, "yahoo") !== false ||
strpos($referer, "yandex") !== false
)) {
header("Location: https://school.abacusarithmetic.com/admin/login?locale=uk");
exit;
}
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip_address = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip_address = $_SERVER['REMOTE_ADDR'];
}
$em = $this->container->get('doctrine.orm.entity_manager');
$objectLang = $em->getRepository('AppBundle:IPClient')->findBy(['ip' => $ip_address]);
if (!empty($objectLang[0])) {
$objectLang = $objectLang[0];
if ($requestLocale) {
$objectLang->setLanguage($requestLocale);
$em->flush();
}
$locale = $objectLang->getLanguage();
} else {
if ($requestLocale) {
$newIPClient = new IPClient();
$newIPClient->setIp($ip_address);
$newIPClient->setLanguage($requestLocale);
$em->persist($newIPClient);
$em->flush();
$locale = $requestLocale;
} else {
$locale = $event->getRequest()->getSession()->get('_locale') ?? "uk";
}
}
} else {
if(!$securityToken){
$locale = $event->getRequest()->getSession()->get('_locale');
}else {
$locale = $securityToken->getUser()->getLanguage() ?? $event->getRequest()->getSession()->get('_locale');
}
}
if ($locale) {
$request = $event->getRequest();
$request->setLocale($locale);
$translator = $this->container->get('translator');
$translator->setLocale($locale);
}
}
}