You are here

public function UltimenuController::load in Ultimenu 8.2

Loads and renders a region via AJAX.

Parameters

\Symfony\Component\HttpFoundation\Request $request: The current request object.

Return value

array Return the requested region based on the given region parameters.

Throws

\Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException

\Symfony\Component\HttpKernel\Exception\NotFoundHttpException

See also

http://symfony.com/doc/current/routing.html#required-and-optional-placeh...

1 string reference to 'UltimenuController::load'
ultimenu.routing.yml in ./ultimenu.routing.yml
ultimenu.routing.yml

File

src/Controller/UltimenuController.php, line 102

Class

UltimenuController
Provides controller for Ultimenu region route.

Namespace

Drupal\ultimenu\Controller

Code

public function load(Request $request) {
  $mlid = $request->query
    ->get('mlid');
  $sub = $request->query
    ->get('sub');
  if (isset($mlid) && ($regions = $this->ultimenuManager
    ->getSetting('regions'))) {

    // Creates the menu link instance.
    $link = $this->menuLinkManager
      ->createInstance($mlid);
    if (!$link || !$link
      ->isEnabled()) {
      throw new NotFoundHttpException();
    }

    // Creates Ultimenu region response.
    $response = new AjaxResponse();
    $rid = $this->ultimenuManager
      ->getTool()
      ->getRegionKey($link);

    // Only proceeds if we have a valid/ enabled region.
    if (!empty($regions[$rid])) {
      $menu_name = $link
        ->getMenuName();
      $plugin_id = 'ultimenu_block:ultimenu-' . $menu_name;
      $block = $this->ultimenuManager
        ->getEntityTypeManager()
        ->getStorage('block')
        ->loadByProperties([
        'plugin' => $plugin_id,
      ]);
      $block = reset($block);
      $config = $block
        ->get('settings');
      $config['current_path'] = $this
        ->getCurrentPath($request);
      $config['has_submenu'] = $sub;
      $config['menu_name'] = $menu_name;
      $config['mlid'] = $mlid;
      $config['title'] = $this->ultimenuManager
        ->getTool()
        ->getTitle($link);

      // Creates render context.
      $context = new RenderContext();

      // Builds the flyout.
      $render = $this->ultimenuManager
        ->getRenderer()
        ->executeInRenderContext($context, function () use ($rid, $config) {
        return $this->ultimenuManager
          ->buildFlyout($rid, $config);
      });

      // Prevents empty render from screwing up the response. Hence the
      // region is provided, but none of the blocks is given:
      // The render array has not yet been rendered, hence not all
      // attachments have been collected yet.
      if ($render) {

        // Add metadata.
        if (!$context
          ->isEmpty()) {
          $bubbleable_metadata = $context
            ->pop();
          BubbleableMetadata::createFromRenderArray($render)
            ->merge($bubbleable_metadata)
            ->applyTo($render);
        }
        $response
          ->addCommand(new UltimenuHtmlCommand('[data-ultiajax-region="' . $rid . '"]', $render, NULL, 'region'));
      }
      return $response;
    }
    throw new AccessDeniedHttpException();
  }
  throw new NotFoundHttpException();
}