Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\toolbar\Element;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Utility\Html;
|
Chris@0
|
6 use Drupal\Core\Render\Element\RenderElement;
|
Chris@0
|
7 use Drupal\Core\Render\Element;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * Provides a render element for the default Drupal toolbar.
|
Chris@0
|
11 *
|
Chris@0
|
12 * @RenderElement("toolbar")
|
Chris@0
|
13 */
|
Chris@0
|
14 class Toolbar extends RenderElement {
|
Chris@0
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * {@inheritdoc}
|
Chris@0
|
18 */
|
Chris@0
|
19 public function getInfo() {
|
Chris@0
|
20 $class = get_class($this);
|
Chris@0
|
21 return [
|
Chris@0
|
22 '#pre_render' => [
|
Chris@0
|
23 [$class, 'preRenderToolbar'],
|
Chris@0
|
24 ],
|
Chris@0
|
25 '#theme' => 'toolbar',
|
Chris@0
|
26 '#attached' => [
|
Chris@0
|
27 'library' => [
|
Chris@0
|
28 'toolbar/toolbar',
|
Chris@0
|
29 ],
|
Chris@0
|
30 ],
|
Chris@0
|
31 // Metadata for the toolbar wrapping element.
|
Chris@0
|
32 '#attributes' => [
|
Chris@0
|
33 // The id cannot be simply "toolbar" or it will clash with the
|
Chris@0
|
34 // simpletest tests listing which produces a checkbox with attribute
|
Chris@0
|
35 // id="toolbar".
|
Chris@0
|
36 'id' => 'toolbar-administration',
|
Chris@0
|
37 'role' => 'group',
|
Chris@0
|
38 'aria-label' => $this->t('Site administration toolbar'),
|
Chris@0
|
39 ],
|
Chris@0
|
40 // Metadata for the administration bar.
|
Chris@0
|
41 '#bar' => [
|
Chris@0
|
42 '#heading' => $this->t('Toolbar items'),
|
Chris@0
|
43 '#attributes' => [
|
Chris@0
|
44 'id' => 'toolbar-bar',
|
Chris@0
|
45 'role' => 'navigation',
|
Chris@0
|
46 'aria-label' => $this->t('Toolbar items'),
|
Chris@0
|
47 ],
|
Chris@0
|
48 ],
|
Chris@0
|
49 ];
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * Builds the Toolbar as a structured array ready for drupal_render().
|
Chris@0
|
54 *
|
Chris@0
|
55 * Since building the toolbar takes some time, it is done just prior to
|
Chris@0
|
56 * rendering to ensure that it is built only if it will be displayed.
|
Chris@0
|
57 *
|
Chris@0
|
58 * @param array $element
|
Chris@0
|
59 * A renderable array.
|
Chris@0
|
60 *
|
Chris@0
|
61 * @return array
|
Chris@0
|
62 * A renderable array.
|
Chris@0
|
63 *
|
Chris@0
|
64 * @see toolbar_page_top()
|
Chris@0
|
65 */
|
Chris@0
|
66 public static function preRenderToolbar($element) {
|
Chris@0
|
67 // Get the configured breakpoints to switch from vertical to horizontal
|
Chris@0
|
68 // toolbar presentation.
|
Chris@0
|
69 $breakpoints = static::breakpointManager()->getBreakpointsByGroup('toolbar');
|
Chris@0
|
70 if (!empty($breakpoints)) {
|
Chris@0
|
71 $media_queries = [];
|
Chris@0
|
72 foreach ($breakpoints as $id => $breakpoint) {
|
Chris@0
|
73 $media_queries[$id] = $breakpoint->getMediaQuery();
|
Chris@0
|
74 }
|
Chris@0
|
75
|
Chris@0
|
76 $element['#attached']['drupalSettings']['toolbar']['breakpoints'] = $media_queries;
|
Chris@0
|
77 }
|
Chris@0
|
78
|
Chris@0
|
79 $module_handler = static::moduleHandler();
|
Chris@0
|
80 // Get toolbar items from all modules that implement hook_toolbar().
|
Chris@0
|
81 $items = $module_handler->invokeAll('toolbar');
|
Chris@0
|
82 // Allow for altering of hook_toolbar().
|
Chris@0
|
83 $module_handler->alter('toolbar', $items);
|
Chris@0
|
84 // Sort the children.
|
Chris@0
|
85 uasort($items, ['\Drupal\Component\Utility\SortArray', 'sortByWeightProperty']);
|
Chris@0
|
86
|
Chris@0
|
87 // Merge in the original toolbar values.
|
Chris@0
|
88 $element = array_merge($element, $items);
|
Chris@0
|
89
|
Chris@0
|
90 // Assign each item a unique ID, based on its key.
|
Chris@0
|
91 foreach (Element::children($element) as $key) {
|
Chris@0
|
92 $element[$key]['#id'] = Html::getId('toolbar-item-' . $key);
|
Chris@0
|
93 }
|
Chris@0
|
94
|
Chris@0
|
95 return $element;
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 /**
|
Chris@0
|
99 * Wraps the breakpoint manager.
|
Chris@0
|
100 *
|
Chris@0
|
101 * @return \Drupal\breakpoint\BreakpointManagerInterface
|
Chris@0
|
102 */
|
Chris@0
|
103 protected static function breakpointManager() {
|
Chris@0
|
104 return \Drupal::service('breakpoint.manager');
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 /**
|
Chris@0
|
108 * Wraps the module handler.
|
Chris@0
|
109 *
|
Chris@0
|
110 * @return \Drupal\Core\Extension\ModuleHandlerInterface
|
Chris@0
|
111 */
|
Chris@0
|
112 protected static function moduleHandler() {
|
Chris@0
|
113 return \Drupal::moduleHandler();
|
Chris@0
|
114 }
|
Chris@0
|
115
|
Chris@0
|
116 }
|