Elgg  Version 4.3
Service.php
Go to the documentation of this file.
1 <?php
2 
3 namespace Elgg\Menu;
4 
6 use Elgg\Config;
8 use ElggMenuItem;
9 
13 class Service {
14 
18  private $hooks;
19 
23  private $config;
24 
31  public function __construct(PluginHooksService $hooks, Config $config) {
32  $this->hooks = $hooks;
33  $this->config = $config;
34  }
35 
46  public function getMenu($name, array $params = []) {
47  return $this->prepareMenu($this->getUnpreparedMenu($name, $params));
48  }
49 
58  public function getUnpreparedMenu($name, array $params = []) {
59  $items = $this->prepareMenuItems(elgg_extract('items', $params, []));
60  unset($params['items']);
61 
62  $registered_items = elgg_extract($name, $this->config->menus);
63  if (is_array($registered_items)) {
64  $items->merge($registered_items);
65  }
66 
67  $params['name'] = $name;
68 
69  $params = $this->hooks->trigger('parameters', "menu:$name", $params, $params);
70 
71  if (!isset($params['sort_by'])) {
72  $params['sort_by'] = 'priority';
73  }
74 
75  // trigger specific menu hooks
76  $entity = elgg_extract('entity', $params);
77  if ($entity instanceof \ElggEntity) {
78  $items = $this->hooks->trigger('register', "menu:{$name}:{$entity->type}:{$entity->subtype}", $params, $items);
79  }
80 
81  $annotation = elgg_extract('annotation', $params);
82  if ($annotation instanceof \ElggAnnotation) {
83  $items = $this->hooks->trigger('register', "menu:{$name}:{$annotation->getType()}:{$annotation->getSubtype()}", $params, $items);
84  }
85 
86  $relationship = elgg_extract('relationship', $params);
87  if ($relationship instanceof \ElggRelationship) {
88  $items = $this->hooks->trigger('register', "menu:{$name}:{$relationship->getType()}:{$relationship->getSubtype()}", $params, $items);
89  }
90 
91  // trigger generic menu hook
92  $items = $this->hooks->trigger('register', "menu:{$name}", $params, $items);
93 
94  return new UnpreparedMenu($params, $items);
95  }
96 
104  public function prepareMenu(UnpreparedMenu $menu) {
105  $name = $menu->getName();
106  $params = $menu->getParams();
107  $sort_by = $menu->getSortBy();
108  $selected_menu_item_name = elgg_extract('selected_item_name', $params, '');
109 
110  $builder = new ElggMenuBuilder($menu->getItems());
111  $builder->setSelected($selected_menu_item_name);
112 
113  $params['menu'] = $builder->getMenu($sort_by);
114  $params['selected_item'] = $builder->getSelected();
115 
116  // trigger specific menu hooks
117  $entity = elgg_extract('entity', $params);
118  if ($entity instanceof \ElggEntity) {
119  $params['menu'] = $this->hooks->trigger('prepare', "menu:{$name}:{$entity->type}:{$entity->subtype}", $params, $params['menu']);
120  }
121 
122  $annotation = elgg_extract('annotation', $params);
123  if ($annotation instanceof \ElggAnnotation) {
124  $params['menu'] = $this->hooks->trigger('prepare', "menu:{$name}:{$annotation->getType()}:{$annotation->getSubtype()}", $params, $params['menu']);
125  }
126 
127  $relationship = elgg_extract('relationship', $params);
128  if ($relationship instanceof \ElggRelationship) {
129  $params['menu'] = $this->hooks->trigger('prepare', "menu:{$name}:{$relationship->getType()}:{$relationship->getSubtype()}", $params, $params['menu']);
130  }
131 
132  // trigger generic menu hook
133  $params['menu'] = $this->hooks->trigger('prepare', "menu:$name", $params, $params['menu']);
134 
135  $params['menu'] = $this->prepareVerticalMenu($params['menu'], $params);
136  $params['menu'] = $this->prepareDropdownMenu($params['menu'], $params);
137  $params['menu'] = $this->prepareSelectedParents($params['menu'], $params);
138  $params['menu'] = $this->prepareItemContentsView($params['menu'], $params);
139 
140  return new Menu($params);
141  }
142 
151  protected function prepareVerticalMenu(PreparedMenu $menu, array $params) {
152  if (elgg_extract('prepare_vertical', $params) !== true) {
153  return $menu;
154  }
155 
156  $prepare = function(\ElggMenuItem $menu_item) use (&$prepare) {
157  $child_menu_vars = $menu_item->getChildMenuOptions();
158  if (empty($child_menu_vars['display'])) {
159  $child_menu_vars['display'] = 'toggle';
160  }
161  $menu_item->setChildMenuOptions($child_menu_vars);
162 
163  foreach ($menu_item->getChildren() as $child_menu_item) {
164  $prepare($child_menu_item);
165  }
166  };
167 
168  /* @var $section MenuSection */
169  foreach ($menu as $section) {
170  /* @var $menu_item \ElggMenuItem */
171  foreach ($section as $menu_item) {
172  $prepare($menu_item);
173  }
174  }
175 
176  return $menu;
177  }
178 
187  protected function prepareSelectedParents(PreparedMenu $menu, array $params) {
188  $selected_item = elgg_extract('selected_item', $params);
189  if (!$selected_item instanceof \ElggMenuItem) {
190  return $menu;
191  }
192 
193  $parent = $selected_item->getParent();
194  while ($parent instanceof \ElggMenuItem) {
195  $parent->setSelected();
196  $parent->addItemClass('elgg-has-selected-child');
197  $parent = $parent->getParent();
198  }
199 
200  return $menu;
201  }
202 
211  protected function prepareDropdownMenu(PreparedMenu $menu, array $params) {
212  if (elgg_extract('prepare_dropdown', $params) !== true) {
213  return $menu;
214  }
215 
216  $items = $menu->getItems('default');
217  if (empty($items)) {
218  return $menu;
219  }
220 
221  $menu_name = elgg_extract('name', $params);
222  $menu->getSection('default')->fill([
224  'name' => 'entity-menu-toggle',
225  'icon' => 'ellipsis-v',
226  'href' => false,
227  'text' => '',
228  'child_menu' => [
229  'display' => 'dropdown',
230  'data-position' => json_encode([
231  'at' => 'right bottom',
232  'my' => 'right top',
233  'collision' => 'fit fit',
234  ]),
235  'class' => "elgg-{$menu_name}-dropdown-menu",
236  ],
237  'children' => $items,
238  ]),
239  ]);
240 
241  return $menu;
242  }
243 
254  $item_contents_view = elgg_extract('item_contents_view', $params, 'navigation/menu/elements/item/url');
255 
256  $prepare = function(\ElggMenuItem $menu_item) use (&$prepare, $item_contents_view) {
257  if (!$menu_item->hasItemContentsView()) {
258  $menu_item->setItemContentsView($item_contents_view);
259  }
260 
261  foreach ($menu_item->getChildren() as $child_menu_item) {
262  $prepare($child_menu_item);
263  }
264  };
265 
266  /* @var $section MenuSection */
267  foreach ($menu as $section) {
268  /* @var $menu_item \ElggMenuItem */
269  foreach ($section as $menu_item) {
270  $prepare($menu_item);
271  }
272  }
273 
274  return $menu;
275  }
276 
289  public function combineMenus(array $names = [], array $params = [], $new_name = '') {
290  if (!$new_name) {
291  $new_name = implode('__', $names);
292  }
293 
294  $all_items = new MenuItems();
295 
296  foreach ($names as $name) {
297  $items = $this->getUnpreparedMenu($name, $params)->getItems();
298 
299  /* @var $item \ElggMenuItem */
300  foreach ($items as $item) {
301  $section = $item->getSection();
302  if ($section === 'default') {
303  $item->setSection($name);
304  }
305  $item->setData('menu_name', $name);
306 
307  $all_items->add($item);
308  }
309  }
310 
311  $params['name'] = $new_name;
312 
313  return new UnpreparedMenu($params, $all_items);
314  }
315 
323  public function prepareMenuItems($items = []) {
324  $prepared_items = new MenuItems();
325 
326  foreach ($items as $item) {
327  if (is_array($item)) {
328  $options = $item;
330  }
331 
332  if (!$item instanceof ElggMenuItem) {
333  continue;
334  }
335 
336  $prepared_items->add($item);
337  }
338 
339  return $prepared_items;
340  }
341 }
if(!$items) $item
Definition: delete.php:13
prepareDropdownMenu(PreparedMenu $menu, array $params)
Prepares a dropdown menu.
Definition: Service.php:211
$params
Saves global plugin settings.
Definition: save.php:13
prepareMenuItems($items=[])
Prepare menu items.
Definition: Service.php:323
getSortBy()
Get the designated (or default) sort strategy.
if($id< 1) $annotation
Definition: delete.php:11
__construct(PluginHooksService $hooks, Config $config)
Constructor.
Definition: Service.php:31
if(!$user||!$user->canDelete()) $name
Definition: delete.php:22
getMenu($name, array $params=[])
Build a full menu, pulling items from configuration and the "register" menu hooks.
Definition: Service.php:46
$relationship
Elgg default relationship view.
Definition: default.php:10
getItems($section_id)
Get items in a section.
$menu
Admin sidebar – just outputs the page menus.
Definition: sidebar.php:6
prepareItemContentsView(PreparedMenu $menu, array $params)
Set a content view for each menu item based on the default for the menu.
Definition: Service.php:253
getUnpreparedMenu($name, array $params=[])
Build an unprepared menu.
Definition: Service.php:58
$options
Elgg admin footer.
Definition: footer.php:6
Elgg Menu Item.
$items
Definition: delete.php:8
getParams()
Get the menu parameters.
prepareSelectedParents(PreparedMenu $menu, array $params)
Marks parents of selected items also as selected.
Definition: Service.php:187
static factory($options)
Create an ElggMenuItem from an associative array.
Linear set of menu items collected from configuration and the "register" hook.
Methods to construct and prepare menus for rendering.
Definition: Service.php:13
getSection($id)
Get menu section.
prepareVerticalMenu(PreparedMenu $menu, array $params)
Prepares a vertical menu by setting the display child menu option to "toggle" if not set...
Definition: Service.php:151
$entity
Definition: reset.php:8
getName()
Get the menu name.
combineMenus(array $names=[], array $params=[], $new_name= '')
Combine several menus into one.
Definition: Service.php:289
Represents a menu that has been broken down into sections, with menu hierarchy trees setup...
elgg_extract($key, $array, $default=null, $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.
Definition: elgglib.php:547
getItems()
Get the menu items.
A collection of menu items.
Definition: MenuItems.php:10
A complete menu, sorted, filtered by the "prepare" hook, and split into sections. ...
Definition: Menu.php:10
prepareMenu(UnpreparedMenu $menu)
Split a menu into sections, and pass it through the "prepare" hook.
Definition: Service.php:104