BookManager::bookSubtreeData

public BookManager::bookSubtreeData($link)

Gets the data representing a subtree of the book hierarchy.

The root of the subtree will be the link passed as a parameter, so the returned tree will contain this item and all its descendants in the menu tree.

Parameters

array $link: A fully loaded book link.

Return value

A subtree of book links in an array, in the order they should be rendered.

Overrides BookManagerInterface::bookSubtreeData

File

core/modules/book/src/BookManager.php, line 1082

Class

BookManager
Defines a book manager.

Namespace

Drupal\book

Code

public function bookSubtreeData($link) {
  $tree = &drupal_static(__METHOD__, array());

  // Generate a cache ID (cid) specific for this $link.
  $cid = 'book-links:subtree-cid:' . $link['nid'];

  if (!isset($tree[$cid])) {
    $tree_cid_cache = \Drupal::cache('data')->get($cid);

    if ($tree_cid_cache && $tree_cid_cache->data) {
      // If the cache entry exists, it will just be the cid for the actual
      // data. This avoids duplication of large amounts of data.
      $cache = \Drupal::cache('data')->get($tree_cid_cache->data);

      if ($cache && isset($cache->data)) {
        $data = $cache->data;
      }
    }

    // If the subtree data was not in the cache, $data will be NULL.
    if (!isset($data)) {
      $result = $this->bookOutlineStorage->getBookSubtree($link, static::BOOK_MAX_DEPTH);
      $links = array();
      foreach ($result as $item) {
        $links[] = $item;
      }
      $data['tree'] = $this->buildBookOutlineData($links, array(), $link['depth']);
      $data['node_links'] = array();
      $this->bookTreeCollectNodeLinks($data['tree'], $data['node_links']);
      // Compute the real cid for book subtree data.
      $tree_cid = 'book-links:subtree-data:' . hash('sha256', serialize($data));
      // Cache the data, if it is not already in the cache.

      if (!\Drupal::cache('data')->get($tree_cid)) {
        \Drupal::cache('data')->set($tree_cid, $data, Cache::PERMANENT, array('bid:' . $link['bid']));
      }
      // Cache the cid of the (shared) data using the book and item-specific
      // cid.
      \Drupal::cache('data')->set($cid, $tree_cid, Cache::PERMANENT, array('bid:' . $link['bid']));
    }
    // Check access for the current user to each item in the tree.
    $this->bookTreeCheckAccess($data['tree'], $data['node_links']);
    $tree[$cid] = $data['tree'];
  }

  return $tree[$cid];
}
doc_Drupal
2016-10-29 08:48:08
Comments
Leave a Comment

Please login to continue.