View source
<?php
namespace Drupal\toolbar\Controller;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Menu\MenuTreeParameters;
use Drupal\Core\Security\TrustedCallbackInterface;
use Drupal\toolbar\Ajax\SetSubtreesCommand;
class ToolbarController extends ControllerBase implements TrustedCallbackInterface {
public function subtreesAjax() {
list($subtrees, $cacheability) = toolbar_get_rendered_subtrees();
$response = new AjaxResponse();
$response
->addCommand(new SetSubtreesCommand($subtrees));
$max_age = 365 * 24 * 60 * 60;
$response
->setPrivate();
$response
->setMaxAge($max_age);
$expires = new \DateTime();
$expires
->setTimestamp(REQUEST_TIME + $max_age);
$response
->setExpires($expires);
return $response;
}
public function checkSubTreeAccess($hash) {
$expected_hash = _toolbar_get_subtrees_hash()[0];
return AccessResult::allowedIf($this
->currentUser()
->hasPermission('access toolbar') && hash_equals($expected_hash, $hash))
->cachePerPermissions();
}
public static function preRenderAdministrationTray(array $element) {
$menu_tree = \Drupal::service('toolbar.menu_tree');
$parameters = new MenuTreeParameters();
$parameters
->setMinDepth(2)
->setMaxDepth(2)
->onlyEnabledLinks();
$tree = $menu_tree
->load('admin', $parameters);
$manipulators = [
[
'callable' => 'menu.default_tree_manipulators:checkAccess',
],
[
'callable' => 'menu.default_tree_manipulators:generateIndexAndSort',
],
[
'callable' => 'toolbar_menu_navigation_links',
],
];
$tree = $menu_tree
->transform($tree, $manipulators);
$element['administration_menu'] = $menu_tree
->build($tree);
return $element;
}
public static function preRenderGetRenderedSubtrees(array $data) {
$menu_tree = \Drupal::service('toolbar.menu_tree');
$parameters = new MenuTreeParameters();
$parameters
->setMinDepth(2)
->setMaxDepth(4)
->onlyEnabledLinks();
$tree = $menu_tree
->load('admin', $parameters);
$manipulators = [
[
'callable' => 'menu.default_tree_manipulators:checkAccess',
],
[
'callable' => 'menu.default_tree_manipulators:generateIndexAndSort',
],
[
'callable' => 'toolbar_menu_navigation_links',
],
];
$tree = $menu_tree
->transform($tree, $manipulators);
$subtrees = [];
$cacheability = new CacheableMetadata();
foreach ($tree as $element) {
$link = $element->link;
if ($element->subtree) {
$subtree = $menu_tree
->build($element->subtree);
$output = \Drupal::service('renderer')
->renderPlain($subtree);
$cacheability = $cacheability
->merge(CacheableMetadata::createFromRenderArray($subtree));
}
else {
$output = '';
}
$url = $link
->getUrlObject();
$id = str_replace([
'.',
'<',
'>',
], [
'-',
'',
'',
], $url
->isRouted() ? $url
->getRouteName() : $url
->getUri());
$subtrees[$id] = $output;
}
$cacheability
->applyTo($data);
$data['#subtrees'] = $subtrees;
return $data;
}
public static function trustedCallbacks() {
return [
'preRenderAdministrationTray',
'preRenderGetRenderedSubtrees',
];
}
}