Как мне вызвать функцию menu_rebuild в Drupal 7?

13

Я хотел бы вызвать функцию menu_rebuild () , но я не уверен, куда именно вставить фрагмент кода.

Я не могу найти файл update.php в моем локальном экземпляре.

Причина, по которой я хотел бы попытаться это сделать, заключается в том, что я удалил все узлы, но они все еще отображаются в структуре меню.

user12804
источник
Вы хотите перестроить меню Drupal после обновления или как?
Aboodred1
update.php будет в корневой папке drupal, т. е. /var/www/htdocs/drupalмодифицировать его - плохая идея. Не могли бы вы добавить более подробную информацию о том, почему вы хотите вызвать menu_rebuild?
GoodSp33d
Aboodred1, да, я хотел бы восстановить меню drupal после удаления всех узлов. 2-Строкер, drupal.stackexchange.com/questions/58606/...
user12804
@ user12804, вы уверены, что это меню, связанное с узлами? Если так, я уже ответил на другой вопрос.
Ситху

Ответы:

5

Создайте файл со следующим содержимым и просто поместите в корневой каталог Drupal. Давайте скажем menu-rebuild.php. Запустите его 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();
Ситху
источник
Это может быть проще запустить с помощью
Devel
15

Drupal 7

Если вы используете drush, вы можете запустить:

drush eval 'menu_rebuild();'

Если не сработает, см .: Как сделать перестроение меню при наличии PHP Fatal error?

Drupal 6

drush php-eval 'drupal_rebuild_theme_registry()'

Memcached

Если вы используете memcached, вы должны перезапустить его.

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

В OS X (если используется Homebrew): brew services restart memcached

kenorb
источник
проголосуйте за правильные команды drush, чтобы сделать это легко, но вам определенно следует добавить, что в некоторых случаях вам нужно очистить соответствующие таблицы базы данных, как упомянуто выше
@Valk
11

Откройте схему базы данных, затем удалите все содержимое таблиц menu_links и menu_router с помощью следующих SQL-запросов:

DELETE FROM menu_links;
DELETE FROM menu_router;

Затем запустите http://example.com/update.php . Он вызовет menu_rebuild (), который заполнит эти таблицы «свежими» данными. Это сработало для меня после того, как «PHP Fatal Error: Out of memory» превратил некоторые из моих меню в беспорядок.

Но имейте в виду, что это уничтожит все ваши пользовательские меню, которые вам придется восстанавливать вручную. Чтобы избежать этого, вы можете немного поиграть с удалением некоторых выбранных записей из menu_router и menu_links, но для меня это не сработало.

И не забудьте сделать резервную копию базы данных и каталога сайта перед удалением содержимого из таблиц.

Валк
источник
2
проголосуйте за необходимую дополнительную информацию, которая иногда вам ОПРЕДЕЛЕННО должна очистить соответствующие таблицы базы данных перед menu_rebuild. Это подтверждается многолетним опытом ...
nilsun
3

Пара разных способов:

  1. Позвонить menu_rebuild()с hook_update_N
  2. Отредактируйте и сохраните форму настроек меню от администратора Drupal.
  3. Из командной строки, с помощью drush: drush cc menu
Дэвид Томас
источник
Спасибо. Могу ли я сделать это и без драм?
user12804
Да, любой из вышеперечисленных 3 методов будет работать сам по себе.
Дэвид Томас
Re: Редактировать и сохранить ссылку меню от администратора Drupal. Не работает, уже пробовал это несколько раз ...
user12804
Да, это было предназначено для страницы настроек меню. Вы также можете позвонить, menu_cache_clear_all()чтобы восстановить кэш меню
Дэвид Томас
2

Переход к admin/config/development/performanceкнопке «Очистить все кэши» и нажатие на нее приведет к перестройке меню, а также очистке кэша шаблонов, блоков, страниц и т. Д.

пентен
источник
Спасибо Пентен, я пробовал это несколько раз, но не повезло. Удаленные узлы по-прежнему отображаются в структуре меню навигации :(
user12804
2

Альтернативный способ - установить переменную:

variable_set('menu_rebuild_needed', TRUE);

Это вызовет menu_rebuild();

Михал Пжибылович
источник
0

Чтобы исправить административное меню, используйте в SQL и обратите внимание, что, как указано выше, Valk удалит все настройки из меню управления администрацией. После того, как вы запустите его, очистите кэш и меню управления будет восстановлено с настройками по умолчанию.

Вот SQL-запрос:

DELETE FROM menu_links WHERE menu_name='management' 
kenorb
источник
Перестройка меню в основном необходима, когда что-то действительно сломано, и Drupal не может это исправить в середине. Вот почему я бы предпочел метод Valks, потому что полный сброс - лучший ответ на такой вопрос, если не предоставлено больше подробностей. ЧТО не работает.
Nilsun