View source
<?php
namespace Drupal\single_page_site\Controller;
use Drupal\single_page_site\Event\EventSinglePageSiteAlterOutput;
use Drupal\single_page_site\Event\SinglePageSiteEvents;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Extension\ModuleHandler;
use Drupal\Core\Link;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Url;
use Drupal\single_page_site\Manager\SinglePageSiteManager;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class SinglePageSiteController extends ControllerBase {
protected $manager;
protected $moduleHandler;
protected $renderer;
protected $eventDispatcher;
public function __construct(SinglePageSiteManager $manager, ModuleHandler $module_handler, RendererInterface $renderer, EventDispatcherInterface $event_dispatcher) {
$this->manager = $manager;
$this->moduleHandler = $module_handler;
$this->renderer = $renderer;
$this->eventDispatcher = $event_dispatcher;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('single_page_site.manager'), $container
->get('module_handler'), $container
->get('renderer'), $container
->get('event_dispatcher'));
}
public function setTitle() {
return $this->manager
->getPageTitle();
}
public function render() {
if ($menu = $this->manager
->getMenu()) {
$items = [];
$current_item_count = 1;
$messages = $this
->messenger()
->all();
$tree = $this->manager
->getMenuChildren();
foreach ($tree as $menu_item) {
if ($menu_item_details = $this->manager
->isMenuItemRenderable($menu_item)) {
$params = $menu_item_details['route_parameters'];
$url = Url::fromRoute($menu_item_details['route_name'], $params);
$href = $url
->toString();
$internalPath = $url
->getInternalPath();
$anchor = $this->manager
->generateAnchor($href);
$render = $this->manager
->executeAndRenderSubRequest($internalPath);
$output = is_array($render) ? $this->renderer
->render($render) : $render;
$this->moduleHandler
->alter('single_page_site_output', $output, $current_item_count);
$event = new EventSinglePageSiteAlterOutput($output, $current_item_count);
$event = $this->eventDispatcher
->dispatch(SinglePageSiteEvents::SINGLE_PAGE_SITE_ALTER_OUTPUT, $event);
$item = [
'output' => $event
->getOutput(),
'anchor' => $anchor,
'title' => $menu_item->link
->getTitle(),
'tag' => $this->manager
->getTitleTag(),
];
array_push($items, $item);
$current_item_count++;
}
}
foreach ($messages as $type => $data) {
foreach ($data as $message) {
$this
->messenger()
->addMessage($message, $type);
}
}
$js_settings = [
'menuClass' => $this->manager
->getMenuClass(),
'distanceUp' => $this->manager
->getDistanceUp(),
'distanceDown' => $this->manager
->getDistanceDown(),
'updateHash' => $this->manager
->updateHash(),
'offsetSelector' => $this->manager
->getOffsetSelector(),
];
$page_content = [
'#theme' => 'single_page_site',
'#items' => $items,
'#attached' => [
'library' => [
'single_page_site/single_page_site.scrollspy',
],
],
];
if ($this->manager
->getSmoothScrolling()) {
$page_content['#attached']['library'][] = 'single_page_site/single_page_site.scroll';
}
$page_content['#attached']['drupalSettings']['singlePage'] = $js_settings;
return $page_content;
}
else {
return [
'#markup' => $this
->t('You have to !configure your single page before you can use it.', [
'!configure' => Link::fromTextAndUrl(t('configure'), Url::fromRoute('single_page_site.config')),
]),
];
}
}
}