如何构建动态菜单结构 -- 7 领域 和 routes 领域 和 hooks 领域 drupal 相关 的问题

How to build a dynamic menu structure


3
vote

问题

中文

我正在构建一个模块,我想创建两个动态菜单:一个主菜单,每个菜单项是用户所属的组名称(组来自不同的数据库)和辅助菜单固定组的菜单项,操作主菜单中选择的组的特定属性(例如显示组成员)。

做这件事是一个好方法?我找到了这个问题显示如何在模块中创建菜单,但我不确定如何解决菜单项的动态部分。每个用户可以具有不同的主菜单,具体取决于用户的一部分的组,辅助菜单项需要通过所选主菜单项的组ID。旁边的hook_menu,我想我需要用通配符做点什么,但我从未与菜单中的人一起工作,所以我不确定。

我希望能够在不同的主题中使用菜单作为主要和次级菜单的源,因此通过选择另一个主题,我可以灵活地更改网站外观。我正在使用drupal 7。

英文原文

I'm building a module for which I want to create two dynamic menus: one main menu with each menu item being a group name that the user belongs to (the groups come from a different database) and a secondary menu with a fixed set of menu items that manipulate specific properties of the group selected in the main menu (for example show group members).

What would be a good approach to do this? I found this question that shows how to create a menu within a module, but I'm not sure how to tackle the dynamic part of the menu items. Each user can have a different main menu, depending on the groups the user is part of, and the secondary menu items need to pass the group id of the selected main menu item. Next to hook_menu, I suppose I need to do something with wildcards, but I've never worked with those in menus so I'm not sure.

I would like to be able to use the menus as a source for primary and secondary menus in different themes, so I'm flexible with changing the site appearance by selecting another theme. I'm using Drupal 7.

        
 
 

回答列表

2
 
vote
vote
最佳答案
 

我找到了一种方法来做到这一点,但我仍然有兴趣知道这是否是正确的方法(如果糟糕的事情会发生很多组和用户)。

使用 hook_enable 在模块的安装文件中(开发模块是如何执行此操作的一个很好的例子)。

就像我在我的评论中说,我不认为可以创建动态菜单项,以便我为每个组创建一个菜单项(当添加组时,我需要执行 menu_rebuild )。要确定用户是否应该可见菜单项,我创建了一个访问回调,检查用户是否是该组的一部分。每个页面请求都会调用此回调,因此它将始终工作。

辅助菜单与通配符和to_arg函数一起使用。例如,菜单项设置为$项['pmenu /%get_groupid / grouppage']和函数get_groupid_to_arg($ arg)我正在从arg(1)的路径中从arg(for)中提取groupid详情请参阅 hook_menu 和菜单示例)。辅助菜单项还使用相同的访问回调来检查用户是否可以看到菜单项。

最后我必须为主题应用一个修复程序,因为如果选择了辅助菜单项,则不会将相应的主菜单项(组)设置为Active。我正在使用 marinelli 并应用于评论14 此问题。这并不是很好的,所以我改变了一点,只能在检查评论16 。

 

I found a way to do this, but I'm still interested to know if this is the right approach (and if bad things will happen with a very large number of groups and users).

Both menus are created using hook_enable in the install file of the module (the development module is an excellent example on how to do this).

Like I say in my comment, I don't think you can create dynamic menu items so I'm creating a menu item for each group (when a group is added, I need to do a menu_rebuild). To determine if the menu item should be visible for a user, I created an access callback that checks if a user is part of that group. This callback will be called with every page request, so it will always work.

The secondary menu works with a wildcard and a to_arg function. For example, a menu item is set as $items['pmenu/%get_groupid/grouppage'] and in the function get_groupid_to_arg($arg) I'm extracting the groupid from the path with arg(1), which is returned (for details see hook_menu and the Menu example). The secondary menu items also use the same access callback to check if the user may see the menu item.

Finally I had to apply a fix for the theme, because the corresponding primary or parent menu item (group) would not be set as active if a secondary menu item was selected. I'm using Marinelli and applied the patch in comment 14 of this issue. That didn't quite work, so I changed it a bit to only look at the path when checking for a parent as described in comment 16.

 
 

