我正在尝试编写一个自动将站点升级到当前版本的 Joomla CLI 脚本。在 Joomla 中,这似乎是通过 *com_joomlaupdate* 完成的。这个想法是能够从管理前端升级服务器上的任何 Joomla 站点。
我编写了以下内容进行测试,试图通过直接访问其模型中的方法来模仿 com_joomlaupdate 中的控制器。我不熟悉 joomla 框架,所以我可能会在这里做一些愚蠢的事情。
<?php
const _JEXEC = 1;
error_reporting(E_ALL | E_NOTICE);
ini_set('display_errors', 1);
define('JPATH_BASE', dirname(__DIR__));
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_LIBRARIES . '/import.legacy.php';
require_once JPATH_LIBRARIES . '/cms.php';
// Load the configuration
require_once JPATH_CONFIGURATION . '/configuration.php';
define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR . '/components/com_joomlaupdate');
require_once JPATH_COMPONENT_ADMINISTRATOR . '/models/default.php';
class Upgradejoomla extends JApplicationCli
{
public function doExecute()
{
$app = JFactory::getApplication('administrator');
$app->initialise();
$app->input->set('method', 'direct');
$this->out('Fetching updates...');
$updater = JModelLegacy::getInstance('JoomlaupdateModelDefault');
$updater->refreshUpdates();
$updater->applyUpdateSite();
$basename = $updater->download();
$app->setUserState('com_joomlaupdate.file', $basename);
$updater->createRestorationFile($basename);
echo ($updater->finaliseUpgrade());
$updater->cleanUp();
}
}
JApplicationCli::getInstance('Upgradejoomla')->execute();
download()
工作正常,我确实得到了最新的文件,并将其放在tmp目录中。createRestorationFile()
似乎也可以工作,我在 com_joomlaupdate 目录中得到了一个restore.php文件。
问题似乎与finaliseUpgrade()
. 它调用setupInstall()
安装程序,尝试查找清单文件。我想我缺少的(除其他外)是该文件(或更新的全部内容)在某处解压缩的步骤。问题是我在 com_joomlaupdate 中找不到任何代码?
我试图在/tmp中手动解压缩更新文件。当我这样做时,finaliseUpgrade()
实际上返回 true,但该站点仍保持其旧版本。