<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use w3des\AdminBundle\Service\ModuleRegistry;
use Symfony\Component\HttpFoundation\Response;
use w3des\AdminBundle\Model\NodeView;
use w3des\AdminBundle\Service\Nodes;
use w3des\AdminBundle\Entity\Node;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\StreamOutput;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use Negotiation\Negotiator;
use w3des\AdminBundle\Service\CMS;
use Negotiation\LanguageNegotiator;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Routing\RouterInterface;
class HomeController extends AbstractController
{
private $pageLocales;
private CMS $cms;
public function __construct($pageLocales, CMS $cms)
{
$this->pageLocales = $pageLocales;
$this->cms = $cms;
}
public function home(Request $request, ModuleRegistry $registry, Nodes $nodes)
{
if ($request->isMethod('post') && $request->request->has('contact')) {
$v = new NodeView($nodes);
$v->model = new Node();
$v->model->setType('module.contact_form');
$res = $registry->getModule('module.contact_form')->frontend($request, $v, []);
if ($res instanceof Response && $res->getStatusCode() != 200) {
return $res;
}
}
if ($request->isMethod('post') && ($request->request->has('service') || $request->request->has('offer'))) {
$v = new NodeView($nodes);
$v->model = new Node();
$v->model->setType('module.offer_form');
$res = $registry->getModule('module.offer_form')->frontend($request, $v, []);
if ($res instanceof Response && $res->getStatusCode() != 200) {
return $res;
}
}
$currentService = $this->cms->getService();
if ($currentService == 0) {
return $this->render('home/index.html.twig', []);
} else {
return $this->render('home/bip.html.twig', []);
}
}
public function root(Request $request)
{
if ($this->isBot()) {
return $this->home($request);
}
if ($request->cookies->has('LOCALE')) {
if ($request->getLocale() != 'pl') {
return $this->redirectToRoute('homepage', [
'_locale' => $request->getLocale()
]);
}
return $this->home($request);
}
$negotiator = new \Negotiation\LanguageNegotiator();
$lang = $negotiator->getBest($request->headers->get('accept-language'), $this->pageLocales);
$lang = $lang ? $lang->getType() : 'pl';
$request->setLocale($lang);
$resp = null;
if ($lang == 'pl') {
$resp = $this->home($request);
} else {
$resp = $this->redirectToRoute('homepage', [
'_locale' => $request->getLocale()
]);
}
$resp->headers->setCookie(new Cookie('LOCALE', $lang, time() + 3600 * 24 * 7, "/", $request->getHost(), $request->isSecure(), ! $request->isSecure()));
return $resp;
}
private function isBot()
{
if (isset($_SERVER['HTTP_USER_AGENT'])) {
return preg_match('/rambler|abacho|acoi|accona|aspseek|altavista|estyle|scrubby|lycos|geona|ia_archiver|alexa|sogou|skype|facebook|twitter|pinterest|linkedin|naver|bing|google|yahoo|duckduckgo|yandex|baidu|teoma|xing|java\/1.7.0_45|bot|crawl|slurp|spider|mediapartners|\sask\s|\saol\s/i', $_SERVER['HTTP_USER_AGENT']);
}
return false;
}
/**
* @Route("/_upload_pim", name="upload_pim", methods={"POST"})
*/
public function saveFile(Request $request, CacheManager $liipCache, string $publicDir)
{
if ($request->request->get('pass') != $_ENV['PIM_UPLOAD_PASS']) {
throw $this->createAccessDeniedException();
}
if (empty($request->request->get('target'))) {
throw $this->createNotFoundException();
}
/** @var \Symfony\Component\HttpFoundation\File\UploadedFile $file */
$file = $request->files->get('file');
$target = $publicDir . '/uploads/product' . $request->request->get('target');
$liipCache->remove('/uploads/product' . $request->request->get('target'), null);
if (!\file_exists(dirname($target))) {
\mkdir(\dirname($target), 0777, true);
}
$file->move(dirname($target), \basename($target));
return new JsonResponse([
'success' => true
]);
}
/**
* @Route("/_drop_cache", name="drop_cache", methods={"POST"})
*/
public function dropCache(Kernel $kernel, Request $request)
{
if ($request->request->get('pass') != $_ENV['PIM_UPLOAD_PASS']) {
throw $this->createAccessDeniedException();
}
return new StreamedResponse(function() use ($kernel) {
$cacheDir = $kernel->getCacheDir();
$toMove = $cacheDir . \uniqid();
\rename($cacheDir, $toMove);
$dirObj= new \RecursiveDirectoryIterator($toMove, \RecursiveDirectoryIterator::SKIP_DOTS); //upper dirs not included,otherwise DISASTER HAPPENS :)
$files = new \RecursiveIteratorIterator($dirObj, \RecursiveIteratorIterator::CHILD_FIRST);
foreach ($files as $path) {
echo $path->getPathname() . "\r\n";
$path->isDir() && !$path->isLink() ? rmdir($path->getPathname()) : unlink($path->getPathname());
}
rmdir($toMove);
});
}
/**
* @Route("/open/{symbol}", name="index_url", requirements={"symbol" = ".+"})
* @Route("/{service}/{symbol}", name="qr_url", requirements={"symbol" = ".+", "service" = "[0-9]"})
*/
public function openProduct(string $symbol, Request $request, Nodes $nodes, CMS $cms, TranslatorInterface $trans, $service = null)
{
if ($service) {
$cms->setService($service);
}
$result = $nodes->getNodes('index', [
'where' => [
'index' => $symbol
],
'pagging' => false
]);
if (count($result['list']) == 0) {
return $this->redirect($this->generateUrl('homepage', [], RouterInterface::ABSOLUTE_URL));
}
$node = $result['list'][0];
$neg = new LanguageNegotiator();
/** @var \Negotiation\AcceptLanguage $best */
$best = $neg->getBest($request->headers->get('accept-language'), ['en', 'pl', 'ro', 'ru', 'hu' ]);
$locale = null;
if ($best->getQuality() == 1) {
$locale = $best->getValue();
} else {
$locale = 'en';
}
$cms->setlocale($locale);
$trans->setLocale($locale);
$cms->setService($node->service);
$product = $nodes->getNodes('product', [
'where' => [
'public' => true,
'indexes' => $node->id
],
'pagging' => false,
]);
if (count($product['list']) == 0) {
//return $this->redirect($this->generateUrl('homepage', [], RouterInterface::ABSOLUTE_URL));
$url = 'https://' . $cms->getSettings()['domains'][0] . '/' . ($locale != 'pl' ? $locale : '');
} else {
$url = 'https://' . $cms->getSettings()['domains'][0] . $product['list'][0]->url($locale, RouterInterface::ABSOLUTE_PATH);
}
return $this->redirect($url);
}
/**
* @Route("/{_locale}/_news.json")
*/
public function newsApi(Request $request, Nodes $nodes, CacheManager $manager)
{
$max = $request->query->getInt('max', 10);
$page = $request->query->getInt('page', 1);
$category = $request->query->get('category', null);
$wh = [
'public' => true
];
if ($category) {
$wh['category'] = $category;
}
foreach (['b2b', 'b2c', 'www'] as $flag) {
if ($request->query->get($flag)) {
$wh[$flag] = $request->query->getBoolean($flag);
}
}
$list = $nodes->getNodes('news', [
'orderBy' => [
'publishDate' => 'desc'
],
'locale' => $request->attributes->get('_locale'),
'max' => $max,
'where' => $wh,
'page' => $page
]);
$res = [
'current' => $list['current'],
'max' => $list['max'],
'total' => $list['total'],
'list' => [],
'main' => null
];
foreach ($list['list'] as $node) {
$item = [
'id' => $node->id,
'title' => $node->vars->title,
'lead' => $node->vars->lead,
'publishDate'=> $node->vars->publishDate->format('d.m.Y'),
'photo' => $node->vars->photo->getPath(),
'thmb' => $request->getSchemeAndHttpHost() . $request->getBaseUrl() . $manager->resolve($node->vars->photo->getPath(), 'news'),
'url' => $node->url(null, RouterInterface::ABSOLUTE_URL)
];
$res['list'][] = $item;
}
$n = $nodes->getNodes('page', [
'locale' => $request->attributes->get('_locale'),
'max' => 1,
'module' => [
'content' => [
'list',
[
'type' => 'news'
]
]
]
])['list'];
if (count($n)) {
$res['main'] = $n[0]->url(null, RouterInterface::ABSOLUTE_URL);
}
return new JsonResponse($res);
}
}