Qual é o equivalente a hook_translated_menu_link_alter () para alterar um link de menu? [duplicado]

8

Quero alterar o link do menu no Drupal 8. No Drupal 7, podemos conseguir isso usando 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;
    }
  }
}

No Drupal 7, estou ocultando / desativando o menu com base em algumas condições, como o ID do usuário.

Da mesma forma, quero alterar o link do menu no Drupal 8. Como posso alcançá-lo?

Ajay Reddy
fonte
Nesta página, se você rolar para terminar antes dos comentários, afirmou hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(), não sei se está certo ou errado, apenas encontrei isso. Pode ser que você possa entender. Se, me avise também.
código é o seguinte

Respostas:

0

HOOK_link_alter seria um D8 equivalente a 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.
  }
}

Consulte o URL da classe Drupal 8 para obter mais informações sobre a API.

No entanto, você pode usar Hook_preprocess_HOOK () como tal:

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

Basta verificar pathacima, mas mostra que você pode ocultar um único item de menu com base em determinados critérios.


Para as restrições de acesso, dependendo de suas necessidades, você pode considerar o roteamento e as permissões com base no entityitem de menu em vez do item e deixar o Drupal gerenciar a exibição do item de menu.

Para acesso ao menu por função, consulte este módulo: https://www.drupal.org/project/menu_item_role_access

Prestosaurus
fonte
hook_link_alter()não é considerado um substituto, hook_translated_menu_link_alter()uma vez que existem poucas chaves que podem ser alteradas e a chave de acesso não é uma delas.
kiamlaluno
-1

Do drupal.org em / node / 2122241:

Alterando links de menu e adicionando links de menu dinamicamente

Os itens de menu definidos estaticamente podem ser alterados usando hook_menu_links_discovered_alter () (mas observe que não há hook_menu_link_discovered (), os links do menu são criados a partir dos arquivos .yml, conforme explicado acima). Este gancho também pode ser usado para adicionar novos itens de menu dinâmico.

Com mais freqüência, convém usar uma classe deriver para adicionar novos plugins de link de menu. Por exemplo, os links de menu fornecidos pelo Views são adicionados ao views.links.menu.yml, que especifica a classe deriver \ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink.

Por fim, você pode usar o gerenciador de plugins diretamente para adicionar, atualizar e remover definições.

Você provavelmente poderia usar hook_menu_links_discovered_alter para o seu cenário.


Editar: você deseja editar a permissão para acessar esse link, para que ele não apareça automaticamente no menu.

Leia em drupal.org: / node / 2311427

Drupal 8

No Drupal 8, você pode oferecer suporte a permissões dinâmicas fazendo referência a uma função que definirá dinamicamente essas permissões. Esse retorno de chamada define as permissões para o módulo de filtro do núcleo.

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

Você também deve ler este artigo https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8 (role para baixo até "Controle de acesso" e "Hook_Menu_Alter").

Eu espero que isso ajude.

JohnnyThan
fonte
11
Tentei este hook_menu_links_discovered_alter, mas isso não é útil para ocultar o menu. Por favor, verifique se este gancho é útil apenas para que as definições de link sejam alteradas.
Ajay Reddy
Referindo-me ao artigo acima, tentei isso, mas isso só dará acesso negado, não ocultará o menu.
Ajay Reddy