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

Vamsi
источник
3
Прочитайте это drupal.org/node/2118147
Ади
Как уже упоминал Бердир, меню больше не существует. Можете ли вы указать, что вы пытаетесь архивировать?
Линус

Ответы:

7

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

Точно так же я хочу изменить тип меню в Drupal 8

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

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

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

Berdir
источник
Вы правы, я совершенно забыл упомянуть об этом. Спасибо за добавление.
Линус
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файл в корневом каталоге вашего модуля:

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

Чтобы лучше понять новую систему меню, я бы порекомендовал следующие статьи:

Редактировать: Как уже упоминал Бердир , система меню теперь имеет другую структуру, которая не имеет ничего общего с системой меню D7, поэтому больше не существует такого типа меню.

Линус
источник