メニューリンクを変更するための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

回答:


0

HOOK_link_alterは、hook_translated_menu_link_alterと同等の1つの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()変更できるキーはわずかしかなく、アクセスキーはそれらの1つではないため、の代わりとは見なされません。
kiamlaluno

-1

/ node / 2122241のdrupal.orgから:

メニューリンクの変更とメニューリンクの動的な追加

静的に定義されたメニュー項目は、hook_menu_links_discovered_alter()を使用して変更できます(ただし、hook_menu_link_discovered()がないことに注意してください。メニューリンクは、上記のように.ymlファイルから構築されます)。このフックは、新しい動的メニュー項目を追加するためにも使用できます。

多くの場合、派生クラスを使用して新しいメニューリンクプラグインを追加することができます。たとえば、ビューが提供するメニューリンクは、派生クラス\ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLinkを指定するviews.links.menu.ymlに追加されます。

最後に、プラグインマネージャを直接使用して、定義を追加、更新、および削除できます。

シナリオには、おそらく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(「Access Control」と「Hook_Menu_Alter」までスクロールしてください)もお読みください

これがお役に立てば幸いです。


1
このhook_menu_links_discovered_alterを試しましたが、これはメニューを非表示にするのに役立ちません。このフックがリンク定義の変更に
Ajay Reddy 2016

上記の記事を参考にしてみましたが、アクセス拒否のみとなり、メニューが非表示になりません。
Ajay Reddy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.