Tương đương với hook_translated_menu_link_alter () để thay đổi liên kết menu là gì? [bản sao]


8

Tôi muốn thay đổi liên kết menu trong Drupal 8. Trong Drupal 7 chúng ta có thể đạt được điều này bằng cách sử dụng 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;
    }
  }
}

Trong Drupal 7, tôi ẩn / tắt menu dựa trên một số điều kiện như ID người dùng.

Tương tự, tôi muốn thay đổi liên kết menu trong Drupal 8. Làm thế nào tôi có thể đạt được nó?


Trên trang này nếu bạn cuộn để kết thúc trước khi bình luận, nó đã tuyên bố hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(), tôi không biết nó đúng hay sai, tôi chỉ tìm thấy điều này. Có thể là bạn có thể làm cho ra. Nếu, cho tôi cũng biết.
CodeNext

Câu trả lời:


0

HOOK_link_alter sẽ là một D8 tương đương với hook_translated_menu_link_alter:

/**
 * 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.
  }
}

Xem URL lớp 8 Drupal để biết thêm thông tin API.

Tuy nhiên, bạn có thể sử dụng Hook_pre process_HOOK () như sau:

/**
 * 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]);
      }
    }
  }
}

Chỉ cần kiểm tra pathở trên, nhưng nó cho thấy bạn có thể ẩn một mục menu dựa trên các tiêu chí nhất định.


Đối với các hạn chế truy cập, tùy thuộc vào nhu cầu của bạn, bạn có thể xem xét định tuyến và quyền dựa trên entitythay vì mục menu và để Drupal xử lý hiển thị mục menu.

Để truy cập menu theo vai trò, hãy xem mô-đun này: https://www.drupal.org/project/menu_item_role_access


hook_link_alter()không được coi là sự thay thế hook_translated_menu_link_alter()vì chỉ có một vài khóa có thể thay đổi và khóa truy cập không phải là một trong số đó.
kiamlaluno

-1

Từ drupal.org trên / nút / 2122241:

Thay đổi liên kết menu và thêm liên kết menu động

Các mục menu được xác định tĩnh có thể được thay đổi bằng hook_menu_links_discovered_alter () (nhưng lưu ý không có hook_menu_link_discovered (), các liên kết menu được tạo từ các tệp .yml như đã giải thích ở trên). Móc này cũng có thể được sử dụng để thêm các mục menu động mới.

Thường xuyên hơn, bạn có thể muốn sử dụng một lớp deriver để thêm các plugin liên kết menu mới. Ví dụ: Liên kết trình đơn được cung cấp được thêm vào lượt xem.links.menu.yml, trong đó chỉ định lớp deriver \ Drupal \ lượt xem \ Plugin \ Derivative \ ViewsMothyLink.

Cuối cùng, bạn có thể sử dụng trình quản lý plugin trực tiếp để thêm, cập nhật và xóa định nghĩa.

Bạn có thể có thể sử dụng hook_menu_links_discovered_alter cho kịch bản của mình.


Chỉnh sửa: Bạn muốn chỉnh sửa quyền truy cập vào liên kết đó, để nó tự động không hiển thị trong menu.

Đọc trên drupal.org: / node / 2311427

Drupal 8

Trong Drupal 8, bạn có thể hỗ trợ các quyền động bằng cách tham chiếu một chức năng sẽ tự động xác định các quyền đó. Cuộc gọi lại này xác định các quyền cho mô-đun bộ lọc của lõi.

// 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;
  }
}

Bạn cũng nên đọc bài viết này https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8 (cuộn xuống "Kiểm soát truy cập" và "Hook_Miab_Alter").

Tôi hi vọng cái này giúp được.


1
Đã thử hook_menu_links_discovered_alter này, nhưng điều này không hữu ích để ẩn menu. Vui lòng kiểm tra xem hook này chỉ hữu ích cho các định nghĩa liên kết được thay đổi.
Ajay Reddy

Đề cập đến bài viết trên, tôi đã thử nhưng điều đó sẽ chỉ cung cấp quyền truy cập bị từ chối, nó sẽ không ẩn menu.
Ajay Reddy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.