在Drupal 7.0中,当我将路由路径/菜单从类型MENU_NORMAL_ITEM更改为类型MENU_CALLBACK时,Drupal 7.0不会从menu_links
表中删除该项目。我不确定这是不是错误,但我filed one with the core team。
有了这个上下文,有没有办法强制Drupal重建其所有导航菜单?即使我在更改菜单项后清除了Drupal的缓存,我上面描述的错误也会发生。
我知道我可以重命名单个菜单路径,清除缓存/刷新,然后将该项目命名为刷新任何单独的路由/菜单链接。我正在寻找一个可以运行的单个命令(或者可以调用的函数或一组命令)和知道所有的菜单导航都是最新的,而不用担心我已经给了其他部分系统搞乱内部。
这是否存在?如果你要提到drush或devel,你很棒,但是我对这些工具的具体说明就是我所追求的。
答案 0 :(得分:10)
请注意,虽然有重建菜单的选项(请参阅其他答案),但这些选项可能会或可能不会用于清除菜单链接的问题。
重建菜单只需重建菜单路由器项目和菜单链接,只要它们是根据菜单路由器项目自动生成的。存在已知问题,例如重新父母菜单链接(http://drupal.org/node/550254)。如果已自定义或手动添加菜单链接(或Drupal认为它们已被更改..),则不会触及这些链接。
正如另一个问题所述,这两个系统之间的紧密耦合可能会在D8中发生变化,因此您必须从菜单路由器项目中单独声明菜单链接。
答案 1 :(得分:7)
当您无法访问该站点或未安装Devel或Drush时,这是另一个选项。创建一个文件,例如rebuild.php并将其放在你的Drupal根目录中(尽管它没关系因为chdir会切换到指定的Drupal根目录)。然后,在您访问该脚本后,它应该重建菜单,然后所有应该在网站上。
<?php
// Bootstrap
// Change chdir to the full path of your Drupal root
chdir('/home/myusername/public_html/');
define('DRUPAL_ROOT', getcwd());
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
// Rebuild
menu_rebuild();
?>
答案 2 :(得分:4)
variable_set('menu_rebuild_needed', TRUE);
答案 3 :(得分:3)
我遇到了同样的问题。我从MENU_NORMAL_ITEM切换到MENU_CALLBACK,无法摆脱导航块中的菜单项。我尝试了上面的几个解决方案但没有成功。对我有用的是在hook_menu中注释我的菜单项,清除缓存,重新启用它们并再次清除缓存。
这是我在Hook_menu中返回以清除所有菜单项的内容:
return array(); // $物品;
答案 4 :(得分:2)
访问模块列表页面通常会重建菜单。
您也可以尝试安装Dev模块启用开发块,并且您有重建菜单的链接。
答案 5 :(得分:1)
有很多方法可以做到,但最好的方法是使用devel模块。 启用模块后,转到块并在您的侧栏上启用devel块。 然后参考图像中的红框
http://cyrve.com/screenshots/devel_theme_snap-20080113-205127.jpg
它有一个清除菜单缓存的选项。块的位置取决于块放置的位置。
答案 6 :(得分:0)
如果您安装了Devel模块,您可以转到菜单配置页面( / admin / build / menu ),然后选择Devel菜单。
在该页面内会出现重建菜单选项。
答案 7 :(得分:0)
在D7中,菜单配置页面已移至admin / structure / menu /。
这个小技巧是让菜单路由器重建而不会使用另一个块混乱UI的好方法。