Quel est l'équivalent de hook_translated_menu_link_alter () pour modifier un lien de menu? [dupliquer]


8

Je veux modifier le lien du menu dans Drupal 8. Dans Drupal 7, nous pouvons y parvenir en utilisant 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;
    }
  }
}

Dans Drupal 7, je masque / désactive le menu en fonction de certaines conditions comme l'ID utilisateur.

De même, je souhaite modifier le lien du menu dans Drupal 8. Comment puis-je y parvenir?


Sur cette page, si vous faites défiler pour terminer avant les commentaires, il a été dit hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(): je ne sais pas si c'est bien ou mal, je viens de le trouver. Peut-être que vous pouvez distinguer. Si, faites-le moi savoir également.
CodeNext

Réponses:


0

HOOK_link_alter serait un D8 équivalent à 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.
  }
}

Voir l' URL de la classe Drupal 8 pour plus d'informations sur l'API.

Cependant, vous pouvez utiliser Hook_preprocess_HOOK () en tant que tel:

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

Je vérifie juste pathci-dessus, mais cela montre que vous pouvez masquer un seul élément de menu en fonction de certains critères.


Pour les restrictions d'accès, selon vos besoins, vous pouvez examiner le routage et les autorisations en fonction entityde l'élément au lieu de l'élément de menu et laisser Drupal gérer l'affichage de l'élément de menu.

Pour accéder au menu par rôle, regardez ce module: https://www.drupal.org/project/menu_item_role_access


hook_link_alter()n'est pas considéré comme un remplacement hook_translated_menu_link_alter()car il n'y a que peu de clés qui peuvent être modifiées, et la clé d' accès n'en fait pas partie.
kiamlaluno

-1

Depuis drupal.org sur / node / 2122241:

Modification des liens de menu et ajout dynamique de liens de menu

Les éléments de menu définis statiquement peuvent être modifiés à l'aide de hook_menu_links_discovered_alter () (mais notez qu'il n'y a pas de hook_menu_link_discovered (), les liens de menu sont créés à partir des fichiers .yml comme expliqué ci-dessus). Ce crochet peut également être utilisé pour ajouter de nouveaux éléments de menu dynamique.

Plus souvent, vous souhaiterez peut-être utiliser une classe dérivée pour ajouter de nouveaux plugins de lien de menu. Par exemple, les liens de menu Vues fournies sont ajoutés dans views.links.menu.yml, qui spécifie la classe dérivée \ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink.

Enfin, vous pouvez utiliser le gestionnaire de plug-ins directement pour ajouter, mettre à jour et supprimer des définitions.

Vous pourriez probablement utiliser hook_menu_links_discovered_alter pour votre scénario.


Modifier: vous souhaitez modifier l'autorisation d'accéder à ce lien, afin qu'il n'apparaisse pas automatiquement dans le menu.

Lire sur drupal.org: / node / 2311427

Drupal 8

Dans Drupal 8, vous pouvez prendre en charge les autorisations dynamiques en référençant une fonction qui définira dynamiquement ces autorisations. Ce rappel définit les autorisations pour le module de filtrage du noyau.

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

Vous devriez également lire cet article https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8 (faites défiler jusqu'à "Access Control" et "Hook_Menu_Alter").

J'espère que ça aide.


1
J'ai essayé ce hook_menu_links_discovered_alter, mais cela n'est pas utile pour masquer le menu. Veuillez vérifier que ce crochet n'est utile que pour les définitions de lien à modifier.
Ajay Reddy

En référence à l'article ci-dessus, j'ai essayé cela, mais cela ne donnera qu'un accès refusé, il ne cachera pas le menu.
Ajay Reddy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.