gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:07:57 25 4
gpt4 key购买 nike

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

$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();

最佳答案

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

你有两个不同结果的原因是因为你正在使用 JFactory::getApplication()

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

这就是测试:

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

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

现在,理论上 JFactory 被设计为接受参数来覆盖标准行为并以您想要的风格实例化对象。

我是说在“理论”中方法接受多个参数。

从文档中可以看出:

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

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

你猜怎么着.. 不幸的是你此时 self::$application 已经存在。

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

作为 administrator/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() 的接口(interface)有点问题。

关于php - 如何从后端访问 Joomla 中的前端菜单对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29055615/

25 4 0