如何从后端访问 Joomla 中的前端菜单对象?

Posted

技术标签:

【中文标题】如何从后端访问 Joomla 中的前端菜单对象?【英文标题】:How to access the frontend menu object in Joomla from the backend? 【发布时间】:2015-05-17 07:34:04 【问题描述】:

我正在编写一个组件,我有这段代码用于前端,可以很好地拉取菜单对象:

$menuObjects= JFactory::getApplication()->getMenu();
$menuArrays = $menuObjects ->getMenu(); 

从那里,我可以在给定文章 ID 的情况下生成文章 URL(这是我正在尝试做的)。但是,从后端管理员方面来看,它是空的。

不查询数据库,如何从后端访问前端菜单对象?

#

解决办法:

感谢@borracciaBlu 让我走上正轨:

对于 Joomla 2.5(使用 JApplication):

$app = JApplication::getInstance('site');
$menuObjects= $app->getMenu();
$menuArrays = $menuObjects ->getMenu();

对于 Joomla 3.x(使用 JApplicationCms):

$app = JApplicationCms::getInstance('site');
$menuObjects= $app->getMenu();
$menuArrays = $menuObjects ->getMenu();

【问题讨论】:

【参考方案1】:

好的,我做了一些测试,这些就是结果。

之所以有两个不同的结果是因为你使用的是JFactory::getApplication()

事实上,这个方法在前端返回一个JApplicationSite 对象,而在后端返回一个JApplicationAdministrator

这就是测试:

$app = JFactory::getApplication();
var_dump($app);

如果你在你的组件中尝试它们,你会看到上面的结果。

现在,理论上 JFactory 旨在接受参数以覆盖 std 行为并以您想要的方式实例化 Object。

我是说在“theory”方法中接受几个参数。

从文档中可以看出:

$id 客户端标识符或名称。 $config 配置设置的可选关联数组。 $prefix 应用前缀

不幸的是,这只是一个理论.. 实际上,该方法在任何情况下都会忽略$config$prefix,如果self::$application 已经实例化,则$id

猜猜看.. 不幸的是,此时self::$application 已经存在。

Murphy 会为你感到骄傲.. :)

作为管理员/index.php@39 中的第一件事,我们有:

$app = JFactory::getApplication('administrator');

因此,正如您在此处看到的那样,该方法完全忽略了此时您传递给的任何内容。 它只能用于获取 JApplicationAdministrator 的实例。

//@see libraries/joomla/factory.php@101

/**
 * Get a application object.
 *
 * Returns the global @link JApplicationCms object, only creating it if it doesn't already exist.
 *
 * @param   mixed   $id      A client identifier or name.
 * @param   array   $config  An optional associative array of configuration settings.
 * @param   string  $prefix  Application prefix
 *
 * @return  JApplicationCms object
 *
 * @see     JApplication
 * @since   11.1
 * @throws  Exception
 */
public static function getApplication($id = null, array $config = array(), $prefix = 'J')

    if (!self::$application)
    
        if (!$id)
        
            throw new Exception('Application Instantiation Error', 500);
        

        self::$application = JApplicationCms::getInstance($id);
    

    return self::$application;

顺便说一句,好消息是这个方法除了缓存和包装JApplicationCms::getInstance($id);之外没有做任何特别的事情。 因此,不要使用 JFactory::getApplication() 代替旧代码:

$menuObjects= JFactory::getApplication()->getMenu();
$menuArrays = $menuObjects ->getMenu();

你可以直接使用:

$app = JApplicationCms::getInstance('site');
$menuObjects= $app->getMenu();
$menuArrays = $menuObjects ->getMenu();

附: 是的,您可能会认为JFactory::getApplication() 的界面有点问题。

【讨论】:

以上是关于如何从后端访问 Joomla 中的前端菜单对象?的主要内容,如果未能解决你的问题,请参考以下文章

Joomla:如何将一种表单用于前端和后端视图?

如何从后端通知前端?

跨站点 cookie 的问题:如何将 cookie 从后端设置到前端

ReactJS中如何将图片从后端发送到前端

后端如何接受json对象数据如何设置表头

Joomla 将文章插入组件