¿Cuál es el equivalente de hook_translated_menu_link_alter () para alterar un enlace de menú? [duplicar]


8

Quiero alterar el enlace del menú en Drupal 8. En Drupal 7 podemos lograr esto 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;
    }
  }
}

En Drupal 7, estoy ocultando / deshabilitando el menú en función de algunas condiciones, como la ID de usuario.

Del mismo modo, quiero alterar el enlace del menú en Drupal 8. ¿Cómo puedo lograrlo?


En esta página, si se desplaza hasta el final antes de los comentarios, se ha dicho hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(), no sé si es correcto o incorrecto, acabo de encontrar esto. Puede ser que puedas besarte. Si, házmelo saber también.
CodeNext

Respuestas:


0

HOOK_link_alter sería un equivalente D8 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 la URL de la clase Drupal 8 para obtener más información sobre la API.

Sin embargo, puede 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]);
      }
    }
  }
}

Solo verificando patharriba, pero muestra que puede ocultar un solo elemento del menú según ciertos criterios.


Para las restricciones de acceso, dependiendo de sus necesidades, puede mirar el enrutamiento y los permisos basados ​​en el entityelemento del menú en lugar del elemento y dejar que Drupal maneje la visualización del elemento del menú.

Para acceder al menú por rol, consulte este módulo: https://www.drupal.org/project/menu_item_role_access


hook_link_alter()no se considera un reemplazo hook_translated_menu_link_alter()ya que solo hay unas pocas claves que pueden modificarse, y la clave de acceso no es una de ellas.
kiamlaluno

-1

Desde drupal.org en / node / 2122241:

Alterar enlaces de menú y agregar enlaces de menú dinámicamente

Los elementos de menú definidos estáticamente pueden modificarse usando hook_menu_links_discovered_alter () (pero tenga en cuenta que no hay hook_menu_link_discovered (), los enlaces de menú se crean a partir de los archivos .yml como se explicó anteriormente). Este gancho también se puede usar para agregar nuevos elementos de menú dinámico.

Con mayor frecuencia, es posible que desee utilizar una clase derivadora para agregar nuevos complementos de enlace de menú. Por ejemplo, los enlaces de menú proporcionados por Vistas se agregan en views.links.menu.yml, que especifica la clase de derivador \ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink.

Finalmente, puede usar el administrador de complementos directamente para agregar, actualizar y eliminar definiciones.

Probablemente podría usar hook_menu_links_discovered_alter para su escenario.


Editar: desea editar el permiso para acceder a ese enlace, por lo que automáticamente no aparece en el menú.

Lea en drupal.org: / node / 2311427

Drupal 8

En Drupal 8, puede admitir permisos dinámicos haciendo referencia a una función que definirá dinámicamente esos permisos. Esta devolución de llamada define los permisos para el módulo de filtro del 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;
  }
}

También debe leer este artículo https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8 (desplácese hacia abajo hasta "Control de acceso" y "Hook_Menu_Alter").

Espero que esto ayude.


1
Probé este hook_menu_links_discovered_alter, pero esto no es útil para ocultar el menú. Compruebe amablemente que este enlace
Ajay Reddy

Refiriéndome al artículo anterior, lo intenté pero eso solo dará acceso denegado, no ocultará el menú.
Ajay Reddy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.