Quel est l'équivalent de hook_menu_alter () pour changer un type d'élément de menu?

10

Je veux changer le type de menu dans Drupal 8. Dans Drupal 7, nous pouvons y arriver en utilisant 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,
  );
}

De même, je veux changer le type de menu dans Drupal 8. Comment puis-je le faire. Merci.

Vamsi
la source
3
lisez-le drupal.org/node/2118147
Adi
Comme mentionné par Berdir, il n'y a plus de type de menu. Pouvez-vous peut-être spécifier ce que vous essayez d'archiver?
Linus

Réponses:

7

Bien que la réponse de Linus soit excellente, elle ne fournit pas de commentaires sur votre question spécifique:

De même, je veux changer le type de menu dans Drupal 8

Il n'y a pas de type de menu dans Drupal 8. Tout ce qui était un type est maintenant complètement différent. Itinéraires, liens de menu, tâches locales, actions locales. Et souvent, vous avez plusieurs choses. Vous avez toujours un itinéraire (7.x utilisé pour appeler ce type de rappel). De plus, vous ajoutez des liens de menu, des tâches ou des actions locales pour cet itinéraire.

Ainsi, vous ne pouvez pas convertir un lien de menu en tâche locale par exemple, ni même un itinéraire vers une tâche locale. La seule chose que vous pouvez faire est par exemple de modifier un lien de menu (ce qui n'a rien à voir avec le changement d'itinéraire mentionné ci-dessus) et de créer une nouvelle tâche locale à la place.

Voir la réponse de Linus pour les liens et plus d'informations sur la façon de faire chacune de ces choses.

Berdir
la source
Vous avez raison, j'ai totalement oublié de le mentionner. Merci pour l'ajout.
Linus
19

Drupal 8 a un nouveau système de menus, il n'y en a plus hook_menuet il n'y en a hook_menu_alterplus.

Si vous souhaitez modifier un itinéraire existant, c'est un peu plus compliqué par rapport à Drupal 7.

Dans votre module, vous devez créer un fichier de classe YOURMODULE/src/Routing/CLASSNAME.phpqui s'étend 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...
  }
}

Vous pouvez prendre la classe RouteSubsciber du module de noeud comme exemple.

Pour que votre RouteSubscriber soit reconnu, vous devez également créer un YOURMODULE.services.ymlfichier à la racine du répertoire de vos modules:

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

Pour mieux comprendre le nouveau système de menus, je recommanderais les articles suivants:

Edit: Comme mentionné par Berdir , le système de menu a maintenant une structure différente, qui n'a rien à voir avec le système de menu de D7, donc il n'y a plus de type de menu.

Linus
la source