1 layout.module layout_get_layout_by_path($path = NULL, $router_item = NULL, $is_layout_page = FALSE)

Get the layout which is active based on a path or router item.

This may also be used to get the current layout on a page if no parameters are passed. In which case the current path will be used.

@since 1.4.0

Parameters

string $path: The menu routing path, with all placeholders represented by "%" symbols.

array $router_item: The menu router item for the page currently being loaded. The $path parameter will be ignored if $router_item is specified.

bool $is_layout_page: Flag that says whether this is being called from the page callback for a layout-provided page.

Return value

Layout: The Layout object for the specified path.

File

core/modules/layout/layout.module, line 1431
The Layout module creates pages and wraps existing pages in layouts.

Code

function layout_get_layout_by_path($path = NULL, $router_item = NULL, $is_layout_page = FALSE) {
  if (!isset($router_item)) {
    $router_item = menu_get_item($path);
  }

  // Use the static cache, but keyed on the normal path (such as node/1), rather
  // than the system path (such as node/%), since client modules might serve up
  // different layouts for the same system path.
  $href = $router_item['href'];
  $layouts_by_path = &backdrop_static(__FUNCTION__, array());
  if (isset($layouts_by_path[$href])) {
    return $layouts_by_path[$href];
  }

  $layouts = layout_load_multiple_by_router_item($router_item, !$is_layout_page);
  $selected_layout = NULL;
  foreach ($layouts as $layout) {
    // Contexts must have their data set before the layout's access may be
    // checked.
    $menu_contexts = $layout->getContexts(LayoutContext::USAGE_TYPE_MENU);
    foreach ($menu_contexts as $menu_context) {
      $menu_context->setDataFromRouter($router_item);
    }
    backdrop_static_reset('Layout::getContexts');

    if (!$layout->disabled && $layout->checkAccess()) {
      $selected_layout = $layout;
      break;
    }
  }

  if (!$is_layout_page) {
    // If no layout matches at the path, use a default layout.
    if (!$selected_layout) {
      if (path_is_admin($router_item['path']) && user_access('view the administration theme')) {
        $selected_layout = layout_load('admin_default');
      }
      else {
        $selected_layout = layout_load('default');
      }
    }
  }

  $layouts_by_path[$href] = $selected_layout;
  return $selected_layout;
}