8cfa46d985
Universal: PR Check / Wiki Update Reminder (pull_request) Has been skipped
Universal: PR Check / Require Docs Update (pull_request) Has been skipped
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Universal: PR Check / Secret Scan (pull_request) Successful in 7s
Generic: Project CI / Lint & Validate (pull_request) Successful in 12s
Universal: PR Check / Validate PR (pull_request) Failing after 13s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 49s
Generic: Project CI / Tests (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Replace the popup-modal pre-update approach with a dedicated full-page backup screen, modelled on Akeeba Backup-on-Update, and fix the white screen caused by running a backup synchronously inside the update request. - New view=runbackup (View/Runbackup + tmpl/runbackup): full-screen progress page that auto-starts the stepped backup (ajax.init -> loop ajax.step), then redirects to a validated returnurl on completion or shows a completion/retry panel. Auto-resolved by MVCFactory. - System plugin: on com_joomlaupdate task=update.install (when backup_before_update is on), redirect to the full-screen backup screen with returnurl back to update.install&is_backed_up=1; on return, arm the throttle so onExtensionBeforeUpdate does not run a duplicate backup. No synchronous backup in the update request. - Dashboard 'Backup Now' navigates to the full-screen screen instead of the inline modal; the inline modal + stepped JS are removed. - Retire the popup modal: delete media/js/update-backup.js, remove the plugin <media> element and the preupdate_auto_intercept param. - Dashboard: warn when Global Config live_site is empty (CLI/scheduled backup naming + URL generation depend on it). Refs #196 Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
90 lines
2.6 KiB
PHP
90 lines
2.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @package MokoSuiteBackup
|
|
* @subpackage com_mokosuitebackup
|
|
* @author Moko Consulting <hello@mokoconsulting.tech>
|
|
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
|
|
* @license GNU General Public License version 3 or later; see LICENSE
|
|
*/
|
|
|
|
namespace Joomla\Component\MokoSuiteBackup\Administrator\View\Runbackup;
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
|
use Joomla\CMS\Toolbar\ToolbarHelper;
|
|
|
|
/**
|
|
* Full-screen "run a backup" progress view.
|
|
*
|
|
* Auto-starts the stepped backup (ajax.init → loop ajax.step) and shows a
|
|
* full-page progress screen. Used both by the dashboard "Backup Now" action
|
|
* and — via the system plugin's pre-update redirect — as the interstitial
|
|
* between clicking Joomla's Update and the update actually running. When a
|
|
* `returnurl` is supplied the page redirects there once the backup completes
|
|
* (e.g. back to `com_joomlaupdate&task=update.install&is_backed_up=1`).
|
|
*/
|
|
class HtmlView extends BaseHtmlView
|
|
{
|
|
public int $profileId = 1;
|
|
|
|
public string $profileTitle = '';
|
|
|
|
public string $description = '';
|
|
|
|
/** Raw (possibly base64) return URL from the request; validated in the layout. */
|
|
public string $returnUrl = '';
|
|
|
|
public bool $autostart = true;
|
|
|
|
public function display($tpl = null): void
|
|
{
|
|
$input = Factory::getApplication()->getInput();
|
|
|
|
$this->profileId = (int) $input->getInt('profile_id', $input->getInt('profileid', 1));
|
|
$this->description = $input->getString('description', '');
|
|
$this->returnUrl = $input->getRaw('returnurl', '');
|
|
$this->autostart = (bool) $input->getInt('autostart', 1);
|
|
|
|
if ($this->profileId <= 0) {
|
|
$this->profileId = 1;
|
|
}
|
|
|
|
$this->profileTitle = $this->loadProfileTitle($this->profileId);
|
|
|
|
$this->addToolbar();
|
|
|
|
parent::display($tpl);
|
|
}
|
|
|
|
/**
|
|
* Look up the target profile's title for display (best-effort).
|
|
*/
|
|
private function loadProfileTitle(int $profileId): string
|
|
{
|
|
try {
|
|
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
|
|
$query = $db->getQuery(true)
|
|
->select($db->quoteName('title'))
|
|
->from($db->quoteName('#__mokosuitebackup_profiles'))
|
|
->where($db->quoteName('id') . ' = ' . (int) $profileId);
|
|
$db->setQuery($query);
|
|
|
|
return (string) ($db->loadResult() ?? '');
|
|
} catch (\Throwable $e) {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
protected function addToolbar(): void
|
|
{
|
|
ToolbarHelper::title(
|
|
Text::_('COM_MOKOJOOMBACKUP_SHORT') . ': ' . Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_TITLE'),
|
|
'archive'
|
|
);
|
|
}
|
|
}
|