Что эквивалентно hook menu alter() для изменения типа элемента меню?
Я хочу изменить тип меню в 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. Как я могу это сделать? спасибо.
2 answers
Хотя ответ Лайнуса отличный, он не дает обратной связи по вашему конкретному вопросу:
Аналогично я хочу изменить тип меню в Drupal 8
В Drupal 8 нет такого понятия, как тип меню. Все, что раньше было типом, теперь совершенно другое. Маршруты, Ссылки В Меню, Локальные Задачи, Локальные Действия. И часто у вас есть несколько вещей. У вас всегда есть маршрут (7.x используется для обратного вызова этого типа). И, кроме того, вы добавляете ссылки в меню, локальные задачи или действия для этого маршрута.
Таким образом, вы не можете преобразовать ссылку меню, например, в локальную задачу или даже маршрут к локальной задаче. Единственное, что вы могли бы сделать, это, например, изменить ссылку меню (которая не имеет ничего общего с изменением маршрута, упомянутым выше) и вместо этого создать новую локальную задачу.
Смотрите Ответ Лайнуса для ссылок и дополнительной информации о том, как сделать каждую из этих вещей.
В 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
в корневом каталоге вашего каталог модулей:
services:
node.route_subscriber:
class: Drupal\YOURMODULE\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
Чтобы лучше понять новую систему меню, я бы рекомендовал следующие статьи:
- Руководство по обновлению с D7 до D8: Преобразуйте hook_menu() и hook_menu_alter() в API Drupal 8
- Что случилось с Hook_Menu в Drupal 8?
Редактировать: Как упоминал Бердир, система меню теперь имеет другую структуру, которая не имеет ничего общего с системой меню D7, поэтому такой вещи нет как тип меню больше нет.