Qual é o equivalente de hook_menu_alter () para alterar um tipo de item de menu?

10

Quero alterar o tipo de menu no Drupal 8. No Drupal 7, podemos conseguir isso usando 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,
  );
}

Da mesma forma, quero alterar o tipo de menu no Drupal 8. Como posso fazer isso. Obrigado.

Vamsi
fonte
Como mencionado por Berdir, não há mais nenhum tipo de menu. Você pode especificar o que está tentando arquivar?
Linus

Respostas:

7

Embora a resposta de Linus seja ótima, ela não fornece comentários sobre sua pergunta específica:

Da mesma forma, quero alterar o tipo de menu no Drupal 8

Não existe um tipo de menu no Drupal 8. Tudo o que costumava ser um tipo agora é uma coisa completamente diferente. Rotas, links de menu, tarefas locais, ações locais. E frequentemente, você tem várias coisas. Você sempre tem uma rota (7.x usada para chamar esse tipo de retorno de chamada). Além disso, você adiciona links de menu, tarefas locais ou ações para essa rota.

Portanto, você não pode converter um link de menu em uma tarefa local, por exemplo, nem mesmo uma rota para uma tarefa local. A única coisa que você pode fazer é, por exemplo, alterar um link de menu (que não tem nada a ver com a alteração de rota mencionada acima) e criar uma nova tarefa local.

Consulte a resposta de Linus para obter links e mais informações sobre como fazer cada uma dessas coisas.

Berdir
fonte
Você está certo, eu esqueci totalmente de mencionar isso. Obrigado pela adição.
Linus
17

O Drupal 8 possui um novo sistema de menus, não existe hook_menue não existe hook_menu_altermais.

Se você deseja alterar uma rota existente, é um pouco mais complicado em comparação com o Drupal 7.

No seu módulo, você precisa criar um arquivo de classe YOURMODULE/src/Routing/CLASSNAME.phpque se estenda 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...
  }
}

Você pode usar a classe RouteSubsciber do módulo do nó como exemplo.

Para permitir que seu RouteSubscriber seja reconhecido, você também precisa criar um YOURMODULE.services.ymlarquivo na raiz do diretório de seus módulos:

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

Para obter uma melhor visão do novo sistema de menus, recomendo os seguintes artigos:

Edit: Como mencionado por Berdir , o sistema de menus tem uma estrutura diferente agora, que não tem nada a ver com o sistema de menus do D7, então não existe mais um tipo de menu.

Linus
fonte