【问题标题】:Creating admin menu items dynamically in joomla在 joomla 中动态创建管理菜单项
【发布时间】:2011-06-12 07:21:21
【问题描述】:

又是玩 joomla 的一天,又是一个需要修复的缺点 :)

这次它以管理(后端)菜单的形式出现。 要将项目/子项目添加到此菜单中,人们必须将菜单项写入一个 xml 文件中,并随附他们的组件/扩展/插件/任何东西。 安装扩展程序后,joomla“生成”菜单项并将它们“存储”在数据库中。 实际上,真实/有形的菜单是通过读取 DB 来呈现的。

这有几个含义:

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

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

为此,我有几个潜在的技巧:

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

你怎么看?

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

【问题讨论】:

  • #4 似乎是最容易维护和必要时更改的。例如,如果您需要在具有特定访问级别的用户在特定管理页面上时添加菜单项,您可以向组件控制器添加一些代码来检查访问级别和当前页面,然后调用 SQL模型中的语句以将项目添加到数据库中。

标签: php menu joomla admin


【解决方案1】:

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

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

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

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

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

反正我不经常发帖;但我当然希望这会有所帮助。我很想亲自看到这种类型的 pf 功能。只是没有时间编写代码。

祝你好运!

乔欣

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      似乎没有任何 hack 足够令人满意、安全或可维护来实现这一目标。

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

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

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

      希望到 1.7 版,他们[joomla] 完全丢弃了初始代码库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 2013-06-28
        • 2012-10-05
        • 1970-01-01
        • 2013-12-09
        • 2013-06-17
        • 2013-03-12
        相关资源
        最近更新 更多