Was entspricht hook_translated_menu_link_alter (), um einen Menülink zu ändern? [Duplikat]


8

Ich möchte den Menü-Link in Drupal 8 ändern. In Drupal 7 können wir dies mit erreichen 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;
    }
  }
}

In Drupal 7 verstecke / deaktiviere ich das Menü basierend auf einigen Bedingungen wie der Benutzer-ID.

Ebenso möchte ich den Menülink in Drupal 8 ändern. Wie kann ich das erreichen?


Auf dieser Seite, wenn Sie vor Kommentaren zum Ende scrollen, heißt es hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(), ich weiß nicht, ob es richtig oder falsch ist, ich habe dies gerade gefunden. Könnte sein, dass Sie erkennen können. Wenn ja, lass es mich auch wissen.
CodeNext

Antworten:


0

HOOK_link_alter wäre ein D8-Äquivalent zu 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.
  }
}

Weitere API-Informationen finden Sie unter Drupal 8- Klassen-URL .

Sie können jedoch Hook_preprocess_HOOK () als solches verwenden:

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

Nur pathoben überprüfen , aber es zeigt, dass Sie einen einzelnen Menüpunkt basierend auf bestimmten Kriterien ausblenden können.


Abhängig von Ihren Anforderungen können Sie für die Zugriffsbeschränkungen das Routing und die Berechtigungen basierend auf dem entityMenüelement anstelle des Menüelements überprüfen und Drupal die Anzeige des Menüelements überlassen.

Informationen zum Menüzugriff nach Rollen finden Sie in diesem Modul: https://www.drupal.org/project/menu_item_role_access


hook_link_alter()wird nicht als Ersatz angesehen, hook_translated_menu_link_alter()da nur wenige Schlüssel geändert werden können und der Zugriffsschlüssel keiner davon ist.
kiamlaluno

-1

Von drupal.org unter / node / 2122241:

Menüverknüpfungen ändern und Menüverknüpfungen dynamisch hinzufügen

Statisch definierte Menüelemente können mit hook_menu_links_discovered_alter () geändert werden (beachten Sie jedoch, dass kein hook_menu_link_discovered () vorhanden ist. Die Menüverknüpfungen werden wie oben erläutert aus den .yml-Dateien erstellt). Dieser Hook kann auch zum Hinzufügen neuer dynamischer Menüelemente verwendet werden.

In den meisten Fällen möchten Sie möglicherweise eine Ableitungsklasse verwenden, um neue Menü-Link-Plugins hinzuzufügen. Beispielsweise werden in views.links.menu.yml bereitgestellte Menülinks für Ansichten hinzugefügt, die die Ableitungsklasse \ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink angeben.

Schließlich können Sie den Plugin-Manager direkt zum Hinzufügen, Aktualisieren und Entfernen von Definitionen verwenden.

Sie könnten wahrscheinlich hook_menu_links_discovered_alter für Ihr Szenario verwenden.


Bearbeiten: Sie möchten die Berechtigung zum Zugriff auf diesen Link bearbeiten, damit er nicht automatisch im Menü angezeigt wird.

Lesen Sie weiter auf drupal.org: / node / 2311427

Drupal 8

In Drupal 8 können Sie dynamische Berechtigungen unterstützen, indem Sie auf eine Funktion verweisen, die diese Berechtigungen dynamisch definiert. Dieser Rückruf definiert die Berechtigungen für das Filtermodul des Kerns.

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

Sie sollten auch diesen Artikel https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8 lesen (scrollen Sie nach unten zu "Access Control" und "Hook_Menu_Alter").

Ich hoffe das hilft.


1
Versuchte dieses hook_menu_links_discovered_alter, aber dies ist nicht nützlich, um das Menü auszublenden. Bitte überprüfen Sie, ob dieser Hook nur für die
Ajay Reddy

In Bezug auf den obigen Artikel habe ich das versucht, aber das wird nur den Zugriff verweigern, es wird das Menü nicht verbergen.
Ajay Reddy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.