diff core/lib/Drupal/Core/Menu/MenuLinkTreeElement.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Menu/MenuLinkTreeElement.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,123 @@
+<?php
+
+namespace Drupal\Core\Menu;
+
+/**
+ * Provides a value object to model an element in a menu link tree.
+ *
+ * \Drupal\Core\Menu\MenuLinkTreeElement objects represent a menu link's data.
+ * Objects of this class provide complimentary data: the placement in a tree.
+ * Therefore, we can summarize this split as follows:
+ * - Menu link objects contain all information about an individual menu link,
+ *   plus what their parent is. But they don't know where exactly in a menu link
+ *   tree they live.
+ * - Instances of this class are complimentary to those objects, they know:
+ *   - All additional metadata from {menu_tree}, which contains "materialized"
+ *     metadata about a menu link tree, such as whether a link in the tree has
+ *     visible children and the depth relative to the root.
+ *   - Plus all additional metadata that's adjusted for the current tree query,
+ *     such as whether the link is in the active trail, whether the link is
+ *     accessible for the current user, and the link's children (which are only
+ *     loaded if the link was marked as "expanded" by the query).
+ *
+ * @see \Drupal\Core\Menu\MenuTreeStorage::loadTreeData()
+ */
+class MenuLinkTreeElement {
+
+  /**
+   * The menu link for this element in a menu link tree.
+   *
+   * @var \Drupal\Core\Menu\MenuLinkInterface
+   */
+  public $link;
+
+  /**
+   * The subtree of this element in the menu link tree (this link's children).
+   *
+   * (Children of a link are only loaded if a link is marked as "expanded" by
+   * the query.)
+   *
+   * @var \Drupal\Core\Menu\MenuLinkTreeElement[]
+   */
+  public $subtree;
+
+  /**
+   * The depth of this link relative to the root of the tree.
+   *
+   * @var int
+   */
+  public $depth;
+
+  /**
+   * Whether this link has any children at all.
+   *
+   * @var bool
+   */
+  public $hasChildren;
+
+  /**
+   * Whether this link is in the active trail.
+   *
+   * @var bool
+   */
+  public $inActiveTrail;
+
+  /**
+   * Whether this link is accessible by the current user.
+   *
+   * If the value is NULL the access was not determined yet, if an access result
+   * object, it was determined already.
+   *
+   * @var \Drupal\Core\Access\AccessResultInterface|null
+   */
+  public $access;
+
+  /**
+   * Additional options for this link.
+   *
+   * This is merged (\Drupal\Component\Utility\NestedArray::mergeDeep()) with
+   * \Drupal\Core\Menu\MenuLinkInterface::getOptions(), to allow menu link tree
+   * manipulators to add or override link options.
+   */
+  public $options = [];
+
+  /**
+   * Constructs a new \Drupal\Core\Menu\MenuLinkTreeElement.
+   *
+   * @param \Drupal\Core\Menu\MenuLinkInterface $link
+   *   The menu link for this element in the menu link tree.
+   * @param bool $has_children
+   *   A flag as to whether this element has children even if they are not
+   *   included in the tree (i.e. this may be TRUE even if $subtree is empty).
+   * @param int $depth
+   *   The depth of this element relative to the tree root.
+   * @param bool $in_active_trail
+   *   A flag as to whether this link was included in the list of active trail
+   *   IDs used to build the tree.
+   * @param \Drupal\Core\Menu\MenuLinkTreeElement[] $subtree
+   *   The children of this element in the menu link tree.
+   */
+  public function __construct(MenuLinkInterface $link, $has_children, $depth, $in_active_trail, array $subtree) {
+    // Essential properties.
+    $this->link = $link;
+    $this->hasChildren = $has_children;
+    $this->depth = $depth;
+    $this->subtree = $subtree;
+    $this->inActiveTrail = $in_active_trail;
+  }
+
+  /**
+   * Counts all menu links in the current subtree.
+   *
+   * @return int
+   *   The number of menu links in this subtree (one plus the number of menu
+   *   links in all descendants).
+   */
+  public function count() {
+    $sum = function ($carry, MenuLinkTreeElement $element) {
+      return $carry + $element->count();
+    };
+    return 1 + array_reduce($this->subtree, $sum);
+  }
+
+}