<?php
/**
* Created by PhpStorm.
* User: dkouril
* Date: 20.3.2019
* Time: 14:00
*/
namespace App\Controller;
use App\Controller\Breadcrumb\Breadcrumb;
use App\Controller\Breadcrumb\BreadcrumbItem;
use App\Controller\Navbar\Navbar;
use App\Controller\Navbar\NavbarItem;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Controller\PageInfoModel;
use App\Controller\Objects\Link;
use Twig\Environment;
class PageInfo
{
/**
* @var string
*/
private $title = 'KULTURA A SPORT CHOMUTOV s.r.o.';
/**
* @var string
*/
private $html_title = 'KULTURA A SPORT CHOMUTOV s.r.o.';
/**
* @var string
*/
private $description = 'MĚSTSKÉ DIVADLO | KINO SVĚT | LETNÍ KINO | AQUASVĚT | ROCKNET ARÉNA - ZIMNÍ STADION | MĚSTSKÁ SPORTOVNÍ HALA | ATLETICKÝ STADION | FOTBALOVÝ STADION | IN-LINE DRÁHA | DĚTSKÉ HŘIŠTĚ';
/**
* @var Navbar
*/
private $navbar;
/**
* @var Navbar
*/
private $navbar_onscroll;
/**
* @var Breadcrumb
*/
private $breadcrumb;
/**
* @var string[]
*/
private $activeLinks = [];
/**
* @var string
*/
private $activeLink;
/**
* @var Request
*/
private $request;
/**
* @var string
*/
private $searchedText = '';
/**
* @var string
*/
private $paginationLink = '';
/**
* @var bool
*/
private $fromSeznam = false;
/**
* @var bool
*/
private $secondLevelNavbar = false;
/**
* @var int
*/
private $adid = 1;
/**
* @var int
*/
private $adid_html = 100;
/**
* @var array
*/
private $footbar_links = [];
/**
* @var PageInfoModel
*/
private $model;
/**
* @var string
*/
private $info;
/**
* @var string
*/
private $mobile;
/**
* @var bool
*/
private bool $ipad = false;
/**
* PageInfo constructor.
* @param RequestStack $requestStack
*/
public function __construct(RequestStack $requestStack, Database $db)
{
$this->request = $requestStack->getCurrentRequest();
if ($this->request !== null) {
$this->activeLink = $this->request->getPathInfo();
$this->setActiveLinks();
}
$this->model = new PageInfoModel($db);
$this->breadcrumb = new Breadcrumb();
$this->breadcrumb->addItem(new BreadcrumbItem('Hlavní stránka', '/'));
$this->initNavbar();
$this->footbar_links = $this->model->getFootbarLinks();
$this->info = $this->model->getInfo($this->request->getRequestUri());
$this->mobile = self::isMobile();
if (strstr($_SERVER['HTTP_USER_AGENT'], 'iPad')) {
$this->ipad = true;
}
}
/**
* @return false|int
*/
public function isMobile() {
return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}
/**
* @return void
*/
private function setActiveLinks(): void
{
$this->activeLinks = [];
$links = explode('/', trim($this->request->getPathInfo(), '/'));
//fix různých vydání fotra na tripu
$links = str_replace(['fotr-na-snehu', 'fotr-v-cesku', 'fotr-na-tripu-2021', 'fotr-na-tripu-2022'], 'fotr-na-tripu', $links);
for ($i = 0, $iMax = count($links); $i < $iMax; $i++) {
if ($i === 0) {
$this->activeLinks[] = '/' . $links[$i];
} else {
$prevLink = $this->activeLinks[$i - 1];
$this->activeLinks[] = $prevLink . '/' . $links[$i];
}
}
//fix fotr na tripu a blondyna
if (in_array('/fotr-na-tripu', $this->activeLinks) && in_array('/fotr-na-tripu/videa', $this->activeLinks)) {
unset($this->activeLinks[0]);
}
else if (in_array('/blondyna-kutil-a-zabijak', $this->activeLinks) && in_array('/blondyna-kutil-a-zabijak/videa', $this->activeLinks)) {
unset($this->activeLinks[0]);
}
}
/**
* @param NavbarItem[] $items
* @param string[] $links
* @param bool $found
*/
private function findActiveNavbarItems($items, $links, &$found = false): void
{
$found = false;
foreach ($items as $item) {
//Porovnám linky
$index = array_search($item->getLink(), $links);
//Pokud jsem našel link
if ($index !== false) {
$item->setIsActive(true);
if (!$item->isOnlySlidebar()) {
$this->addBreadcrumb($item->getName(), $item->getLink());
}
$found = true;
unset($links[$index]);
if (count($links) > 0) {
//Prohledám ještě subitems
$this->findActiveNavbarItems($item->getItems(), $links);
}
} else if (count($item->getItems()) > 0) {
//Prohledám subitems
$this->findActiveNavbarItems($item->getItems(), $links, $found);
//Pokud jsem našel
if ($found) {
$item->setIsActive(true);
break;
}
}
}
}
private function initNavbar(): void
{
//normal
$this->navbar = new Navbar();
$this->navbar->addItem(new NavbarItem('Aquasvět', '/aquasvet'));
$this->navbar->addItem(new NavbarItem('Kino Svět', '/kino-svet'));
$this->navbar->addItem(new NavbarItem('Městské divadlo', '/mestske-divadlo'));
$this->navbar->addItem(new NavbarItem('Městská sportovní hala', '/mestska-sportovni-hala'));
$items = [];
$items[] = new NavbarItem('Rocknet aréna', '/zimni-stadion-rocknet-arena');
$items[] = new NavbarItem('Tréninková hala', '/zimni-stadion-treninkova-hala');
$this->navbar->addItem(new NavbarItem('Zimní stadion', '', $items));
$this->navbar->addItem(new NavbarItem('Fotbalový stadion', '/fotbalovy-stadion'));
$this->navbar->addItem(new NavbarItem('Atletický stadion', '/atleticky-stadion'));
$this->navbar->addItem(new NavbarItem('Letní kino', '/letni-kino'));
$items = [];
$items[] = new NavbarItem('Hřiště', '/hriste');
$items[] = new NavbarItem('In-line dráha', '/in-line-draha');
$items[] = new NavbarItem('Sportovní areál TzŠ', '/sportovni-areal-tomase-ze-stitneho');
$this->navbar->addItem(new NavbarItem('Další', '', $items));
$this->findActiveNavbarItems($this->navbar->getItems(), $this->activeLinks);
//onscroll
$this->navbar_onscroll = new Navbar();
$this->navbar_onscroll->addItem(new NavbarItem('Aquasvět', '/aquasvet'));
$this->navbar_onscroll->addItem(new NavbarItem('Kino Svět', '/kino-svet'));
$this->navbar_onscroll->addItem(new NavbarItem('Městské divadlo', '/mestske-divadlo'));
$this->navbar_onscroll->addItem(new NavbarItem('Městská sportovní hala', '/mestska-sportovni-hala'));
$items = [];
$items[] = new NavbarItem('Rocknet aréna', '/zimni-stadion-rocknet-arena');
$items[] = new NavbarItem('Tréninková hala', '/zimni-stadion-treninkova-hala');
$this->navbar_onscroll->addItem(new NavbarItem('Zimní stadion', '', $items));
$items = [];
$items[] = new NavbarItem('Fotbalový stadion', '/fotbalovy-stadion');
$items[] = new NavbarItem('Atletický stadion', '/atleticky-stadion');
$items[] = new NavbarItem('Letní kino', '/letni-kino');
$items[] = new NavbarItem('Hřiště', '/hriste');
$items[] = new NavbarItem('In-line dráha', '/in-line-draha');
$items[] = new NavbarItem('Sportovní areál TzŠ', '/sportovni-areal-tomase-ze-stitneho');
$this->navbar_onscroll->addItem(new NavbarItem('Další', '', $items));
$this->findActiveNavbarItems($this->navbar_onscroll->getItems(), $this->activeLinks);
//dump($this->navbar);
}
/**
* @return string
*/
public function getTitle(): string
{
return $this->title;
}
/**
* @param string $title
* @param string $suffix
* @return PageInfo
*/
public function setTitle(string $title, string $suffix = ' | Autosalon TV'): PageInfo
{
$this->title = $title . $suffix;
$this->html_title = $title . $suffix;
return $this;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @param string $description
* @return PageInfo
*/
public function setDescription(string $description): PageInfo
{
$this->description = $description;
return $this;
}
/**
* @param string $title
* @return PageInfo
*/
public function addToTitle(string $title): PageInfo
{
$this->title = $title . '|' . $this->title;
return $this;
}
/**
* @return Navbar
*/
public function getNavbar(): Navbar
{
return $this->navbar;
}
/**
* @return Navbar
*/
public function getNavbarOnScroll(): Navbar
{
return $this->navbar_onscroll;
}
/**
* @return Breadcrumb
*/
public function getBreadcrumb(): Breadcrumb
{
return $this->breadcrumb;
}
/**
* @param Breadcrumb $breadcrumb
* @return PageInfo
*/
public function setBreadcrumb(Breadcrumb $breadcrumb): PageInfo
{
$this->breadcrumb = $breadcrumb;
return $this;
}
/**
* @param string $name
* @param string $link
* @return PageInfo
*/
public function addBreadcrumb(string $name, string $link): PageInfo
{
$this->breadcrumb->addItem(new BreadcrumbItem($name, $link));
return $this;
}
/**
* @param BreadcrumbItem $item
* @return PageInfo
*/
public function addBreadcrumbItem(BreadcrumbItem $item): PageInfo
{
$this->breadcrumb->addItem($item);
return $this;
}
/**
* @return string
*/
public function getActiveLink(): string
{
return $this->activeLink;
}
/**
* @return string[]
*/
public function getActiveLinks(): array
{
return $this->activeLinks;
}
/**
* @return Request
*/
public function getRequest(): Request
{
return $this->request;
}
/**
* @param Request $request
* @return PageInfo
*/
public function setRequest(Request $request): PageInfo
{
$this->request = $request;
return $this;
}
/**
* @return string
*/
public function getSearchedText(): string
{
return $this->searchedText;
}
/**
* @param string $searchedText
* @return PageInfo
*/
public function setSearchedText(string $searchedText): PageInfo
{
$this->searchedText = $searchedText;
return $this;
}
/**
* @return string
*/
public function getPaginationLink(): string
{
return $this->paginationLink;
}
/**
* @param string $paginationLink
* @return PageInfo
*/
public function setPaginationLink(string $paginationLink): PageInfo
{
$this->paginationLink = $paginationLink;
return $this;
}
/**
* @return false|string
*/
public function jsonLDSearchbox()
{
$url = getenv('APP_URL');
$json = [
'@context' => 'https://schema.org/',
'@type' => 'WebSite',
'name' => 'Autosalon TV',
'url' => $url,
'potentialAction' => [
'@type' => 'SearchAction',
'target' => $url . '/hledani?q={search_term_string}',
'query-input' => 'required name=search_term_string'
]
];
return json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
}
/**
* @return string
*/
public function jsonLDBreadcrumb(): string
{
$items = [];
$pos = 1;
$url = getenv('APP_URL');
foreach ($this->breadcrumb->getItems() as $item) {
$items[] = [
'@type' => 'ListItem',
'position' => $pos,
'name' => $item->getName(),
'item' => $url . $item->getLink()
];
$pos++;
}
$json = [
'@context' => 'https://schema.org/',
'@type' => 'BreadcrumbList',
'itemListElement' => $items
];
return json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
}
/**
* @return int
*/
public function isFromSeznam(): int
{
return (int)$this->fromSeznam;
}
/**
* @return bool
*/
public function isSecondLevelNavbar(): bool
{
return $this->secondLevelNavbar;
}
/**
* @return int
*/
public function getAdid(): int
{
return $this->adid++;
}
/**
* @return int
*/
public function getAdidHtml(): int
{
return $this->adid_html++;
}
/**
* @return mixed
*/
public function getRobots()
{
return getenv('APP_ROBOTS');
}
/**
*
*/
public function getSASkeywords() {
$breadcrumb = $this->breadcrumb->getItems();
$keywords = [];
if (count($breadcrumb)>1) {
unset($breadcrumb[0]);
foreach ($breadcrumb as $item) {
$keywords[] = system::makeLink($item->getName());
}
}
return implode(',', $keywords);
}
/**
* @return string
*/
public function getHtmlTitle(): string
{
return $this->html_title;
}
/**
* @param string $html_title
*/
public function setHtmlTitle(string $html_title, string $suffix = ' | Autosalon TV'): PageInfo
{
if ($html_title != '') $this->html_title = $html_title.$suffix;
return $this;
}
/**
* @return array
*/
public function getFootbarLinks(): array
{
return $this->footbar_links;
}
/**
* @return string
*/
public function getInfo(): string
{
return $this->info;
}
/**
* @return false|int|string
*/
public function getMobile(): bool|int|string
{
return $this->mobile;
}
/**
* @param false|int|string $mobile
*/
public function setMobile(bool|int|string $mobile): void
{
$this->mobile = $mobile;
}
/**
* @return bool
*/
public function isIpad(): bool
{
return $this->ipad;
}
}