相关问题

3  Drupal 7中的Ajax自动完成文本字段不适用于Chrome  ( An ajax autocomplete textfield in drupal 7 doesnt work in chrome ) 
在Drupal 7中的Ajax自动完成文本域在Firefox中工作,但在IE和Chrome中不起作用。出现以下错误: An AJAX HTTP error occured. HTTP Result Code: 200 Debugging information follows. Path: http://loc...

2  列出任何有机组可见的会员  ( List members visable in any organic group ) 
我正在努力杜拉努尔7& og&视图网站,我正在尝试编写一个展示用户可以通过任何群体的用户"看到" 的内容。 IE: 用户A - A组成员,AB组,组AC 用户B - B组成员,Group AB 用户C - C组的成员,组AC 查看的输出.. 用户A - 用户A,B,C 用户B - ...

28  该领域的含义是什么意思:在视图中的上下文过滤器中提供的Delta内容类型?  ( What is the meaning of the fielddelta content type offered in contextual filter ) 
在创建新的上下文过滤器以获取视图中,类型列表包括诸如内容的选项:spec(field_spec:delta),其中spec是我附加到视图所接受的内容类型的字段的名称。它出现在某些情况下,但不是列表中提供的所有字段。我找不到此字段的引用。这是什么(field_name:delta)? ...

8  空值“ - 选择 - ”未出现具有状态要求的Select字段  ( Empty value select does not appear for select fields with states requireme ) 
当我使用Drupal 7表格API创建标准选择框时,第一个值(也是在新鲜的"空白表单上选择的一个值" )是 <option selected="selected" value="">- Select -</option> 。此值未以表单定义指定,我没有更改表格。 (这很好) 但是,当我创建第二个选择框时,依赖于第一个...

2  分类学词汇权限  ( Taxonomy vocabulary access ) 
我希望一个角色可以访问 为任何词汇表添加和查看术语, 概述 admin/structure/taxonomy/foo_vocabulary 通过拖动对术语进行排序 但否认访问编辑词汇或其字段。它就像 administer-taxonomy 权限而无需编辑词汇表。 tac 不会帮助。 ...

4  并排添加三个三联雨  ( Add three triptych side by side ) 
我已经制作了自定义主题"custom_stark" 进入.info文件并添加了三联网版 regions[triptych_first] = Triptych first regions[triptych_middle] = Triptych middle regions[triptych_last] = Tri...

17  如何处理/清理过时汇总CSS / JS?  ( How to handle cleanup obsolete aggregated css js ) 
我只是使用css / js聚合中内置的drupal 7,但是css.gz和js.gz文件的文件文件夹以相当快速的速度填充,而且我相信它会在开始完全填补驱动器之前,现在是一段时间,就像任何时候都有一个掌握的情况。 当前文件计数IN / JS是335 当前文件计数/ css是451 是否有任何标准方法我应该用来...

3  为什么删除旧重定向?  ( Why delete old redirects ) 
我有很多,许多重定向(数千)。大多数刚刚将系统(Node / 12345)URL重定向到友好的URL - 但我们也有很多其他人。 我有drupal设置为从不删除旧重定向后尚未访问x的时间后,但仅仅存在的选择,让我觉得有一种合理的原因可能想要。 有很多开销吗?或者只是为了保持列表可管理的?人们通常删除它们,如果是的话...

3  添加没有标题的节点  ( Add node with no title ) 
我想让用户创建没有标题的元素。 在这个明确的情况下,我希望他们输入注册号,如您所能想象在这里没有必要标题。 如何将其从创建页面中删除(节点/添加/节点类型),因此我只能看到我想要的字段(不是标题)? ...

3  如何以编程方式将字段附加到实体?  ( How to attach a field to an entity programmatically ) 
是否可以以编程方式将字段附加到实体? 我想创建一个新实体,说车辆,它具有为车辆品牌定义的单选按钮。我希望这个字段无法通过UI删除或修改。 ...

