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中更改菜单类型。我该如何做。谢谢。



如Berdir所述,不再有菜单类型。您可以指定要存档的内容吗?
莱纳斯(Linus)2016年

Answers:


7

虽然Linus的答案很好,但是它不能提供有关您特定问题的反馈:

同样,我想在Drupal 8中更改菜单类型

Drupal 8中没有菜单类型之类的东西。以前曾经是类型的所有东西现在已经完全不同了。路线,菜单链接,本地任务,本地操作。通常,您有很多事情。您总是有一条路由(用于调用此类型回调的7.x)。此外,您可以为该路线添加菜单链接,本地任务或操作。

因此,例如,您无法将菜单链接转换为本地任务,甚至无法将路由转换为本地任务。您唯一可以做的就是例如更改一个菜单链接(与上述路由更改无关),而是创建一个新的本地任务。

请参阅Linus的答案以获取链接以及有关如何执行所有这些操作的更多信息。


您是对的,我完全忘记了这一点。感谢您的添加。
莱纳斯(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类为例。

为了让您的RouteSubscriber被识别,您还必须YOURMODULE.services.yml在modules目录的根目录中创建一个文件:

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

为了更好地了解新菜单系统,我推荐以下文章:

编辑: 正如Berdir所述,菜单系统现在具有不同的结构,与D7的菜单系统无关,因此不再存在菜单类型之类的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.