Qual è l'equivalente di hook_translated_menu_link_alter () per modificare un collegamento al menu? [duplicare]


8

Voglio modificare il collegamento al menu in Drupal 8. In Drupal 7 possiamo farlo 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;
    }
  }
}

In Drupal 7 nascondo / disabilito il menu in base ad alcune condizioni come l'ID utente.

Allo stesso modo, voglio modificare il collegamento al menu in Drupal 8. Come posso ottenerlo?


In questa pagina se scorri fino alla fine prima dei commenti, ha dichiarato hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(), non so se sia giusto o sbagliato, ho appena trovato questo. Potrebbe essere che tu possa distinguere. Se, fammi sapere anche.
CodeNext

Risposte:


0

HOOK_link_alter sarebbe un 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.
  }
}

Vedi Drupal 8 classe URL per maggiori informazioni sull'API.

Tuttavia, è possibile utilizzare Hook_preprocess_HOOK () come tale:

/**
 * 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 controllare pathsopra, ma mostra che puoi nascondere una singola voce di menu in base a determinati criteri.


Per le restrizioni di accesso, a seconda delle tue esigenze, potresti guardare il routing e le autorizzazioni in base entityalla voce di menu anziché alla voce di menu e lasciare che Drupal gestisca la visualizzazione della voce di menu.

Per l'accesso al menu per ruolo, guarda questo modulo: https://www.drupal.org/project/menu_item_role_access


hook_link_alter()non è pensato come una sostituzione hook_translated_menu_link_alter()poiché ci sono solo poche chiavi che possono essere modificate e la chiave di accesso non è una di quelle.
kiamlaluno

-1

Da drupal.org su / node / 2122241:

Modifica dei collegamenti ai menu e aggiunta dinamica dei collegamenti ai menu

Le voci di menu definite staticamente possono essere modificate utilizzando hook_menu_links_discovered_alter () (ma si noti che non è presente hook_menu_link_discovered (), i collegamenti ai menu vengono creati dai file .yml come spiegato sopra). Questo hook può essere utilizzato anche per aggiungere nuove voci di menu dinamiche.

Più spesso, potresti voler utilizzare una classe deriver per aggiungere nuovi plug-in di link al menu. Ad esempio, i collegamenti al menu Viste forniti vengono aggiunti in views.links.menu.yml, che specifica la classe deriver \ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink.

Infine, puoi utilizzare direttamente il gestore plug-in per aggiungere, aggiornare e rimuovere definizioni.

Probabilmente potresti usare hook_menu_links_discovered_alter per il tuo scenario.


Modifica: si desidera modificare l'autorizzazione per accedere a quel collegamento, quindi non viene visualizzato automaticamente nel menu.

Leggi su drupal.org: / node / 2311427

Drupal 8

In Drupal 8, puoi supportare le autorizzazioni dinamiche facendo riferimento a una funzione che definirà tali autorizzazioni in modo dinamico. Questo callback definisce le autorizzazioni per il modulo filtro del core.

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

Dovresti anche leggere questo articolo https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8 (scorrere fino a "Controllo accessi" e "Hook_Menu_Alter").

Spero che questo possa essere d'aiuto.


1
Ho provato questo hook_menu_links_discovered_alter, ma questo non è utile per nascondere il menu. Si prega di verificare che questo hook sia utile solo per modificare le definizioni dei collegamenti.
Ajay Reddy,

Facendo riferimento all'articolo sopra, l'ho provato, ma ciò darà solo accesso negato, non nasconderà il menu.
Ajay Reddy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.