【发布时间】:2011-06-12 07:21:21
【问题描述】:
又是玩 joomla 的一天,又是一个需要修复的缺点 :)
这次它以管理(后端)菜单的形式出现。 要将项目/子项目添加到此菜单中,人们必须将菜单项写入一个 xml 文件中,并随附他们的组件/扩展/插件/任何东西。 安装扩展程序后,joomla“生成”菜单项并将它们“存储”在数据库中。 实际上,真实/有形的菜单是通过读取 DB 来呈现的。
这有几个含义:
- 菜单不可编写脚本
- 菜单不是动态的; 在安装后更改 XML 文件,不会更新菜单
- 项目的删除不可编写脚本;当您卸载扩展程序时,joomla 会负责删除所有项目。
我有这个系统,它依赖于动态修改菜单项的能力,但通过代码。 简而言之,我需要具有可以创建可变菜单项的功能(即,它在会话结束时被删除)。
为此,我有几个潜在的技巧:
- 覆盖 joomla 全局数据库实例,以便我可以让它返回假菜单项。这是可能的,因为数据库对象存储在 JFactory 类的公共属性中:
JFactory::$database=new MyFakeJDatabase(JFactory::$database); - 在输出之前截取菜单代码(html)并根据我的需要将其弄乱。这对模板不友好,因为最终结果将是注入 html,而这可能不是模板的设计目的。
- 通过 javascript 创建菜单项。这会导致模板和切换子菜单的 javascript 出现问题。
- 在需要时在数据库中创建菜单项,并以某种方式“标记”我的项目,以便下次(或会话结束)删除它们。这听起来像是一种魅力。因为我可以缓冲菜单项,所以我可以在一个完整的 SQL 语句中创建我的菜单项。比我可以使用另一个 SQL 来删除标记的菜单项。 2 SQL 语句可能不会对服务器造成太大负担。
你怎么看?
编辑:我检查了joomla/administrator/modules/mod_menu/helper.php,看看是否能找到注入我的东西的方法,希望 joomla 可能使用了全局变量或其他东西,但没有用 - 菜单项目是通过读取数据库和渲染直接创建的。
仅供参考,我在 Google 上搜索了一段时间,但没有用。
【问题讨论】:
-
#4 似乎是最容易维护和必要时更改的。例如,如果您需要在具有特定访问级别的用户在特定管理页面上时添加菜单项,您可以向组件控制器添加一些代码来检查访问级别和当前页面,然后调用 SQL模型中的语句以将项目添加到数据库中。