Что эквивалентно 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. Как я могу это сделать? спасибо.

 11
Author: kiamlaluno, 2016-01-21

2 answers

Хотя ответ Лайнуса отличный, он не дает обратной связи по вашему конкретному вопросу:

Аналогично я хочу изменить тип меню в Drupal 8

В Drupal 8 нет такого понятия, как тип меню. Все, что раньше было типом, теперь совершенно другое. Маршруты, Ссылки В Меню, Локальные Задачи, Локальные Действия. И часто у вас есть несколько вещей. У вас всегда есть маршрут (7.x используется для обратного вызова этого типа). И, кроме того, вы добавляете ссылки в меню, локальные задачи или действия для этого маршрута.

Таким образом, вы не можете преобразовать ссылку меню, например, в локальную задачу или даже маршрут к локальной задаче. Единственное, что вы могли бы сделать, это, например, изменить ссылку меню (которая не имеет ничего общего с изменением маршрута, упомянутым выше) и вместо этого создать новую локальную задачу.

Смотрите Ответ Лайнуса для ссылок и дополнительной информации о том, как сделать каждую из этих вещей.

 8
Author: Berdir, 2016-01-21 11:25:20

В 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, поэтому такой вещи нет как тип меню больше нет.

 19
Author: Linus, 2017-04-13 12:47:09