class BookExport

Same name in other branches
  1. 9 core/modules/book/src/BookExport.php \Drupal\book\BookExport
  2. 10 core/modules/book/src/BookExport.php \Drupal\book\BookExport
  3. 11.x core/modules/book/src/BookExport.php \Drupal\book\BookExport

Provides methods for exporting book to different formats.

If you would like to add another format, swap this class in container.

Hierarchy

Expanded class hierarchy of BookExport

1 file declares its use of BookExport
BookController.php in core/modules/book/src/Controller/BookController.php
1 string reference to 'BookExport'
book.services.yml in core/modules/book/book.services.yml
core/modules/book/book.services.yml
1 service uses BookExport
book.export in core/modules/book/book.services.yml
Drupal\book\BookExport

File

core/modules/book/src/BookExport.php, line 13

Namespace

Drupal\book
View source
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\EntityTypeManagerInterface $entity_type_manager
     *   The entity type manager.
     * @param \Drupal\book\BookManagerInterface $book_manager
     *   The book manager.
     */
    public function __construct(EntityTypeManagerInterface $entity_type_manager, BookManagerInterface $book_manager) {
        $this->nodeStorage = $entity_type_manager->getStorage('node');
        $this->viewBuilder = $entity_type_manager->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, [
            $this,
            'bookNodeExport',
        ]);
        return [
            '#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 : [
            $this,
            'bookNodeExport',
        ];
        $build = [];
        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 [
            '#theme' => 'book_node_export_html',
            '#content' => $build,
            '#node' => $node,
            '#children' => $children,
        ];
    }

}

Members

Title Sort descending Modifiers Object type Summary
BookExport::$bookManager protected property The book manager.
BookExport::$nodeStorage protected property The node storage.
BookExport::$viewBuilder protected property The node view builder.
BookExport::bookExportHtml public function Generates HTML for export when invoked by book_export().
BookExport::bookNodeExport protected function Generates printer-friendly HTML for a node.
BookExport::exportTraverse protected function Traverses the book tree to build printable or exportable output.
BookExport::__construct public function Constructs a BookExport object.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.