Apa yang setara dengan hook_menu_alter () untuk mengubah jenis item menu?

10

Saya ingin mengubah jenis menu dalam Drupal 8. Dalam Drupal 7 kita dapat mencapai ini menggunakan 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,
  );
}

Demikian pula saya ingin mengubah jenis menu di Drupal 8. Bagaimana saya bisa melakukannya. Terima kasih.

Vamsi
sumber
Seperti yang disebutkan oleh Berdir, tidak ada lagi jenis menu. Bisakah Anda menentukan apa yang ingin Anda arsipkan?
Linus

Jawaban:

7

Meskipun jawaban dari Linus bagus, itu tidak memberikan umpan balik pada pertanyaan spesifik Anda:

Demikian pula saya ingin mengubah jenis menu di Drupal 8

Tidak ada yang namanya jenis menu di Drupal 8. Semua yang dulunya tipe sekarang menjadi hal yang sama sekali berbeda. Rute, Tautan Menu, Tugas Lokal, Tindakan Lokal. Dan seringkali, Anda memiliki banyak hal. Anda selalu memiliki rute (7.x digunakan untuk memanggil tipe panggilan balik ini). Dan tambahan, Anda menambahkan tautan menu, tugas atau tindakan lokal untuk rute itu.

Jadi, Anda tidak dapat mengonversi tautan menu ke tugas lokal misalnya, atau bahkan rute ke tugas lokal. Satu-satunya hal yang dapat Anda lakukan adalah mengubah tautan menu (yang tidak ada hubungannya dengan rute yang disebutkan di atas) dan membuat tugas lokal baru sebagai gantinya.

Lihat jawaban Linus untuk tautan dan informasi lebih lanjut tentang cara melakukan masing-masing hal itu.

Berdir
sumber
Anda benar, saya benar-benar lupa menyebutkan itu. Terima kasih untuk tambahannya.
Linus
19

Drupal 8 memiliki sistem menu baru, tidak ada hook_menudan tidak ada hook_menu_alterlagi.

Jika Anda ingin mengubah rute yang ada, ini sedikit lebih rumit dibandingkan dengan Drupal 7.

Dalam modul Anda, Anda harus membuat file kelas pada saat YOURMODULE/src/Routing/CLASSNAME.phpitu meluas 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...
  }
}

Anda bisa mengambil kelas RouteSubsciber dari modul simpul sebagai contoh.

Agar RouteSubscriber Anda dikenali, Anda juga harus membuat YOURMODULE.services.ymlfile di root direktori modul Anda:

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

Untuk mendapatkan wawasan yang lebih baik tentang sistem menu baru, saya akan merekomendasikan artikel berikut:

Sunting: Seperti disebutkan oleh Berdir , sistem menu memiliki struktur yang berbeda sekarang, yang tidak ada hubungannya dengan sistem menu D7, sehingga tidak ada lagi yang namanya jenis menu.

Linus
sumber