什么是hook_translated_menu_link_alter()来更改菜单链接?[重复]


8

我想更改Drupal 8中的菜单链接。在Drupal 7中,我们可以使用实现此功能hook_translated_menu_link_alter()

function module_translated_menu_link_alter(&$item, $map) {
  global $user;

  if (!empty($item['access'])) {
    // Administrator will access all menu's.
    if (strpos(current_path(), 'admin/structure/menu/manage/' . $item['menu_name']) === 0 && user_access('administer menu')) {
      return;
    }
    // If userid is equal to menu user id.
    if ($user->uid == 1) {
      $access = 'UNBLOCK';
      break;
    }
   // Block menu.
    else {
      $access = 'BLOCK';
    }
    // Access FALSE if Menu not for USER.
    if ($access == 'BLOCK') {
      $item['access'] = FALSE;
    }
  }
}

在Drupal 7中,我根据某些条件(例如用户ID)隐藏/禁用菜单。

同样,我想更改Drupal 8中的菜单链接。如何实现?


在此页面上,如果您滚动到评论之前的结尾,则表明hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(),我不知道它是对还是错,我只是发现了这一点。可能是您可以发现的。如果有的话,也让我知道。
CodeNext

Answers:


0

HOOK_link_alter将是一个等效于hook_translated_menu_link_alter的D8:

/**
 * Implements hook_link_alter().
 *
 * @inheritdoc
 */
function HOOK_link_alter(&$variables) {
  $url = $variables['url'];
  // Check url is routed in Drupal.
  if ($url->isRouted()) {
    // Load the current user by user ID.
    $currentUser = User::load(\Drupal::currentUser()->id());
    // Check access.
    $urlAccess = $url->access();
    // Get url options.
    $urlOptions = $url->getOptions();
    // Your code here.
  }
}

有关更多API信息,请参见Drupal 8 类URL

但是,您可以这样使用Hook_preprocess_HOOK()

/**
 * Implements hook_preprocess_hook().
 *
 * @inheritdoc
 */
function HOOK_preprocess_menu(&$variables) {
  if (isset($variables['menu_name']) && $variables['menu_name'] === 'menu_name') {
    foreach($variables['items'] as $key => $item) {
      $url = $item['url']->toString();
      if ($url == '/user') {
        // Remove menu item.
        unset($variables['items'][$key]);
      }
    }
  }
}

只是在path上面进行了检查,但是它显示您可以根据某些条件隐藏单个菜单项。


对于访问限制,根据您的需要,您可以根据entity菜单项而不是菜单项来查看路由和权限,并让Drupal处理菜单项的显示。

要通过角色访问菜单,请查看以下模块:https : //www.drupal.org/project/menu_item_role_access


hook_link_alter()不能将其视为替代项,hook_translated_menu_link_alter()因为只有很少的键可以更改,而访问键不是其中之一。
kiamlaluno

-1

从/ node / 2122241上的drupal.org:

动态更改菜单链接并动态添加菜单链接

可以使用hook_menu_links_discovered_alter()更改静态定义的菜单项(但请注意,没有hook_menu_link_discovered(),菜单链接是从.yml文件构建的,如上所述)。该挂钩也可以用于添加新的动态菜单项。

更常见的是,您可能希望使用派生类添加新的菜单链接插件。例如,Views提供的菜单链接被添加到views.links.menu.yml中,该链接指定派生程序类\ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink。

最后,您可以直接使用插件管理器来添加,更新和删除定义。

您可能会 为您的方案使用hook_menu_links_discovered_alter


编辑:您要编辑访问该链接的权限,因此它不会自动显示在菜单中。

在drupal.org上阅读:/ node / 2311427

Drupal 8

在Drupal 8中,您可以通过引用将动态定义那些权限的函数来支持动态权限。该回调定义了内核过滤器模块的权限。

// in filter.permissions.yml


permission_callbacks:
  - Drupal\filter\FilterPermissions::permissions

// in FilterPermissions.php

class FilterPermissions {
  public function permissions() {
    $permissions = [];
    // Generate permissions for each text format. Warn the administrator that any
    // of them are potentially unsafe.
    /** @var \Drupal\filter\FilterFormatInterface[] $formats */
    $formats = $this->entityManager->getStorage('filter_format')->loadByProperties(['status' => TRUE]);
    uasort($formats, 'Drupal\Core\Config\Entity\ConfigEntityBase::sort');
    foreach ($formats as $format) {
      if ($permission = $format->getPermissionName()) {
        $permissions[$permission] = [
          'title' => $this->t('Use the @label text format', ['@url' => $format->url(), '@label' => $format->label()]),
          'description' => String::placeholder($this->t('Warning: This permission may have security implications depending on how the text format is configured.')),
        ];
      }
    }
    return $permissions;
  }
}

您还应该阅读这篇文章https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8(向下滚动到“访问控制”和“ Hook_Menu_Alter”)。

我希望这有帮助。


1
尝试过此hook_menu_links_discovered_alter,但这对隐藏菜单没有用。请检查该钩子仅对更改链接定义
阿杰·雷迪

参考上面的文章,我尝试过这样做,但是那样只会使访问被拒绝,它不会隐藏菜单。
阿杰·雷迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.