<?php
namespace App\Controller\Document;
use App\Form\SearchFormType;
use App\Helper\DataMapper\NavigationDataMapper;
use Pimcore\Model\Document;
use Pimcore\Navigation\Builder;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
class DivisionPageController extends AbstractDocumentController
{
protected $navigationBuilder;
public function __construct(Builder $navigationBuilder)
{
parent::__construct($navigationBuilder);
}
/**
* @param Request $request
* @return void
*/
#[Template()]
public function defaultAction(Request $request)
{
}
#[Template()]
public function headerAction(Request $request)
{
parent::headerAction($request);
$this->view->mainNavigation = [];
$masterRequest = $this->get('request_stack')->getMasterRequest();
$parentDocument = $masterRequest->get('contentDocument');
$division = $masterRequest->get('division') ?? explode('/', $masterRequest->getRequestUri())[1];
if (!$parentDocument) {
$parentDocument = Document::getByPath('/'.$division.'/ErrorPage');
if (!$parentDocument) {
$parentDocument = Document::getById(1);
}
}
$menuStartDocument = $parentDocument->getProperty('menu_start_page');
if ($this->isRootDocument($parentDocument)) {
$parentDocument = $this->getDivisionDocumentFromRequest($masterRequest);
$menuStartDocument = $this->getDivisionDocumentFromRequest($masterRequest);
$division = null;
if($parentDocument) {
$division = $parentDocument->getKey();
}
$this->view->division = $division;
}
$mainNavigation = $this->navigationBuilder->getNavigation($parentDocument, $menuStartDocument);
$navigationMapped = NavigationDataMapper::list(
$mainNavigation->getPages()
)->all($request);
$this->view->mainNavigation = $this->groupNavigationByProperty($navigationMapped, 'menu_group');
$form = $this->createForm(SearchFormType::class);
$this->view->form = $form->createView();
if (!$division) {
$explodedPath = array_values(array_filter(explode('/', $masterRequest->getPathInfo())));
if (count($explodedPath)) {
$division = $explodedPath[0];
}
}
$this->view->resourceMenuLinks = $this->getResourceLinks($division, 'resources');
$this->view->researchMenuLinks = $this->getResourceLinks($division, 'research');
$this->view->supportMenuLinks = $this->getResourceLinks($division, 'support');
$this->view->educationMenuLinks = $this->getResourceLinks($division, 'education');
$this->view->aboutMenuLinks = $this->getResourceLinks($division, 'about');
}
/**
* Return nested links for document with given name
*
* @param string $division
* @param string $resourceName
*
* @return array
*/
private function getResourceLinks(?string $division, string $resourceName)
{
$resources = Document\Link::getByPath('/' . $division . '/'.$resourceName);
if (!$resources) {
return [];
}
$links = [];
foreach ($resources->getChildren() as $child) {
if ($child instanceof Document\Page) {
$links[] = [
'name' => $child->getTitle(),
'link' => $child->getHref()
];
}
}
return $links;
}
public function getDivisionDocumentFromRequest($request)
{
$id = $request->request->get('division');
return Document::getById($id);
}
protected function isRootDocument($document)
{
return $document && $document->getId() == 1;
}
protected function groupNavigationByProperty(array $navigation, string $propertyKey)
{
return array_reduce($navigation, function ($collection, $item) use ($propertyKey) {
if ($value = $item[$propertyKey]) {
$collection[$value] = $collection[$value] ?? [];
$collection[$value][] = $item;
}
return $collection;
}, []);
}
}