5  如何为视图中的字段提供默认值3  ( How to provide default value with php code for a field in views 3 ) 
所以我正在尝试创建一个在块中显示的视图,它将显示引用与我当前的节点相同的父节点的节点列表。使用引用模块是一个自定义字段。我在Drupal 7上有意见3。 我图我将在我的自定义字段(Field_ref_Photo_Gallery)上设置一个上下文过滤器,我需要通过PHP代码提供默认值。 我应该如何在最多的drupal ...

3  禁用CKEDITOR总结  ( Disable ckeditor on summary ) 
当我使用ckeditor使用窗口小部件"字段类型文本摘要" 时,我的摘要显示在CKEDITOR格式中。我可以防止这种情况并使用普通格式显示字段吗?挂在表单中,我没有找到摘要的格式;整个身体领域只有一个。 使用ckeditor模块。 ...

7  如何以编程方式插入日期字段值?  ( How can i programmatically insert date field values ) 
我有一堆从DateTime格式的.sql导出中的值(在dB中的日期字段中的相同格式)。我正在使用这些日期值创建节点。如何将这些值插入日期字段? 我试过: $node->field_data_field_date['und'][0]['field_date_value'] = $datetime_value; ...

0  如何从hook_node_presave()输出调试信息?  ( How can i output debug info from hook node presave ) 
我正在学习Drupal 7的模块设计,我想看看hook_node_preSave正在传递哪些(并使用),我如何输出调试信息,以便我学习如何操纵它? 有没有类似的钩子,我可以用来打印出调试信息? ...

6  有可能在D7中保存私人的私人私人拍摄图像样式(缩略图)?  ( Possible to make image styles thumbnails public while original images are kept ) 
我喜欢D7允许您选择文件是否应以每场基础存储在公共或私人文件系统中。 但这是我的问题:是否有可能具有存储在私有文件系统中的图像文件,而通过图像样式创建的缩略图等存储在公共文件系统,所以任何人都可以访问它们?换句话说,我想保护原始图像文件,但不是它们的缩略图。 默认为 theme_image_style 似乎放置了...

2  如何将附加到当前节点的文件/图像引用移动到其他节点?  ( How do you move a file image reference attached to a current node to a different ) 
我找到了上一个问题 ,但我正在努力使它适应我想要完成的事情。 如何使用附加到一个节点的文件/图像,并将其移动到另一个节点或创建新节点并在那里附加它? ...

10  如何在自定义模块中定义和使用外部数据库连接  ( How to define and use an external database connection in a custom module ) 
我正在开发一个将依赖于外部数据库查询的模块。是否有最佳实践可以在整个模块中定义和使用外部数据库连接? 此页告诉我如何建立连接,但不是将它放在模块中的位置(特定的钩子?)所以我只需要定义一次。此外,它总是有必要做"db_set_active('yourdatabasekey');" 或者我可以传递一个参数,将设置D...

4  如何列出并存储隐藏的暴露过滤器对匿名用户的几个视图的值?  ( How to list and store the value of hidden exposed filter of several views for an ) 
我需要将词汇术语列为文本链接,然后存储匿名用户的选择。然后,几个视图的曝光过滤器应获得存储值。最简单的方法是什么? ...

4  如何在网站标题块中有HTML不仅仅是SitEname或徽标? (通过次节或优选地编辑在Drupal中)  ( How to have html not just sitename or logo in site heading block via subtheme ) 
有人可以赋予使用HTML的例子,而不仅仅是网站标题中的文本字符串或徽标图形? 我问,因为我想使用多个网络排版字体来制作LOGP而不是位图。 更新 编辑"在drupal中编辑" - 会很好,很抱歉调整问题。谢谢你到目前为止的答案。 ...

1  模块或模板Mod用于制作开发站点看起来与实时站点不同  ( Module or template mod for making development site look different from live site ) 
当我在同一个浏览器中打开我的开发和实时站点时,我有时会混合起来,因为它们看起来也一样。 你们都用什么伎俩来区分它们? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.