【问题标题】:How to access the frontend menu object in Joomla from the backend?如何从后端访问 Joomla 中的前端菜单对象?
【发布时间】: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();

【问题讨论】:

    标签: php joomla joomla2.5 joomla3.0


    【解决方案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() 的界面有点问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 2018-07-24
      • 2018-03-26
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多