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

Php 在joomla中动态创建管理菜单项,php,menu,joomla,admin,Php,Menu,Joomla,Admin,又是和joomla玩了一天,还有一个缺点需要解决:) 这次它以管理(后端)菜单的形式出现。 要将项/子项添加到此菜单,用户必须将菜单项写入其组件/扩展名/插件/任何内容附带的xml文件中。 安装扩展时,joomla“生成”菜单项并“存储”在DB中。 实际上,真实/有形菜单是通过读取DB来呈现的 这有几个含义: 菜单不可编写脚本 菜单不是动态的;安装后更改XML文件不会更新菜单 删除项目不可编写脚本;joomla负责在卸载扩展时删除任何项目 我有一个系统,它依赖于动态修改菜单项的能力,但是通过

又是和joomla玩了一天,还有一个缺点需要解决:)

这次它以管理(后端)菜单的形式出现。 要将项/子项添加到此菜单,用户必须将菜单项写入其组件/扩展名/插件/任何内容附带的xml文件中。 安装扩展时,joomla“生成”菜单项并“存储”在DB中。 实际上,真实/有形菜单是通过读取DB来呈现的

这有几个含义:

  • 菜单不可编写脚本
  • 菜单不是动态的;安装后更改XML文件不会更新菜单
  • 删除项目不可编写脚本;joomla负责在卸载扩展时删除任何项目
我有一个系统,它依赖于动态修改菜单项的能力,但是通过代码。 简单地说,我需要具有创建易失性菜单项的功能(即在会话结束时将其删除)

为此,我有几个潜在的黑客:

  • 重写joomla全局数据库实例,以便使其返回假菜单项。这是可能的,因为数据库对象存储在JFactory类的公共属性中:
    JFactory::$database=new MyFakeJDatabase(JFactory::$database)
  • 在输出之前截取菜单代码(html),并根据我的需要将其弄乱。这对模板不友好,因为最终结果将是注入html,而这可能不是模板设计的目的
  • 通过javascript创建菜单项。这会遇到模板和切换子菜单的javascript的问题
  • 只要我需要,就在DB中创建菜单项,并以某种方式“标记”我的项,以便我下次(或会话结束)删除它们。这听起来像是一种魅力。因为我可以缓冲菜单项,所以我可以在一个完整的SQL语句中创建菜单项。然后我可以使用另一个SQL来删除标记的菜单项。2个SQL语句在服务器上的负载可能不大
  • 你觉得怎么样

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

    似乎没有一个黑客能够满足、安全或可维护,足以实现这一目标

    我已经中止了这个项目,取而代之的是通过JS在主仪表板中放置按钮

    这对最终用户来说非常不方便(他们仍然缺少子项)。但他妈的…这是乔姆拉的错

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

    希望到了1.7版,他们[joomla]会把最初的代码库全部扔掉。

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

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

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

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

    找到一个扩展来执行代码需要做的事情,或者尽可能接近它。整个CMS由运行在Joomla之上的扩展构建!框架,有数千个扩展可供下载。一旦你找到了它,克隆它。然后对它进行编辑,使它能够完成您需要它完成的任务,以及它以前完成的任务(如果这是一项要求)。安装更新的克隆,取消发布原始克隆并发布您的克隆。节省了很多时间

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

    无论如何,我不经常发帖子;但我确实希望这能有所帮助。我想亲自看看这种类型的pf功能。只是没有时间编写代码

    祝你好运


    chozyn似乎是最容易维护和更换的。例如,当具有特定访问级别的用户位于特定的管理页面上时,如果需要添加菜单项,则可以向组件控制器添加一些代码以检查