You are here

class SinglePageSiteController in Single Page Site 2.x

Same name and namespace in other branches
  1. 8 src/Controller/SinglePageSiteController.php \Drupal\single_page_site\Controller\SinglePageSiteController
  2. 2.0.x src/Controller/SinglePageSiteController.php \Drupal\single_page_site\Controller\SinglePageSiteController

Class SinglePageSiteController.

@package Drupal\single_page_site\Controller

Hierarchy

Expanded class hierarchy of SinglePageSiteController

File

src/Controller/SinglePageSiteController.php, line 21

Namespace

Drupal\single_page_site\Controller
View source
class SinglePageSiteController extends ControllerBase {

  /**
   * The Single Page Site Manager.
   *
   * @var \Drupal\single_page_site\Manager\SinglePageSiteManager
   */
  protected $manager;

  /**
   * The core module handler.
   *
   * @var \Drupal\Core\Extension\ModuleHandler
   */
  protected $moduleHandler;

  /**
   * The core renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * Symphony Event dispatcher.
   *
   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
   */
  protected $eventDispatcher;

  /**
   * SinglePageSiteController constructor.
   *
   * @param \Drupal\single_page_site\Manager\SinglePageSiteManager $manager
   *   Manager value.
   * @param \Drupal\Core\Extension\ModuleHandler $module_handler
   *   Module handler value.
   * @param \Drupal\Core\Render\RendererInterface $renderer
   *   Renderer value.
   * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
   *   Event dispatcher value.
   */
  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;
  }

  /**
   * {@inheritdoc}
   */
  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'));
  }

  /**
   * Sets title.
   */
  public function setTitle() {
    return $this->manager
      ->getPageTitle();
  }

  /**
   * Renders single page.
   *
   * @return array
   *   Return the array with render.
   */
  public function render() {
    if ($menu = $this->manager
      ->getMenu()) {
      $items = [];
      $current_item_count = 1;

      // Collect all drupal messages and store them, we will show them later on.
      $messages = $this
        ->messenger()
        ->all();

      // Now fetch menu tree.
      $tree = $this->manager
        ->getMenuChildren();
      foreach ($tree as $menu_item) {
        if ($menu_item_details = $this->manager
          ->isMenuItemRenderable($menu_item)) {

          // Get route params.
          $params = $menu_item_details['route_parameters'];

          // Generate href.
          $url = Url::fromRoute($menu_item_details['route_name'], $params);
          $href = $url
            ->toString();
          $internalPath = $url
            ->getInternalPath();

          // Generate anchor.
          $anchor = $this->manager
            ->generateAnchor($href);

          // At this point we can execute request to render content.
          $render = $this->manager
            ->executeAndRenderSubRequest($internalPath);
          $output = is_array($render) ? $this->renderer
            ->render($render) : $render;

          // Let other modules makes changes to $output.
          // This alter hook is deprecated and will be removed in next major
          // release. Use EventSubscriber.
          $this->moduleHandler
            ->alter('single_page_site_output', $output, $current_item_count);

          // Dispatch event to allow other modules to make changes to the
          // output.

          /** @var \Drupal\single_page_site\Event\EventSinglePageSiteAlterOutput $event */
          $event = new EventSinglePageSiteAlterOutput($output, $current_item_count);
          $event = $this->eventDispatcher
            ->dispatch(SinglePageSiteEvents::SINGLE_PAGE_SITE_ALTER_OUTPUT, $event);

          // Build renderable array.
          $item = [
            'output' => $event
              ->getOutput(),
            'anchor' => $anchor,
            'title' => $menu_item->link
              ->getTitle(),
            'tag' => $this->manager
              ->getTitleTag(),
          ];
          array_push($items, $item);
          $current_item_count++;
        }
      }

      // Re-inject the messages.
      foreach ($messages as $type => $data) {
        foreach ($data as $message) {
          $this
            ->messenger()
            ->addMessage($message, $type);
        }
      }

      // Render output and attach JS files.
      $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()) {

        // Add smooth scrolling.
        $page_content['#attached']['library'][] = 'single_page_site/single_page_site.scroll';
      }
      $page_content['#attached']['drupalSettings']['singlePage'] = $js_settings;
      return $page_content;
    }
    else {

      // If settings aren't set.
      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')),
        ]),
      ];
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route.
ControllerBase::state protected function Returns the state storage service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 27
MessengerTrait::messenger public function Gets the messenger. 27
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
SinglePageSiteController::$eventDispatcher protected property Symphony Event dispatcher.
SinglePageSiteController::$manager protected property The Single Page Site Manager.
SinglePageSiteController::$moduleHandler protected property The core module handler. Overrides ControllerBase::$moduleHandler
SinglePageSiteController::$renderer protected property The core renderer.
SinglePageSiteController::create public static function Instantiates a new instance of this class. Overrides ControllerBase::create
SinglePageSiteController::render public function Renders single page.
SinglePageSiteController::setTitle public function Sets title.
SinglePageSiteController::__construct public function SinglePageSiteController constructor.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.