hook_menu_alter () เพื่อเปลี่ยนประเภทรายการเมนูคืออะไร


10

ฉันต้องการเปลี่ยนประเภทเมนูใน Drupal 8 ใน Drupal 7 เราสามารถทำได้โดยใช้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,
  );
}

ฉันต้องการเปลี่ยนประเภทเมนูใน Drupal 8 ฉันจะทำอย่างไร ขอบคุณ.


3
อ่านมันdrupal.org/node/2118147
Adi

ดังกล่าวโดย Berdir ไม่มีประเภทเมนูอีกต่อไป คุณสามารถระบุสิ่งที่คุณพยายามจะเก็บถาวรได้หรือไม่?
ไลนัส

คำตอบ:


7

ในขณะที่คำตอบจาก Linus นั้นยอดเยี่ยม แต่ก็ไม่ได้ให้ข้อเสนอแนะสำหรับคำถามเฉพาะของคุณ:

ฉันต้องการเปลี่ยนประเภทเมนูใน Drupal 8

ไม่มีสิ่งใดเป็นประเภทเมนูใน Drupal 8 ทุกอย่างที่เคยเป็นประเภทตอนนี้เป็นสิ่งที่แตกต่างอย่างสิ้นเชิง เส้นทาง, ลิงค์เมนู, งานในพื้นที่, การกระทำในท้องถิ่น และบ่อยครั้งที่คุณมีหลายสิ่ง คุณมีเส้นทางเสมอ (7.x เคยโทรกลับประเภทนี้) นอกจากนี้คุณยังเพิ่มลิงค์เมนูงานท้องถิ่นหรือการกระทำสำหรับเส้นทางนั้น

ดังนั้นคุณไม่สามารถแปลงลิงค์เมนูไปเป็นงานในท้องถิ่นได้หรือแม้แต่เส้นทางไปยังงานท้องถิ่น สิ่งเดียวที่คุณทำได้คือเปลี่ยนลิงค์ของเมนู (ซึ่งไม่เกี่ยวข้องกับการเปลี่ยนเส้นทางที่กล่าวถึงข้างต้น) และสร้างงานในท้องถิ่นใหม่แทน

ดูคำตอบของ Linus สำหรับลิงก์และข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำสิ่งเหล่านั้น


คุณพูดถูกฉันลืมพูดไปหมดแล้ว ขอบคุณสำหรับการเพิ่ม
ไลนัส

19

Drupal 8 มีระบบเมนูใหม่ไม่มีhook_menuและไม่มีhook_menu_alterอีกต่อไป

หากคุณต้องการเปลี่ยนเส้นทางที่มีอยู่มันซับซ้อนกว่าเล็กน้อยเมื่อเทียบกับ Drupal 7

ในโมดูลของคุณคุณต้องสร้างไฟล์คลาสที่YOURMODULE/src/Routing/CLASSNAME.phpขยาย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...
  }
}

คุณสามารถใช้คลาสRouteSubsciberของโมดูลโหนดเป็นตัวอย่าง

ในการให้รูทสมาชิกของคุณเป็นที่รู้จักคุณต้องสร้างYOURMODULE.services.ymlไฟล์ในรูทของไดเรกทอรีโมดูลของคุณ:

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

เพื่อให้เข้าใจถึงระบบเมนูใหม่ได้ดีขึ้นฉันอยากจะแนะนำบทความต่อไปนี้:

แก้ไข: ในฐานะที่เป็นที่กล่าวถึงโดย Berdirระบบเมนูมีโครงสร้างที่แตกต่างกันในขณะนี้ซึ่งมีอะไรจะทำอย่างไรกับระบบเมนู D7 จึงไม่มีสิ่งเช่นประเภทเมนูอีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.