Was entspricht hook_menu_alter (), um einen Menüelementtyp zu ändern?

10

Ich möchte den Menütyp in Drupal 8 ändern. In Drupal 7 können wir dies mit hook_menu_alter erreichen

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

Ebenso möchte ich den Menütyp in Drupal 8 ändern. Wie kann ich das machen? Danke.

Vamsi
quelle
3
Lesen Sie es drupal.org/node/2118147
Adi
Wie von Berdir erwähnt, gibt es keinen Menütyp mehr. Können Sie vielleicht angeben, was Sie archivieren möchten?
Linus

Antworten:

7

Die Antwort von Linus ist zwar großartig, gibt aber kein Feedback zu Ihrer spezifischen Frage:

Ebenso möchte ich den Menütyp in Drupal 8 ändern

In Drupal 8 gibt es keinen Menütyp. Alles, was früher ein Typ war, ist jetzt etwas ganz anderes. Routen, Menüverknüpfungen, lokale Aufgaben, lokale Aktionen. Und oft haben Sie mehrere Dinge. Sie haben immer eine Route (7.x wird verwendet, um diesen Rückruftyp aufzurufen). Außerdem fügen Sie Menüverknüpfungen, lokale Aufgaben oder Aktionen für diese Route hinzu.

Sie können also beispielsweise keinen Menülink in eine lokale Aufgabe oder sogar eine Route zu einer lokalen Aufgabe konvertieren. Das einzige, was Sie tun können, ist z. B. einen Menü-Link zu ändern (was nichts mit der oben erwähnten Routenänderung zu tun hat) und stattdessen eine neue lokale Aufgabe zu erstellen.

In der Antwort von Linus finden Sie Links und weitere Informationen dazu, wie Sie diese Dinge tun können.

Berdir
quelle
Du hast recht, das habe ich total vergessen zu erwähnen. Danke für den Zusatz.
Linus
17

Drupal 8 hat ein neues Menüsystem, es gibt kein hook_menuund kein hook_menu_altermehr.

Wenn Sie eine vorhandene Route ändern möchten, ist diese im Vergleich zu Drupal 7 etwas komplizierter.

In Ihrem Modul müssen Sie eine Klassendatei erstellen YOURMODULE/src/Routing/CLASSNAME.php, die Folgendes erweitert 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...
  }
}

Sie können die RouteSubsciber- Klasse des Knotenmoduls als Beispiel nehmen.

Damit Ihr RouteSubscriber erkannt wird, müssen Sie auch eine YOURMODULE.services.ymlDatei im Stammverzeichnis Ihres Modulverzeichnisses erstellen :

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

Um einen besseren Einblick in das neue Menüsystem zu erhalten, würde ich die folgenden Artikel empfehlen:

Bearbeiten: Wie von Berdir erwähnt , hat das Menüsystem jetzt eine andere Struktur, die nichts mit dem Menüsystem von D7 zu tun hat, so dass es keinen Menütyp mehr gibt.

Linus
quelle