在joomla中动态创建管理菜单项

时间:2011-01-20 08:29:40

标签: php menu joomla admin

另一天玩joomla,另一个缺点是修复:)

这次它以管理(后端)菜单的形式出现。 要将项目/子项添加到此菜单,人们必须在xml文件中编写菜单项,并附带其components / extension / plugin / whatever。 安装扩展时,joomla“生成”菜单项并将其“存储”在DB中。 实际上,通过读取数据库来呈现真实/有形菜单。

这有几个含义:

  • 菜单不可编写脚本
  • 菜单不是动态的;在安装后更改XML文件,将不会更新菜单
  • 删除项目不可编写脚本;卸载扩展程序时,joomla负责删除任何项目。

我有这个系统,它依赖于动态修改菜单项的能力,但是通过代码。 简单地说,我需要具有可以创建易失性菜单项的功能(即,它会在会话结束时被删除)。

要做到这一点,我有几个预期的黑客:

  1. 覆盖joomla全局数据库实例,以便我可以返回假的菜单项。这是可能的,因为数据库对象存储在JFactory类的公共属性中:JFactory::$database=new MyFakeJDatabase(JFactory::$database);
  2. 在输出之前截取菜单代码(html)并根据我的需要弄乱它。这不是模板友好的,因为最终结果将是注入html,这可能不是模板的设计目的。
  3. 通过javascript创建菜单项。这会使模板和切换子菜单的javascript出现问题。
  4. 每当我需要时在DB中创建菜单项,并以某种方式“标记”我的项目,以便下次(或会话结束)删除它们。这听起来像是一种魅力。因为我可以缓冲菜单项,所以我可以在一个完整的SQL语句中创建我的菜单项。我可以使用另一个SQL删除标记的菜单项。 2 SQL语句可能不会对服务器造成太大负担。
  5. 您怎么看?

    编辑:我已经检查了joomla/administrator/modules/mod_menu/helper.php,看看我是否能找到一种方法来注入我的东西,希望joomla可能使用全局变量或其他东西,但没有用 - 菜单项也是通过读取db和渲染直接创建的。 仅供参考我在Google上搜索了一段时间,没有用。

3 个答案:

答案 0 :(得分:2)

有趣。我与Joomla合作多年,为各种目的编写各种扩展,包括集成外部系统。通过查看代码执行的基本需求来解决这些类型的情况是我的经验。我似乎总是开始问:它是由UI驱动还是由系统驱动的?

首先,考虑代码是否将根据用户生成的系统事件执行。有很多'他们甚至可以触发你自己的。如果这是一项要求,那么解决方案将需要包含一个附加到事件的插件。

但是,对于任何类型的动态UI内容,您都需要一个模块。模块都是关于显示内容的。这些人专为用户体验而设计。因此,请考虑如何管理对UI内容的访问。哪些用户将构成此内容的“受众”?这由用户组和访问级别控制。在代码中的某个时刻,最好是早期,您必须检查用户的权限,然后修改代码执行作为响应。值得庆幸的是,我发现有人已经为我做了很多工作。怎么样?

找到一个扩展程序,用于执行代码需要执行的操作,或者尽可能接近匹配的扩展程序。整个CMS都是使用在Joomla上运行的扩展而构建的!框架,有数以千计的扩展可供下载。一旦找到它,就克隆一下。然后对其进行编辑,使其完成您需要它做的事情,以及它之前所做的事情(如果这是一项要求)。安装更新的克隆,取消发布原始版本并发布您的原件。节省了大量时间。

查看您的要求,只有会话时,代码才会执行​​。我将从'用户'类型插件开始。当用户触发登录事件时,插件可以将动态菜单记录作为db记录数组添加到会话变量中。当用户触发注销或会话超时时,记录将自行消失。然后我会简单地克隆“mod_menu”并读取它在用户会话中找到的任何记录。我一直使用这种会话变量技术,特别是在实现分析数据收集时。

无论如何,我不经常发帖;但我当然希望这会有所帮助。我很想看到这种类型的pf功能。只是没有时间来编码它。

祝你好运!

chozyn

答案 1 :(得分:1)

“正确”的方法是编写一个模块,该模块覆盖核心菜单模块以实现旧功能,并具有来自任何来源的动态菜单的附加功能。不是特别好的方式,但这是Joomla的方式。 感谢@ircmaxell指出这个方法。

答案 2 :(得分:0)

没有任何黑客看起来足够令人满意,安全或可维护。

我已经中止了项目,而是通过JS将按钮放在主仪表板中。

最终用户非常不方便(他们仍然会错过子项目)。但到底是什么......这是Joomla的错。

哦,为了记录,我需要添加自己的自定义“页面”,类似于管理组件。你猜怎么着?那也失败了,所以这是另一个黑客。

希望在版本1.7中,他们[joomla]完全废弃了初始代码库。