Como chamo a função menu_rebuild no Drupal 7?

13

Gostaria de chamar a função menu_rebuild () , mas não tenho certeza de onde exatamente colar o trecho de código.

Não consigo encontrar o arquivo update.php em qualquer lugar da minha instância local.

A razão pela qual gostaria de tentar fazer isso é que excluí todos os nós, mas eles ainda estão aparecendo na estrutura do menu.

user12804
fonte
você deseja reconstruir o menu do Drupal após a atualização ou o quê?
precisa saber é o seguinte
O update.php estará na pasta raiz do drupal, ou seja, /var/www/htdocs/drupale modificá-lo é uma má ideia. Você poderia adicionar mais detalhes sobre por que deseja chamar menu_rebuild?
precisa saber é
Aboodred1, sim, eu gostaria de reconstruir o menu drupal depois de excluir todos os nós. 2-Stroker, drupal.stackexchange.com/questions/58606/…
user12804
@ user12804, Tem certeza de que são menus relacionados ao nó? Nesse caso, eu já respondi na outra pergunta.
Sithu 28/01

Respostas:

5

Crie um arquivo com o seguinte conteúdo e simplesmente solte no diretório raiz do Drupal. Vamos dizer menu-rebuild.php. Execute-o http://example.com/menu-rebuild.php

<?php
error_reporting(E_ALL);
define('DRUPAL_ROOT', getcwd());
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

menu_rebuild();
Sithu
fonte
Pode ser mais fácil para executar esta usando Devel
mbomb007
15

Drupal 7

Se você estiver usando drush, poderá executar:

drush eval 'menu_rebuild();'

Se não funcionar, consulte: Como fazer a reconstrução do menu ao ter um erro fatal do PHP?

Drupal 6

drush php-eval 'drupal_rebuild_theme_registry()'

memcached

Se você estiver usando o memcached, precisará reiniciá-lo.

No Linux: /etc/init.d/memcached restart

No OS X (se estiver usando o Homebrew): brew services restart memcached

kenorb
fonte
votar para os comandos Drush corretas para fazer isso easely, mas você definitivamente deve acrescentar que, em alguns casos, você precisa esvaziar as tabelas de banco de dados correspondentes antes como mencionado por @Valk acima
nilsun
11

Abra o esquema do banco de dados e exclua todo o conteúdo das tabelas menu_links e menu_router com as seguintes consultas SQL:

DELETE FROM menu_links;
DELETE FROM menu_router;

Em seguida, execute http://example.com/update.php . Ele chamará menu_rebuild (), que preencherá essas tabelas com dados 'novos'. Funcionou para mim depois que um "Erro fatal do PHP: falta de memória" transformou alguns dos meus menus em uma bagunça.

Mas lembre-se de que ele eliminará todos os menus personalizados que você precisará reconstruir manualmente. Para evitá-lo, você pode brincar um pouco com a exclusão de alguns registros selecionados de menu_router e menu_links, mas para mim não funcionou bem.

E não se esqueça de fazer backup do banco de dados e do diretório do site antes de excluir o conteúdo das tabelas.

Valk
fonte
2
vote nas informações adicionais necessárias, que às vezes DEFINITIVAMENTE você precisa esvaziar as tabelas correspondentes do banco de dados antes de menu_rebuild. Isto é confirmado aqui a partir de experiências de longo prazo ...
nilsun 17/11
3

Algumas maneiras diferentes:

  1. Ligar menu_rebuild()de hook_update_N
  2. Edite e salve um formulário de configurações de menu do administrador do Drupal.
  3. Na linha de comando, com drush: drush cc menu
David Thomas
fonte
Obrigado. Posso fazer isso sem drush também?
user12804
Sim, qualquer um dos três métodos acima funcionará por si só.
David Thomas
Re: Edite e salve um link de menu do Drupal admin. Não trabalho, já tentei isso algumas vezes ...
user12804
Sim, esse foi feito para a página de configurações do menu. Você também pode ligar menu_cache_clear_all()para reconstruir o cache de menu
David Thomas
2

Ir admin/config/development/performancee clicar no botão "Limpar todos os caches" fará com que o menu seja reconstruído, além de limpar o modelo, bloco, página, etc.

penten
fonte
Graças à Penten, tentei isso várias vezes, mas sem sorte. Os nós excluídos ainda estão aparecendo na estrutura do menu Navegação :(
user12804
2

A maneira alternativa é definir a variável:

variable_set('menu_rebuild_needed', TRUE);

Isso acionará o menu_rebuild();

Michal Przybylowicz
fonte
0

Para corrigir o menu do administrador, use o SQL e observe que, como Valk afirmou acima, removerá toda a personalização do menu de gerenciamento de administração. Depois de executá-lo, limpe seu cache e o menu de gerenciamento será reconstruído para as configurações padrão.

Aqui está a consulta SQL:

DELETE FROM menu_links WHERE menu_name='management' 
kenorb
fonte
para reconstruir o menu se torna principalmente necessário quando algo está realmente quebrado e o Drupal não consegue consertá-lo no meio. É por isso que eu preferiria recomendar o método Valks porque uma redefinição completa é uma resposta melhor para essa pergunta se não for fornecido mais detalhes O QUE ESTÁ quebrado.
Nilsun 17/11/2014