<?php
namespace App\Twig\Extension;
use App\Services\CheckwebsitesettingService;
use App\Services\FaviconGenerator\FaviconHtmlGenerator as FaviconHtmlGenerator;
use App\Services\FaviconGenerator\FaviconImageGenerator as FaviconImageGenerator;
use App\Services\FaviconService;
use Pimcore\Model\Document;
use Pimcore\Model\Site;
use Pimcore\Model\WebsiteSetting;
use Symfony\Component\HttpFoundation\RequestStack;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
use Twig\TwigTest;
class WebsiteExtension extends AbstractExtension
{
private $checkwebsitesetting;
private $requestStack;
public function __construct(CheckwebsitesettingService $checkwebsitesetting, RequestStack $requestStack)
{
$this->checkwebsitesetting = $checkwebsitesetting;
$this->requestStack = $requestStack;
}
public function getFunctions()
{
return [
new TwigFunction('websitedomain', [$this, 'getWebsiteDomain']),
new TwigFunction('set_favicon', [$this, 'generateFavicon'], ['is_safe' => ['html']]),
new TwigFunction('base_layout', [$this, 'getBaseLayout']),
new TwigFunction('loadJsForAction', [$this, 'loadJsForAction']),
new TwigFunction('buildNavigation', [$this, 'buildNavigation']),
new TwigFunction('fetchDocument', [$this, 'fetchDocument']),
];
}
public function getTests() {
return array(
new TwigTest('instanceof', array($this, 'isInstanceOf')),
);
}
public function getWebsiteDomain()
{
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
$hostname = $_SERVER['HTTP_HOST'];
return $protocol.'://'.$hostname;
}
public function generateFavicon($siteTitle, $msapplicationTileColor, $themeColor, $titleBarColor)
{
if ($this->checkwebsitesetting->check("favicon_asset", "asset") && $this->checkwebsitesetting->check("site_title", "text")) {
$favIconSetting = WebsiteSetting::getByName('favicon_asset');
if($favIconSetting) {
/** @var \Pimcore\Model\Asset\Image $favIcon */
$favIcon = $favIconSetting->getData();
$favIconAsset = PIMCORE_WEB_ROOT . '/var/assets' . $favIcon->getRealFullPath();
$destination = PIMCORE_WEB_ROOT . '/favicon.ico';
if (WebsiteSetting::getByName('generateNewFavicon')) {
$generateNewFavIcon = WebsiteSetting::getByName('generateNewFavicon')->getData();
} else {
$this->checkwebsitesetting->check("generateNewFavicon", "bool");
}
// create FavIcon
if ($generateNewFavIcon) {
$sizes = array(
array(16, 16),
array(24, 24),
array(32, 32),
array(48, 48),
);
$ico_lib = new FaviconService($favIconAsset, $sizes);
$ico_lib->save_ico($destination);
}
// Generate other FavIcons
$applicationName = $siteTitle;
$faviconDir = PIMCORE_WEB_ROOT . '/static/icons/';
$imageForAndroid = $favIconAsset;
$imageForApple = $favIconAsset;
$appleStartupImageProportion = 80.0;
if ($generateNewFavIcon) {
$faviconImageGenerator = new FaviconImageGenerator($applicationName, $faviconDir, $imageForAndroid, $imageForApple, $appleStartupImageProportion);
$faviconImageGenerator->generate();
$v = '?v=' . date('dmYhms');
}
$faviconHtmlGenerator = new FaviconHtmlGenerator($applicationName, $faviconDir, $msapplicationTileColor, $themeColor, $titleBarColor);
$faviconHtml = $faviconHtmlGenerator->generate();
return $faviconHtml;
}
}
}
public function getBaseLayout()
{
if (Site::isSiteRequest()) {
$siteKey = Site::getCurrentSite()->getRootDocument()->getKey();
$layoutName = 'layout_' . $siteKey;
} else {
$layoutName = 'layout';
}
return 'layouts/'.$layoutName.'.html.twig';
}
public function loadJsForAction()
{
$request = $this->requestStack->getCurrentRequest();
$controller = $request->attributes->get('_controller');
list($controller, $action) = explode('::', $controller);
$actionName = strtolower(str_replace('Action', '', $action));
// Check if App Controller
if (str_contains($controller, 'App\\Controller\\')) {
$controllerName = strtolower(str_replace(['App\\Controller\\','Controller'], '', $controller));
$arrayControllerAction = [
$controllerName,
$actionName
];
return $arrayControllerAction;
}else{
return [];
}
}
public function buildNavigation()
{
$request = $this->requestStack->getCurrentRequest();
$language = $request->attributes->get('_locale');
// if (!$mainNavStartNode instanceof \Pimcore\Model\Document\Page) {
// if (\Pimcore\Model\Site::isSiteRequest()) {
// $site = \Pimcore\Model\Site::getCurrentSite();
// $mainNavStartNode = $site->getRootDocument();
// } else {
// $mainNavStartNode = \Pimcore\Model\Document\Page::getById(1);
// }
// }
if (Site::isSiteRequest()) {
$site = Site::getCurrentSite();
$rootDoc = $site->getRootDocument();
$getRootDocumentPath = $rootDoc->getRealFullPath();
$navRootPath = $getRootDocumentPath . '/' . $language;
$navStartNode = Document::getByPath($navRootPath);
} else {
$navStartNode = Document::getByPath('/' . $language);
}
return $navStartNode;
}
/**
* @param $var
* @param $instance
* @return bool
*/
public function isInstanceof($var, $instance) {
return $var instanceof $instance;
}
public function fetchDocument($documentId)
{
$document = \Pimcore\Model\Document::getById($documentId);
return $document;
}
}