Drupal 7 节点上的扩展菜单控制
我最近注意到Drupal7有一个奇怪的小问题,这似乎是我的疏忽或我不同意的决定。本质上,当节点创建时带有菜单项,菜单上的扩展标志不会被设置,但该控件在菜单管理页面上也不可用。这意味着当您尝试打印分层菜单结构时,您需要创建页面,进入菜单管理区域,访问菜单,单击编辑以访问菜单项并更改那里的设置。
为了解决这个问题,我着手创建一个小模块,该模块将向节点编辑表单的菜单选项部分添加表单控件。此单个复选框用于覆盖菜单模块针对扩展菜单参数创建的任何设置。
首先要做的是为模块创建一个简单的信息文件。为了完整起见,我将其包含在此处。
name = Node expanded menu description = Allows users to set the expanded nature of the menu item on creation. core = 7.x
我通常不会为这样一个简单的模块创建安装文件,但在这种情况下,我们需要防止加载模块代码,直到菜单模块将其表单项插入到节点表单中。hook_install()这里的调用只是为系统表中的这个模块条目增加了一些权重,使Drupal加载模块的时间比其他方式稍晚。如果没有这个,我们的模块将在菜单模块创建其表单组件之前运行,我们将无法做任何事情。我用1的值对此进行了测试,发现它运行得非常好,如果它不在您的设置中,那么您可能需要稍微增加此值。
最后,我们需要创建一些钩子来创建表单元素并将结果值保存到数据库中。要创建的第一个钩子是hook_form_[form-id]_alter()钩子,它将允许我们拦截和更改节点编辑表单。一个名为expand的隐藏表单元素已经存在于我们表单的菜单部分中,所以我们只需要修改它以满足我们的需要。我们需要做的就是将元素的类型设置为复选框并交换#value和#default_value属性以停止保存原始值。如果节点的nid已经设置,那么我们将复选框的默认值设置为1,否则我们使用扩展元素的现有值。为了完整起见,我还添加了菜单管理表单中存在的相同标题和描述。
现在,当用户在允许它的节点上创建菜单链接时,他们将能够选择是否显示该菜单项的子项。