<?php
namespace App\Controller\Master;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use App\Entity\SiteConfig;
use App\Entity\Content;
use App\Utils\ModuleHelper;
use App\Utils\MediaHelper;
use App\Utils\ContentHelper;
use App\Utils\ContentMeta;
use App\Utils\DomainBlacklistHelper;
# use App\Twig\RCSExtension;
class DefaultController extends Controller
{
protected $moduleHelper;
protected $contentHelper;
protected $mediaHelper;
protected $blacklistHelper;
protected $request;
protected $user;
//TODO: Update how we're doing this (site config entity?)
protected $site_code;
public function __construct (
RequestStack $reqStack,
ModuleHelper $moduleHelper,
ContentHelper $contentHelper,
MediaHelper $mediaHelper,
DomainBlacklistHelper $blacklistHelper,
TokenStorageInterface $tokenStore
) {
$this->request = $reqStack->getCurrentRequest();
$this->moduleHelper = $moduleHelper;
$this->contentHelper = $contentHelper;
$this->mediaHelper = $mediaHelper;
$this->blacklistHelper = $blacklistHelper;
$this->user = $tokenStore->getToken()->getUser();
if ($this->user === "anon.") {
$this->user = null;
}
$session = $this->request->getSession();
if($session) {
$this->site_code = $session->get("site");
}
}
/**
* Overwrite the render method so each controller does not have to
* worry about pull module / sidebar / or ad data.
*
* Overriding render will be removed from the next major update ...
* possibly: http://symfony.com/doc/current/event_dispatcher/before_after_filters.html
*
* OR make another render function that calls it - look into renderView() vs render()
*
*/
public function defaultRender (
string $view = "",
array $params = [],
Response $response = NULL
): Response {
//Blocking links from certain sites
$user_refer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "";
if ($user_refer && !(strpos($user_refer, 'rooferscoffeeshop.com') !== false) && !(strpos($user_refer, 'askaroofer.com') !== false)) { //referred from an external sites
if($this->blacklistHelper->isBlacklisted($user_refer)) { //blacklisted
//$view = "errors/404.html.twig";
$view = "content/content.html.twig";
$params = [
"content" => $this->contentHelper->getPageBySlug("free-sample-redirect")
];
}
}
if($view != "content/dashboard.html.twig" && $view != "test.html.twig") { // Add any excluded pages here. The dashboard, for example, should not count for impressions.
$bot = preg_match('/bot|crawl|curl|dataprovider|search|get|spider|find|java|majesticsEO|google|yahoo|teoma|contaxe|yandex|libwww-perl|sleuth|audit|robot|Node|seo|broken|buck|Anthill|facebookexternalhit/i', $_SERVER['HTTP_USER_AGENT']);
array_walk_recursive($params, function($value, $key) use ($bot){
if(is_a($value, Content::class)) {
if($bot) {
$this->contentHelper->addImpression($this->request, $value);
}
else {
$this->contentHelper->enqueueImpression($this->request, $value);
}
}
});
}
$params["meta"] = array_merge([
"root" => $this->request->getPathInfo(),
"title" => SiteConfig::getConfig($this->site_code, "meta_title"),
"robots" => "index, follow",
"canonical" => "",
"breadcrumbs" => array (),
], $params["meta"] ?? []);
if (empty($params["meta"]["breadcrumbs"])) {
// try to create from content object
if (isset($params["content"])) {
$cnt = $params["content"];
switch ($cnt->getType()) {
// page
case 1:
$params["meta"]["breadcrumbs"][] = [
"href" => "/{$cnt->getSlug()}",
"title" => $cnt->getTitle(),
];
break;
// post
case 2:
$tmp = [];
$cat = $cnt->getCategory();
// walk up parent elements
while ($cat) {
$tmp[] = [
"slug" => $cat->getSlug(),
"title" => $cat->getTitle(),
];
$cat = $cat->getPrnt();
}
$tmp = array_reverse($tmp);
$slug = "category/";
foreach ($tmp as $row) {
$params["meta"]["breadcrumbs"][] = [
"href" => "/{$slug}{$row["slug"]}",
"title" => $row["title"],
];
$slug .= "{$row["slug"]}/";
}
$params["meta"]["breadcrumbs"][] = [
"href" => "",
"title" => $cnt->getTitle(),
];
break;
}
}
if (isset($params["product"])) {
$prod = $params["product"];
$tmp = [];
$cat = $prod->getCategory();
// walk up parent elements
while ($cat) {
$tmp[] = [
"slug" => $cat->getSlug(),
"title" => $cat->getTitle(),
];
$cat = $cat->getPrnt();
}
$tmp = array_reverse($tmp);
$params["meta"]["breadcrumbs"][] = [
"href" => "/gift-shop",
"title" => "RCS Gift Shop",
];
foreach ($tmp as $row) {
$params["meta"]["breadcrumbs"][] = [
"href" => "/gift-shop/1/{$row["slug"]}",
"title" => $row["title"],
];
}
$params["meta"]["breadcrumbs"][] = [
"href" => "",
"title" => $prod->getTitle(),
];
}
}
// store the params globally for twig...
ContentMeta::$meta = $params["meta"];
//TODO: clean up
$bottom_ad_position = "";
switch($this->site_code) {
case Content::SITE_RCS:
$params["sidebars"] = $this->moduleHelper->getSidebarModulesBySlug (
$params["meta"]["root"]
);
$params["menu_ads"] = $this->moduleHelper->getMenuAds($this->site_code);
//$bottom_ad_position = "ad-bottom";
break;
case Content::SITE_AAR:
$params["sidebars"] = $this->moduleHelper->getAARSidebarModulesBySlug (
$params["meta"]["root"]
);
//$bottom_ad_position = "aar-ad-bottom";
break;
case Content::SITE_MCS:
$params["sidebars"] = $this->moduleHelper->getMCSSidebarModulesBySlug (
$params["meta"]["root"]
);
$params["menu_ads"] = $this->moduleHelper->getMenuAds($this->site_code);
break;
case Content::SITE_CCS:
$params["sidebars"] = $this->moduleHelper->getCCSSidebarModulesBySlug (
$params["meta"]["root"]
);
$params["menu_ads"] = $this->moduleHelper->getMenuAds($this->site_code);
break;
default:
$params["sidebars"] = $this->moduleHelper->getOtherSidebarModulesBySlug (
$params["meta"]["root"]
);
break;
}
$bottom_ad_position = "ad-bottom";
// check if we are showing a bottom advertisement
// - better naming ... :/
if (ContentMeta::$meta["root"] != "/" && //home
ContentMeta::$meta["root"] != "home" && //home
!(strpos(ContentMeta::$meta["root"], "/404") !== false) &&
!(strpos(ContentMeta::$meta["root"], "/account") !== false) &&
!(strpos(ContentMeta::$meta["root"], "/directory/") !== false && strpos(ContentMeta::$meta["root"], "/posts") == false) //directory pages
) {
$params["bottom"] = [
[
"type" => "mediagroup",
"position" => $bottom_ad_position,
]
];
} else {
//if($this->site_code == Content::SITE_RCS) {
$coffeeCastAd = $this->mediaHelper->getFirstItemByPosition("ad-video-coffee-cast");
$params["ad_video_coffee_cast"] = $coffeeCastAd;
//}
}
// header ads
//if($this->site_code == Content::SITE_RCS) {
try {
$countdownAd = $this->mediaHelper->getFirstItemByPosition("header-countdown");
$params["countdown_ad"] = $countdownAd;
$bottomHeaderAd = $this->mediaHelper->getFirstItemByPosition("header-bottom");
$params["bottom_header_ad"] = $bottomHeaderAd;
$bottomBottomHeaderAd = $this->mediaHelper->getFirstItemByPosition("header-bottom-bottom");
$params["bottom_bottom_header_ad"] = $bottomBottomHeaderAd;
//$params["megaMenu"] = $this->someHelper->getMegaMenuItems();
} catch (\Exception $e) {
//no header_news_link
}
//}
// add the user object to all requests
$params["user"] = $this->user;
$params["site_code"] = $this->site_code;
return $this->render($view, $params, $response);
}
}