サイトを現在のバージョンに自動的にアップグレードする 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ディレクトリに配置します。com_joomlaupdateディレクトリ内にrestore.phpファイルをcreateRestorationFile()
取得します。
問題は にあるようfinaliseUpgrade()
です。setupInstall()
マニフェスト ファイルを検索しようとするインストーラーを呼び出します。私が(とりわけ)見逃しているのは、そのファイル(またはアップデートの内容全体)がどこかに解凍されるステップだと思います。問題は、com_joomlaupdate でそれを行うコードが見つからないことですか?
/tmp内の更新ファイルを手動で解凍しようとしました。これを行うと、finaliseUpgrade()
実際には true が返されますが、サイトはまだ古いバージョンのままです。