Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 38 |
BookExport | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
90 | |
0.00% |
0 / 38 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
bookExportHtml | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 15 |
|||
exportTraverse | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 10 |
|||
bookNodeExport | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 9 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\book\BookExport. | |
*/ | |
namespace Drupal\book; | |
use Drupal\Core\Entity\EntityManagerInterface; | |
use Drupal\node\NodeInterface; | |
/** | |
* Provides methods for exporting book to different formats. | |
* | |
* If you would like to add another format, swap this class in container. | |
*/ | |
class BookExport { | |
/** | |
* The node storage. | |
* | |
* @var \Drupal\Core\Entity\EntityStorageInterface | |
*/ | |
protected $nodeStorage; | |
/** | |
* The node view builder. | |
* | |
* @var \Drupal\Core\Entity\EntityViewBuilderInterface | |
*/ | |
protected $viewBuilder; | |
/** | |
* The book manager. | |
* | |
* @var \Drupal\book\BookManagerInterface | |
*/ | |
protected $bookManager; | |
/** | |
* Constructs a BookExport object. | |
* | |
* @param \Drupal\Core\Entity\EntityManagerInterface $entityManager | |
* The entity manager. | |
* @param \Drupal\book\BookManagerInterface $book_manager | |
* The book manager. | |
*/ | |
public function __construct(EntityManagerInterface $entityManager, BookManagerInterface $book_manager) { | |
$this->nodeStorage = $entityManager->getStorage('node'); | |
$this->viewBuilder = $entityManager->getViewBuilder('node'); | |
$this->bookManager = $book_manager; | |
} | |
/** | |
* Generates HTML for export when invoked by book_export(). | |
* | |
* The given node is embedded to its absolute depth in a top level section. For | |
* example, a child node with depth 2 in the hierarchy is contained in | |
* (otherwise empty) <div> elements corresponding to depth 0 and depth 1. | |
* This is intended to support WYSIWYG output; for instance, level 3 sections | |
* always look like level 3 sections, no matter their depth relative to the | |
* node selected to be exported as printer-friendly HTML. | |
* | |
* @param \Drupal\node\NodeInterface $node | |
* The node to export. | |
* | |
* @return array | |
* A render array representing the HTML for a node and its children in the | |
* book hierarchy. | |
* | |
* @throws \Exception | |
* Thrown when the node was not attached to a book. | |
*/ | |
public function bookExportHtml(NodeInterface $node) { | |
if (!isset($node->book)) { | |
throw new \Exception(); | |
} | |
$tree = $this->bookManager->bookSubtreeData($node->book); | |
$contents = $this->exportTraverse($tree, array($this, 'bookNodeExport')); | |
return array( | |
'#theme' => 'book_export_html', | |
'#title' => $node->label(), | |
'#contents' => $contents, | |
'#depth' => $node->book['depth'], | |
'#cache' => [ | |
'tags' => $node->getEntityType()->getListCacheTags(), | |
], | |
); | |
} | |
/** | |
* Traverses the book tree to build printable or exportable output. | |
* | |
* During the traversal, the callback is applied to each node and is called | |
* recursively for each child of the node (in weight, title order). | |
* | |
* @param array $tree | |
* A subtree of the book menu hierarchy, rooted at the current page. | |
* @param callable $callable | |
* A callback to be called upon visiting a node in the tree. | |
* | |
* @return string | |
* The output generated in visiting each node. | |
*/ | |
protected function exportTraverse(array $tree, $callable) { | |
// If there is no valid callable, use the default callback. | |
$callable = !empty($callable) ? $callable : array($this, 'bookNodeExport'); | |
$build = array(); | |
foreach ($tree as $data) { | |
// Note- access checking is already performed when building the tree. | |
if ($node = $this->nodeStorage->load($data['link']['nid'])) { | |
$children = $data['below'] ? $this->exportTraverse($data['below'], $callable) : ''; | |
$build[] = call_user_func($callable, $node, $children); | |
} | |
} | |
return $build; | |
} | |
/** | |
* Generates printer-friendly HTML for a node. | |
* | |
* @param \Drupal\node\NodeInterface $node | |
* The node that will be output. | |
* @param string $children | |
* (optional) All the rendered child nodes within the current node. Defaults | |
* to an empty string. | |
* | |
* @return array | |
* A render array for the exported HTML of a given node. | |
* | |
* @see \Drupal\book\BookExport::exportTraverse() | |
*/ | |
protected function bookNodeExport(NodeInterface $node, $children = '') { | |
$build = $this->viewBuilder->view($node, 'print', NULL); | |
unset($build['#theme']); | |
return array( | |
'#theme' => 'book_node_export_html', | |
'#content' => $build, | |
'#node' => $node, | |
'#children' => $children, | |
); | |
} | |
} |