diff core/modules/book/src/BookOutline.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/book/src/BookOutline.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,129 @@
+<?php
+
+namespace Drupal\book;
+
+/**
+ * Provides handling to render the book outline.
+ */
+class BookOutline {
+
+  /**
+   * The book manager.
+   *
+   * @var \Drupal\book\BookManagerInterface
+   */
+  protected $bookManager;
+
+  /**
+   * Constructs a new BookOutline.
+   *
+   * @param \Drupal\book\BookManagerInterface $book_manager
+   *   The book manager.
+   */
+  public function __construct(BookManagerInterface $book_manager) {
+    $this->bookManager = $book_manager;
+  }
+
+  /**
+   * Fetches the book link for the previous page of the book.
+   *
+   * @param array $book_link
+   *   A fully loaded book link that is part of the book hierarchy.
+   *
+   * @return array
+   *   A fully loaded book link for the page before the one represented in
+   *   $book_link.
+   */
+  public function prevLink(array $book_link) {
+    // If the parent is zero, we are at the start of a book.
+    if ($book_link['pid'] == 0) {
+      return NULL;
+    }
+    // Assigning the array to $flat resets the array pointer for use with each().
+    $flat = $this->bookManager->bookTreeGetFlat($book_link);
+    $curr = NULL;
+    do {
+      $prev = $curr;
+      list($key, $curr) = each($flat);
+    } while ($key && $key != $book_link['nid']);
+
+    if ($key == $book_link['nid']) {
+      // The previous page in the book may be a child of the previous visible link.
+      if ($prev['depth'] == $book_link['depth']) {
+        // The subtree will have only one link at the top level - get its data.
+        $tree = $this->bookManager->bookSubtreeData($prev);
+        $data = array_shift($tree);
+        // The link of interest is the last child - iterate to find the deepest one.
+        while ($data['below']) {
+          $data = end($data['below']);
+        }
+        $this->bookManager->bookLinkTranslate($data['link']);
+        return $data['link'];
+      }
+      else {
+        $this->bookManager->bookLinkTranslate($prev);
+        return $prev;
+      }
+    }
+  }
+
+  /**
+   * Fetches the book link for the next page of the book.
+   *
+   * @param array $book_link
+   *   A fully loaded book link that is part of the book hierarchy.
+   *
+   * @return array
+   *   A fully loaded book link for the page after the one represented in
+   *   $book_link.
+   */
+  public function nextLink(array $book_link) {
+    // Assigning the array to $flat resets the array pointer for use with each().
+    $flat = $this->bookManager->bookTreeGetFlat($book_link);
+    do {
+      list($key,) = each($flat);
+    } while ($key && $key != $book_link['nid']);
+
+    if ($key == $book_link['nid']) {
+      $next = current($flat);
+      if ($next) {
+        $this->bookManager->bookLinkTranslate($next);
+      }
+      return $next;
+    }
+  }
+
+  /**
+   * Formats the book links for the child pages of the current page.
+   *
+   * @param array $book_link
+   *   A fully loaded book link that is part of the book hierarchy.
+   *
+   * @return array
+   *   HTML for the links to the child pages of the current page.
+   */
+  public function childrenLinks(array $book_link) {
+    $flat = $this->bookManager->bookTreeGetFlat($book_link);
+
+    $children = [];
+
+    if ($book_link['has_children']) {
+      // Walk through the array until we find the current page.
+      do {
+        $link = array_shift($flat);
+      } while ($link && ($link['nid'] != $book_link['nid']));
+      // Continue though the array and collect the links whose parent is this page.
+      while (($link = array_shift($flat)) && $link['pid'] == $book_link['nid']) {
+        $data['link'] = $link;
+        $data['below'] = '';
+        $children[] = $data;
+      }
+    }
+
+    if ($children) {
+      return $this->bookManager->bookTreeOutput($children);
+    }
+    return '';
+  }
+
+}