2

我正在编写一个 Joomla 2.5.3 模块。我正在尝试从 JModel 获取文章。

JModel::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');
$model =& JModel::getInstance('Article', 'ContentModel', array('ignore_request' => true));
$item =& $model->getItem((int) $id);

结果是:

Fatal error: __clone method called on non-object in /var/www/site/joomla/components/com_content/models/article.php on line 170

有谁知道为什么?


编辑

第 170 行/var/www/site/joomla/component/com_content/models/article.php

$data->params = clone $this->getState('params');

如果我这样做,var_dump($tihs->getState('params'))我会得到NULL.

4

1 回答 1

3

我自己发现了错误。代码是这样的:

JModel::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');
$model =& JModel::getInstance('Article', 'ContentModel', array('ignore_request'=>true));

$appParams = JFactory::getApplication()->getParams();
$model->setState('params', $appParams);

$item =& $model->getItem($id);

错误是:

Fatal error: __clone method called on non-object in /var/www/site/joomla/components/com_content/models/article.php on line 170

查看类ContentModelArticle(in components/com_content/models/application.php) 的源代码,我注意到该函数getItem()尝试访问$params状态对象的变量。该变量先前未初始化。

$registry = new JRegistry;
$registry->loadString($data->attribs);
$data->params = clone $this->getState('params'); // 'params' was not previously initialized! The call to clone will fail if you don't provide your own initialization.
$data->params->merge($registry);

上面的代码获取文章的私有属性,然后尝试覆盖全局属性。

在调用之前,$model->getItem($id)我将全局文章属性提供给状态对象,其中包含以下行:

$appParams = JFactory::getApplication()->getParams();
$model->setState('params', $appParams);

现在它起作用了。

于 2012-03-21T17:44:09.233 回答