View source
<?php
namespace Drupal\single_page_site\Manager;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Controller\ControllerResolverInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Menu\MenuLinkTree;
use Drupal\Core\Menu\MenuLinkTreeElement;
use Drupal\Core\Menu\MenuTreeParameters;
use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
class SinglePageSiteManager {
protected $http_kernel;
protected $settings;
protected $dispatcher;
protected $resolver;
protected $menuTree;
protected $languageNegotiation;
protected $currentLanguage;
protected $moduleHandler;
public function __construct(HttpKernelInterface $http_kernel, ConfigFactoryInterface $config_factory, EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, MenuLinkTree $menu_tree, LanguageManagerInterface $language_manager, ModuleHandlerInterface $module_handler) {
$this->settings = $config_factory
->get('single_page_site.config');
$this->httpKernel = $http_kernel;
$this->dispatcher = $dispatcher;
$this->resolver = $resolver;
$this->menuTree = $menu_tree;
$this->languageNegotiation = $config_factory
->get('language.negotiation')
->get('url');
$this->currentLanguage = $language_manager
->getCurrentLanguage()
->getId();
$this->moduleHandler = $module_handler;
}
public function getPageTitle() {
return empty($this->settings
->get('title')) ? 'Single page site' : $this->settings
->get('title');
}
public function getTitleTag() {
return $this->settings
->get('tag');
}
public function getMenu() {
return $this->settings
->get('menu');
}
public function getMenuClass() {
return $this->settings
->get('menuclass');
}
public function getMenuItemClass() {
return $this->settings
->get('class');
}
public function getDistanceUp() {
return $this->settings
->get('up');
}
public function getDistanceDown() {
return $this->settings
->get('down');
}
public function updateHash() {
return $this->settings
->get('updatehash');
}
public function getOffsetSelector() {
return $this->settings
->get('offsetselector');
}
public function getSmoothScrolling() {
return $this->settings
->get('smoothscrolling');
}
public function generateAnchor($url) {
if ($this->settings
->get('filterurlprefix')) {
$prefix = '';
if ($this->languageNegotiation['source'] == LanguageNegotiationUrl::CONFIG_PATH_PREFIX) {
if (!empty($this->languageNegotiation['prefixes'][$this->currentLanguage])) {
$prefix = $this->languageNegotiation['prefixes'][$this->currentLanguage] . '/';
}
}
$url = preg_replace('#^/' . str_replace('#', '\\#', $prefix) . '#', '/', $url);
}
return str_replace(array(
'/',
'?q=',
), array(
'_',
'',
), substr($url, 1));
}
public function getMenuChildren() {
$parameters = new MenuTreeParameters();
$parameters
->onlyEnabledLinks();
$tree = $this->menuTree
->load($this
->getMenu(), $parameters);
$manipulators = array(
array(
'callable' => 'menu.default_tree_manipulators:generateIndexAndSort',
),
);
return $this->menuTree
->transform($tree, $manipulators);
}
public function isMenuItemRenderable(MenuLinkTreeElement $menu_item) {
$plugin_definition = $menu_item->link
->getPluginDefinition();
if ($plugin_definition['route_name'] != '<front>' && !empty($plugin_definition['enabled'])) {
if (empty($this
->getMenuItemClass())) {
return $plugin_definition;
}
elseif ($this->moduleHandler
->moduleExists('link_attributes')) {
if (!empty($plugin_definition['options']['attributes']['class'])) {
$class = $plugin_definition['options']['attributes']['class'];
if (strpos($class, $this
->getMenuItemClass()) !== FALSE) {
return $plugin_definition;
}
}
}
}
return FALSE;
}
public function executeAndRenderSubRequest($href) {
$type = HttpKernelInterface::SUB_REQUEST;
$request = Request::create($href, 'GET');
$event = new GetResponseEvent($this->httpKernel, $request, $type);
$this->dispatcher
->dispatch(KernelEvents::REQUEST, $event);
if ($event
->hasResponse()) {
$event = new FilterResponseEvent($this->httpKernel, $request, $type, $event
->getResponse());
$this->dispatcher
->dispatch(KernelEvents::RESPONSE, $event);
$this->dispatcher
->dispatch(KernelEvents::FINISH_REQUEST, new FinishRequestEvent($this->httpKernel, $request, $type));
return $event
->getResponse();
}
if (FALSE === ($controller = $this->resolver
->getController($request))) {
throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". The route is wrongly configured.', $request
->getPathInfo()));
}
$event = new FilterControllerEvent($this->httpKernel, $controller, $request, $type);
$this->dispatcher
->dispatch(KernelEvents::CONTROLLER, $event);
$controller = $event
->getController();
$arguments = $this->resolver
->getArguments($request, $controller);
$build = call_user_func_array($controller, $arguments);
if (isset($build['#attached']['html_head_link'])) {
unset($build['#attached']['html_head_link']);
}
return $build;
}
}