Jaki jest odpowiednik hook_menu_alter (), aby zmienić typ pozycji menu?

10

Chcę zmienić typ menu w Drupal 8. W Drupal 7 możemy to osiągnąć za pomocą 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,
  );
}

Podobnie chcę zmienić typ menu w Drupal 8. Jak to zrobić. Dziękuję Ci.

Vamsi
źródło
3
przeczytaj to drupal.org/node/2118147
Adi
Jak wspomniał Berdir, nie ma już żadnego typu menu. Czy możesz określić, co próbujesz zarchiwizować?
Linus

Odpowiedzi:

7

Chociaż odpowiedź Linusa jest świetna, nie zapewnia informacji zwrotnych na temat konkretnego pytania:

Podobnie chcę zmienić typ menu w Drupal 8

W Drupal 8 nie ma czegoś takiego jak typ menu. Wszystko, co kiedyś było typem, jest teraz zupełnie inną rzeczą. Trasy, łącza menu, zadania lokalne, działania lokalne. I często masz wiele rzeczy. Zawsze masz trasę (7.x używane do wywołania zwrotnego tego typu). Ponadto dodajesz łącza menu, lokalne zadania lub działania dla tej trasy.

Tak więc nie można przekonwertować łącza menu na przykład na zadanie lokalne, ani nawet trasy do zadania lokalnego. Jedyne, co możesz zrobić, to np. Zmienić odsyłacz menu (który nie ma nic wspólnego z wyżej wymienioną zmianą trasy) i zamiast tego utworzyć nowe zadanie lokalne.

Zobacz odpowiedź Linusa, aby uzyskać linki i więcej informacji na temat wykonywania tych czynności.

Berdir
źródło
Masz rację, całkowicie zapomniałem o tym wspomnieć. Dzięki za dodanie.
Linus
19

Drupal 8 ma nowy system menu, nie ma go już hook_menui nie hook_menu_alterma.

Jeśli chcesz zmienić istniejącą trasę, jest to nieco bardziej skomplikowane w porównaniu do Drupala 7.

W swoim module musisz utworzyć plik klasy, YOURMODULE/src/Routing/CLASSNAME.phpktóry rozszerza 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...
  }
}

Przykładem może być klasa RouteSubsciber modułu węzła.

Aby umożliwić rozpoznanie Twojego subskrybenta trasy, musisz również utworzyć YOURMODULE.services.ymlplik w katalogu głównym katalogu modułów:

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

Aby uzyskać lepszy wgląd w nowy system menu, polecam następujące artykuły:

Edycja: Jak wspomniał Berdir , system menu ma teraz inną strukturę, która nie ma nic wspólnego z systemem menu D7, więc nie ma już czegoś takiego jak typ menu.

Linus
źródło