Tương đương với hook_menu_alter () để thay đổi loại mục menu là gì?


10

Tôi muốn thay đổi loại menu trong Drupal 8. Trong Drupal 7, chúng ta có thể đạt được điều này bằng cách sử dụng 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,
  );
}

Tương tự tôi muốn thay đổi loại menu trong Drupal 8. Làm thế nào tôi có thể làm điều đó. Cảm ơn bạn.



Như Berdir đã đề cập, không có loại menu nào nữa. Bạn có thể chỉ định những gì bạn đang cố gắng để lưu trữ?
Linus

Câu trả lời:


7

Mặc dù câu trả lời từ Linus rất hay, nhưng nó không cung cấp phản hồi về câu hỏi cụ thể của bạn:

Tương tự, tôi muốn thay đổi loại menu trong Drupal 8

Không có thứ gọi là loại menu trong Drupal 8. Mọi thứ từng là một loại bây giờ là một thứ hoàn toàn khác. Các tuyến đường, Liên kết menu, Nhiệm vụ cục bộ, Hành động cục bộ. Và thường, bạn có nhiều thứ. Bạn luôn có một tuyến đường (7.x được sử dụng để gọi loại gọi lại này). Ngoài ra, bạn thêm các liên kết menu, tác vụ hoặc hành động cục bộ cho tuyến đường đó.

Vì vậy, bạn không thể chuyển đổi một liên kết menu thành một nhiệm vụ cục bộ, hoặc thậm chí một tuyến đường đến một nhiệm vụ địa phương. Điều duy nhất bạn có thể làm là ví dụ thay đổi một liên kết menu đi (không liên quan gì đến thay đổi tuyến đường được đề cập ở trên) và tạo một tác vụ cục bộ mới thay thế.

Xem câu trả lời của Linus để biết các liên kết và biết thêm thông tin về cách thực hiện từng điều đó.


Bạn nói đúng, tôi hoàn toàn quên đề cập đến điều đó. Cảm ơn đã bổ sung.
Linus

17

Drupal 8 có một hệ thống menu mới, không còn hook_menuvà không hook_menu_altercòn nữa.

Nếu bạn muốn thay đổi một tuyến đường hiện tại, nó phức tạp hơn một chút so với Drupal 7.

Trong mô-đun của bạn, bạn phải tạo một tệp lớp tại YOURMODULE/src/Routing/CLASSNAME.phpđó mở rộng 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...
  }
}

Bạn có thể lấy lớp RouteSubsciber của mô-đun nút làm ví dụ.

Để cho nhận dạng RouteSubscacker của bạn, bạn cũng phải tạo một YOURMODULE.services.ymltệp trong thư mục gốc của mô-đun:

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

Để hiểu rõ hơn về hệ thống menu mới, tôi muốn giới thiệu các bài viết sau:

Chỉnh sửa: Như Berdir đã đề cập , hệ thống menu hiện có cấu trúc khác, không liên quan gì đến hệ thống menu của D7, do đó không còn loại menu nào nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.