183 lines
4.3 KiB
PHP
183 lines
4.3 KiB
PHP
<?php
|
|
/**
|
|
* @package akeebabackup
|
|
* @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
|
|
* @license GNU General Public License version 3, or later
|
|
*/
|
|
|
|
/** @noinspection PhpUnused */
|
|
|
|
defined('_JEXEC') || die;
|
|
|
|
use Akeeba\Component\AkeebaBackup\Administrator\Model\UpgradeModel;
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\Installer\Adapter\PackageAdapter;
|
|
use Joomla\CMS\Installer\InstallerAdapter;
|
|
use Joomla\Database\DatabaseDriver;
|
|
use Joomla\Database\DatabaseInterface;
|
|
|
|
/**
|
|
* Akeeba Backup package extension installation script file.
|
|
*
|
|
* @see https://docs.joomla.org/Manifest_files#Script_file
|
|
* @see UpgradeModel
|
|
*/
|
|
class Pkg_AkeebabackupInstallerScript extends \Joomla\CMS\Installer\InstallerScript
|
|
{
|
|
/**
|
|
* @var DatabaseDriver|DatabaseInterface|null
|
|
* @since 9.3.0
|
|
*/
|
|
protected $dbo;
|
|
|
|
protected $minimumPhp = '7.4.0';
|
|
|
|
protected $minimumJoomla = '4.2.0';
|
|
|
|
public function preflight($type, $parent)
|
|
{
|
|
if (!parent::preflight($type, $parent))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
$this->setDboFromAdapter($parent);
|
|
|
|
// Do not run on uninstall.
|
|
if ($type === 'uninstall')
|
|
{
|
|
return true;
|
|
}
|
|
|
|
define('AKEEBABACKUP_INSTALLATION_PRO', is_file($parent->getParent()->getPath('source') . '/com_akeebabackup-pro.zip'));
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Called after any type of installation / uninstallation action.
|
|
*
|
|
* @param string $type Which action is happening (install|uninstall|discover_install|update)
|
|
* @param PackageAdapter $parent The object responsible for running this script
|
|
*
|
|
* @return bool
|
|
* @since 9.0.0
|
|
*/
|
|
public function postflight(string $type, PackageAdapter $parent): bool
|
|
{
|
|
$this->setDboFromAdapter($parent);
|
|
|
|
// Do not run on uninstall.
|
|
if ($type === 'uninstall')
|
|
{
|
|
return true;
|
|
}
|
|
|
|
$model = $this->getUpgradeModel();
|
|
|
|
if (empty($model))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return $model->postflight($type, $parent);
|
|
}
|
|
|
|
/**
|
|
* Get the UpgradeModel of the installed component
|
|
*
|
|
* @return UpgradeModel|null The upgrade Model. NULL if it cannot be loaded.
|
|
* @since 9.0.0
|
|
*/
|
|
private function getUpgradeModel(): ?UpgradeModel
|
|
{
|
|
// Make sure the latest version of the Model file will be loaded, regardless of the OPcache state.
|
|
$filePath = JPATH_ADMINISTRATOR . '/components/com_akeebabackup/src/Model/UpgradeModel.php';
|
|
|
|
if (function_exists('opcache_invalidate'))
|
|
{
|
|
opcache_invalidate($filePath = JPATH_ADMINISTRATOR . '/components/com_akeebabackup/src/Model/UpgradeModel.php');
|
|
}
|
|
|
|
// Can I please load the model?
|
|
if (!class_exists('\Akeeba\Component\AkeebaBackup\Administrator\Model\UpgradeModel'))
|
|
{
|
|
if (!file_exists($filePath) || !is_readable($filePath))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
include_once $filePath;
|
|
}
|
|
|
|
if (!class_exists('\Akeeba\Component\AkeebaBackup\Administrator\Model\UpgradeModel'))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
try
|
|
{
|
|
$upgradeModel = new UpgradeModel();
|
|
}
|
|
catch (Throwable $e)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if (method_exists($upgradeModel, 'setDatabase'))
|
|
{
|
|
$upgradeModel->setDatabase($this->dbo ?? Factory::getContainer()->get('DatabaseDriver'));
|
|
}
|
|
elseif (method_exists($upgradeModel, 'setDbo'))
|
|
{
|
|
$upgradeModel->setDbo($this->dbo ?? Factory::getContainer()->get('DatabaseDriver'));
|
|
}
|
|
|
|
if (method_exists($upgradeModel, 'init'))
|
|
{
|
|
$upgradeModel->init();
|
|
}
|
|
|
|
return $upgradeModel;
|
|
}
|
|
|
|
/**
|
|
* Set the database object from the installation adapter, if possible
|
|
*
|
|
* @param InstallerAdapter|mixed $adapter The installation adapter, hopefully.
|
|
*
|
|
* @since 9.3.0
|
|
* @return void
|
|
*/
|
|
private function setDboFromAdapter($adapter): void
|
|
{
|
|
$this->dbo = null;
|
|
|
|
if (class_exists(InstallerAdapter::class) && ($adapter instanceof InstallerAdapter))
|
|
{
|
|
/**
|
|
* If this is Joomla 4.2+ the adapter has a protected getDatabase() method which we can access with the
|
|
* magic property $adapter->db. On Joomla 4.1 and lower this is not available. So, we have to first figure
|
|
* out if we can actually use the magic property...
|
|
*/
|
|
|
|
try
|
|
{
|
|
$refObj = new ReflectionObject($adapter);
|
|
|
|
if ($refObj->hasMethod('getDatabase'))
|
|
{
|
|
$this->dbo = $adapter->db;
|
|
|
|
return;
|
|
}
|
|
}
|
|
catch (Throwable $e)
|
|
{
|
|
// If something breaks we will fall through
|
|
}
|
|
}
|
|
|
|
$this->dbo = Factory::getContainer()->get('DatabaseDriver');
|
|
}
|
|
} |