Что эквивалентно 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 я скрываю / отключаю меню, основываясь на некоторых условиях, таких как идентификатор пользователя.

Точно так же я хочу изменить ссылку меню в Drupal 8. Как мне этого добиться?

Аджай Редди
источник
На этой странице, если вы прокрутите до конца, прежде чем комментарии, он заявил hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(), я не знаю, правильно это или неправильно, я просто нашел это. Может быть, вы можете разобрать. Если, дайте мне также знать.
CodeNext
Может быть полезно: drupal.stackexchange.com/questions/204582/…
Prestosaurus

Ответы:

0

HOOK_link_alter будет одним эквивалентом D8 для 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.
  }
}

См. URL класса Drupal 8 для получения дополнительной информации об API.

Тем не менее, вы можете использовать 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

Prestosaurus
источник
hook_link_alter()не рассматривается как замена, hook_translated_menu_link_alter()так как есть только несколько ключей, которые могут быть изменены, и ключ доступа не является одним из них.
kiamlaluno
-1

С drupal.org в / node / 2122241:

Изменение ссылок меню и добавление ссылок меню динамически

Статически определенные пункты меню могут быть изменены с помощью hook_menu_links_discovered_alter () (но обратите внимание, что нет hook_menu_link_discovered (), ссылки меню создаются из файлов .yml, как описано выше). Этот хук также можно использовать для добавления новых пунктов динамического меню.

Чаще вы можете захотеть использовать производный класс для добавления новых плагинов ссылок меню. Например, представленные в представлении ссылки на меню добавляются в views.links.menu.yml, который указывает производный класс \ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink.

Наконец, вы можете напрямую использовать менеджер плагинов для добавления, обновления и удаления определений.

Возможно, вы могли бы использовать hook_menu_links_discovered_alter для вашего сценария.


Изменить: Вы хотите изменить разрешение на доступ к этой ссылке, чтобы она автоматически не отображалась в меню.

Читайте на drupal.org: / узел / 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»).

Надеюсь, это поможет.

JohnnyThan
источник
1
Пробовал этот hook_menu_links_discovered_alter, но это не полезно, чтобы скрыть меню. Пожалуйста, убедитесь, что этот хук полезен только для определения ссылок, которые будут изменены.
Аджай Редди
Ссылаясь на вышеупомянутую статью, я пробовал это, но это даст только доступ запрещен, он не будет скрывать меню.
Аджай Редди