Comment appeler la fonction menu_rebuild dans Drupal 7?

13

Je voudrais appeler la fonction menu_rebuild () , mais je ne sais pas exactement où coller l'extrait de code.

Je ne trouve le fichier update.php nulle part dans mon instance locale.

La raison pour laquelle j'aimerais essayer est que j'ai supprimé tous les nœuds, mais ils apparaissent toujours sous la structure du menu.

user12804
la source
voulez-vous reconstruire le menu Drupal après la mise à jour ou quoi?
Aboodred1
update.php sera dans le dossier racine de drupal, c'est-à-dire /var/www/htdocs/drupalque la modifier est une mauvaise idée. Pourriez-vous ajouter plus de détails sur la raison pour laquelle vous souhaitez appeler menu_rebuild?
GoodSp33d
Aboodred1, oui, je voudrais reconstruire le menu drupal après avoir supprimé tous les nœuds. 2-Stroker, drupal.stackexchange.com/questions/58606/…
user12804
@ user12804, Êtes-vous sûr qu'il s'agit de menus liés aux nœuds? Si oui, j'ai déjà répondu dans l'autre question.
Sithu

Réponses:

5

Créez un fichier avec le contenu suivant et déposez simplement dans le répertoire racine Drupal. Disons menu-rebuild.php. Exécutez-le 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
la source
Il peut être plus facile d'exécuter cela en utilisant Devel
mbomb007
15

Drupal 7

Si vous utilisez drush, vous pouvez exécuter:

drush eval 'menu_rebuild();'

Si cela ne fonctionne pas, voir: Comment reconstruire le menu en cas d'erreur fatale PHP?

Drupal 6

drush php-eval 'drupal_rebuild_theme_registry()'

memcached

Si vous utilisez memcached, vous devez le redémarrer.

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

Sous OS X (si vous utilisez Homebrew): brew services restart memcached

Kenorb
la source
voter pour les commandes drush correctes pour le faire facilement, mais vous devez certainement ajouter que dans certains cas, vous devez vider les tables de base de données correspondantes avant comme mentionné par @Valk ci
nilsun
11

Ouvrez le schéma de base de données, puis supprimez tout le contenu des tables menu_links et menu_router avec les requêtes SQL suivantes:

DELETE FROM menu_links;
DELETE FROM menu_router;

Exécutez ensuite http://example.com/update.php . Il appellera menu_rebuild (), qui remplira ces tables de données «fraîches». Cela a fonctionné pour moi après qu'une "erreur fatale PHP: mémoire insuffisante" ait transformé certains de mes menus en désordre.

Mais sachez qu'il effacera tous vos menus personnalisés que vous devrez reconstruire manuellement. Pour l'éviter, vous pouvez jouer un peu en supprimant certains enregistrements sélectionnés de menu_router et menu_links, mais pour moi, cela n'a pas bien fonctionné.

Et n'oubliez pas de sauvegarder votre base de données et votre répertoire de site avant de supprimer le contenu des tables.

Valk
la source
2
votez pour les informations supplémentaires nécessaires, que parfois vous devez DEFINITIVEMENT vider les tables de base de données correspondantes avant menu_rebuild. Cela est confirmé ici par des expériences à long terme ...
nilsun
3

Deux façons différentes:

  1. Appel menu_rebuild()de hook_update_N
  2. Modifiez et enregistrez un formulaire de paramètres de menu depuis l'administrateur Drupal.
  3. Depuis la ligne de commande, avec drush: drush cc menu
David Thomas
la source
Je vous remercie. Puis-je faire cela sans drush également?
user12804
Oui, l'une des 3 méthodes ci-dessus fonctionnera d'elle-même.
David Thomas
Re: Modifier et enregistrer un lien de menu depuis l'administrateur Drupal. Ne fonctionne pas, déjà essayé plusieurs fois ...
user12804
Oui, celui-ci était destiné à la page des paramètres du menu. Vous pouvez également appeler menu_cache_clear_all()pour reconstruire le cache du menu
David Thomas
2

Si vous admin/config/development/performancecliquez sur le bouton "Effacer tous les caches" et que vous cliquez dessus, le menu sera reconstruit, ainsi que le cache du modèle, du bloc, de la page, etc.

pentène
la source
Merci Penten, j'ai essayé plusieurs fois, mais pas de chance. Les nœuds supprimés apparaissent toujours dans la structure du menu de navigation :(
user12804
2

Une autre méthode consiste à définir une variable:

variable_set('menu_rebuild_needed', TRUE);

Cela déclenchera la menu_rebuild();

Michal Przybylowicz
la source
0

Pour corriger l'utilisation du menu d'administration dans SQL et notez que, comme Valk l'a indiqué ci-dessus, il supprimera toute personnalisation de votre menu de gestion d'administration. Une fois que vous l'avez exécuté, effacez votre cache et le menu de gestion sera reconstruit à ses paramètres par défaut.

Voici la requête SQL:

DELETE FROM menu_links WHERE menu_name='management' 
Kenorb
la source
reconstruire le menu devient surtout nécessaire quand quelque chose est vraiment cassé et Drupal ne peut pas le réparer au milieu. C'est pourquoi je recommanderais plutôt la méthode Valks, car une réinitialisation complète est une meilleure réponse à une telle question si aucun détail supplémentaire n'est fourni.
nilsun