¿Cuál es el equivalente de hook_menu_alter () para cambiar un tipo de elemento de menú?


10

Quiero cambiar el tipo de menú en Drupal 8. En Drupal 7 podemos lograr esto usando hook_menu_alter

function module_menu_alter(&$items) {
  $items['admin/config/people/ip-blocking/default'] = array(
    'title' => 'Block IP Address',
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );
}

Del mismo modo, quiero cambiar el tipo de menú en Drupal 8. ¿Cómo puedo hacerlo? Gracias.



Como mencionó Berdir, ya no hay ningún tipo de menú. ¿Puede especificar lo que está tratando de archivar?
Linus

Respuestas:


7

Si bien la respuesta de Linus es excelente, no proporciona comentarios sobre su pregunta específica:

Del mismo modo, quiero cambiar el tipo de menú en Drupal 8

No existe un tipo de menú en Drupal 8. Todo lo que solía ser un tipo ahora es algo completamente diferente. Rutas, enlaces de menú, tareas locales, acciones locales. Y a menudo, tienes múltiples cosas. Siempre tiene una ruta (7.x se utiliza para llamar a este tipo de devolución de llamada). Y además, agrega enlaces de menú, tareas locales o acciones para esa ruta.

Por lo tanto, no puede convertir un enlace de menú a una tarea local, por ejemplo, o incluso una ruta a una tarea local. Lo único que puede hacer es, por ejemplo, alterar un enlace del menú (que no tiene nada que ver con la ruta alterada mencionada anteriormente) y crear una nueva tarea local.

Vea la respuesta de Linus para obtener enlaces y más información sobre cómo hacer cada una de esas cosas.


Tienes razón, olvidé por completo mencionar eso. Gracias por la adición.
Linus

19

Drupal 8 tiene un nuevo sistema de menús, ya no hook_menuhay ninguno hook_menu_alter.

Si desea modificar una ruta existente, es un poco más complicado en comparación con Drupal 7.

En su módulo, debe crear un archivo de clase YOURMODULE/src/Routing/CLASSNAME.phpque se extienda RouteSubscriberBase:

/**
 * @file
 * Contains \Drupal\YOURMODULE\Routing\RouteSubscriber.
 */

namespace Drupal\YOURMODULE\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    // Get the route you want to alter
    $route = $collection->get('system.admin_content');

    // alter the route...
  }
}

Puede tomar la clase RouteSubsciber del módulo de nodo como ejemplo.

Para permitir que se reconozca su RouteSubscriber, también debe crear un YOURMODULE.services.ymlarchivo en la raíz de su directorio de módulos:

services:
  node.route_subscriber:
    class: Drupal\YOURMODULE\Routing\RouteSubscriber
    tags:
      - { name: event_subscriber }

Para obtener una mejor visión del nuevo sistema de menús, recomendaría los siguientes artículos:

Editar: como mencionó Berdir , el sistema de menús tiene una estructura diferente ahora, que no tiene nada que ver con el sistema de menús de D7, por lo que ya no existe un tipo de menú.

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.