<?php
namespace App\Twig\Extension;
use Pimcore\Model\Document;
use Pimcore\Navigation\Container;
use Pimcore\Navigation\Page\Document as NavDocument;
use Pimcore\Twig\Extension\Templating\Navigation;
use Pimcore\Twig\Extension\Templating\Placeholder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class NavigationExtension extends AbstractExtension
{
/**
* @var Navigation
*/
protected $navigationHelper;
/**
* @var Placeholder
*/
protected $placeholderHelper;
protected $breadcrumbActive = '';
protected Request $request;
public function __construct(Navigation $navigationHelper, Placeholder $placeholderHelper, RequestStack $requestStack)
{
$this->navigationHelper = $navigationHelper;
$this->placeholderHelper = $placeholderHelper;
if ($requestStack->getCurrentRequest()) {
$this->request = $requestStack->getCurrentRequest();
}
}
/**
* @return array|TwigFunction[]
*/
public function getFunctions()
{
return [
new TwigFunction('app_navigation_enrich_breadcrumbs', [$this, 'enrichBreadcrumbs']),
new TwigFunction('app_navigation_main', [$this, 'mainNavigation']),
];
}
public function mainNavigation(Document $document, Document $startNode): array
{
$navigation = $this->navigationHelper->build([
'active' => $document,
'root' => $startNode,
]);
$navigationIntern = $navigation->getPages();
$login = $this->request->getSession()->has('login') && $this->request->getSession()->get('login');
foreach ($navigation->getPages() as $key => $page) {
$d = Document::getById($page->getId());
if ($d->getProperty('intern') && !$login) {
unset($navigationIntern[$key]);
}
if ('page' !== $d->getType()) {
unset($navigationIntern[$key]);
}
}
return $navigationIntern;
}
/**
* @throws \Exception
*/
public function enrichBreadcrumbs(Document $document, Container $navigation): Container
{
$additionalBreadCrumbs = $this->placeholderHelper->__invoke('addBreadcrumb');
if ($additionalBreadCrumbs->getArrayCopy()) {
$parentPage = false;
foreach ($additionalBreadCrumbs->getArrayCopy() as $breadcrumb) {
$page = $navigation->findBy('id', $breadcrumb['id']);
if (null === $page) {
$parentPage = $parentPage ?: $navigation->findBy('id', $breadcrumb['parentId']);
$newPage = new NavDocument([
'id' => $breadcrumb['id'],
'uri' => isset($breadcrumb['url']) && '' != $breadcrumb['url'] ? $breadcrumb['url'] : '',
'label' => $breadcrumb['label'],
'active' => true,
]);
if ($parentPage) {
$parentPage->setActive(false);
$parentPage->addPage($newPage);
$parentPage = $newPage;
} else {
$navigation->addPage($newPage);
}
}
}
}
return $navigation;
}
}