2026-06-02 13:47:36 -05:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @package MokoJoomBackup
|
2026-06-06 14:52:27 -05:00
|
|
|
* @subpackage com_mokojoombackup
|
2026-06-02 13:47:36 -05:00
|
|
|
* @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
|
|
|
|
|
*/
|
|
|
|
|
|
2026-06-06 14:52:27 -05:00
|
|
|
namespace Joomla\Component\MokoJoomBackup\Administrator\View\Backups;
|
2026-06-02 13:47:36 -05:00
|
|
|
|
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
|
|
2026-06-02 15:40:03 -05:00
|
|
|
use Joomla\CMS\Factory;
|
2026-06-02 13:47:36 -05:00
|
|
|
use Joomla\CMS\Language\Text;
|
|
|
|
|
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
2026-06-04 08:01:05 -05:00
|
|
|
use Joomla\CMS\Router\Route;
|
2026-06-02 13:47:36 -05:00
|
|
|
use Joomla\CMS\Toolbar\ToolbarHelper;
|
|
|
|
|
|
|
|
|
|
class HtmlView extends BaseHtmlView
|
|
|
|
|
{
|
|
|
|
|
protected $items;
|
|
|
|
|
protected $pagination;
|
|
|
|
|
protected $state;
|
|
|
|
|
public $filterForm;
|
|
|
|
|
public $activeFilters = [];
|
2026-06-02 15:40:03 -05:00
|
|
|
public $profiles = [];
|
2026-06-02 13:47:36 -05:00
|
|
|
|
|
|
|
|
public function display($tpl = null): void
|
|
|
|
|
{
|
|
|
|
|
$this->items = $this->get('Items');
|
|
|
|
|
$this->pagination = $this->get('Pagination');
|
|
|
|
|
$this->state = $this->get('State');
|
|
|
|
|
$this->filterForm = $this->get('FilterForm');
|
|
|
|
|
$this->activeFilters = $this->get('ActiveFilters');
|
|
|
|
|
|
2026-06-02 15:40:03 -05:00
|
|
|
// Load published profiles for the backup selector
|
|
|
|
|
$db = Factory::getDbo();
|
|
|
|
|
$query = $db->getQuery(true)
|
|
|
|
|
->select($db->quoteName(['id', 'title', 'backup_type']))
|
2026-06-06 14:52:27 -05:00
|
|
|
->from($db->quoteName('#__mokojoombackup_profiles'))
|
2026-06-02 15:40:03 -05:00
|
|
|
->where($db->quoteName('published') . ' = 1')
|
|
|
|
|
->order($db->quoteName('ordering') . ' ASC');
|
|
|
|
|
$db->setQuery($query);
|
|
|
|
|
$this->profiles = $db->loadObjectList() ?: [];
|
|
|
|
|
|
2026-06-04 08:01:05 -05:00
|
|
|
$this->checkUpdateSite();
|
2026-06-02 13:47:36 -05:00
|
|
|
$this->addToolbar();
|
|
|
|
|
|
|
|
|
|
parent::display($tpl);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-04 08:01:05 -05:00
|
|
|
/**
|
|
|
|
|
* Show an info notice linking to the update site record so the user
|
|
|
|
|
* can configure their download key for automatic updates.
|
|
|
|
|
*/
|
|
|
|
|
protected function checkUpdateSite(): void
|
|
|
|
|
{
|
2026-06-04 08:15:31 -05:00
|
|
|
try {
|
|
|
|
|
$db = Factory::getDbo();
|
2026-06-04 08:01:05 -05:00
|
|
|
|
2026-06-06 16:38:25 -05:00
|
|
|
// Find the update site linked to pkg_mokojoombackup
|
2026-06-04 08:15:31 -05:00
|
|
|
$query = $db->getQuery(true)
|
2026-06-06 16:38:25 -05:00
|
|
|
->select([
|
|
|
|
|
$db->quoteName('us.update_site_id'),
|
|
|
|
|
$db->quoteName('us.extra_query'),
|
|
|
|
|
])
|
2026-06-04 08:15:31 -05:00
|
|
|
->from($db->quoteName('#__update_sites', 'us'))
|
|
|
|
|
->join(
|
|
|
|
|
'INNER',
|
|
|
|
|
$db->quoteName('#__update_sites_extensions', 'use')
|
|
|
|
|
. ' ON ' . $db->quoteName('use.update_site_id') . ' = ' . $db->quoteName('us.update_site_id')
|
|
|
|
|
)
|
|
|
|
|
->join(
|
|
|
|
|
'INNER',
|
|
|
|
|
$db->quoteName('#__extensions', 'e')
|
|
|
|
|
. ' ON ' . $db->quoteName('e.extension_id') . ' = ' . $db->quoteName('use.extension_id')
|
|
|
|
|
)
|
2026-06-06 14:52:27 -05:00
|
|
|
->where($db->quoteName('e.element') . ' = ' . $db->quote('pkg_mokojoombackup'))
|
2026-06-04 08:15:31 -05:00
|
|
|
->where($db->quoteName('e.type') . ' = ' . $db->quote('package'))
|
|
|
|
|
->setLimit(1);
|
2026-06-04 08:01:05 -05:00
|
|
|
|
2026-06-04 08:15:31 -05:00
|
|
|
$db->setQuery($query);
|
2026-06-06 16:38:25 -05:00
|
|
|
$site = $db->loadObject();
|
2026-06-04 08:01:05 -05:00
|
|
|
|
2026-06-06 16:38:25 -05:00
|
|
|
if (!$site) {
|
|
|
|
|
Factory::getApplication()->enqueueMessage(
|
|
|
|
|
Text::_('COM_MOKOJOOMBACKUP_UPDATE_SITE_MISSING'),
|
|
|
|
|
'warning'
|
|
|
|
|
);
|
|
|
|
|
} elseif (empty($site->extra_query) || strpos($site->extra_query, 'dlid=') === false) {
|
|
|
|
|
// Update site exists but no download key configured
|
2026-06-04 08:15:31 -05:00
|
|
|
$editUrl = Route::_(
|
2026-06-06 16:38:25 -05:00
|
|
|
'index.php?option=com_installer&view=updatesites&filter[search]=mokojoombackup'
|
2026-06-04 08:15:31 -05:00
|
|
|
);
|
2026-06-04 08:01:05 -05:00
|
|
|
|
2026-06-04 08:15:31 -05:00
|
|
|
Factory::getApplication()->enqueueMessage(
|
2026-06-06 14:52:27 -05:00
|
|
|
Text::sprintf('COM_MOKOJOOMBACKUP_UPDATE_SITE_NOTICE', $editUrl),
|
2026-06-04 08:15:31 -05:00
|
|
|
'info'
|
|
|
|
|
);
|
|
|
|
|
}
|
2026-06-06 16:38:25 -05:00
|
|
|
// If key is present, show nothing — all good
|
2026-06-04 08:15:31 -05:00
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
// Non-critical — silently ignore
|
2026-06-04 08:01:05 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-02 13:47:36 -05:00
|
|
|
protected function addToolbar(): void
|
|
|
|
|
{
|
2026-06-06 14:52:27 -05:00
|
|
|
ToolbarHelper::title(Text::_('COM_MOKOJOOMBACKUP_BACKUPS_TITLE'), 'database');
|
|
|
|
|
ToolbarHelper::custom('backups.start', 'download', '', 'COM_MOKOJOOMBACKUP_TOOLBAR_BACKUP_NOW', false);
|
|
|
|
|
ToolbarHelper::custom('backups.restore', 'upload', '', 'COM_MOKOJOOMBACKUP_TOOLBAR_RESTORE', true);
|
|
|
|
|
ToolbarHelper::custom('backups.verify', 'shield', '', 'COM_MOKOJOOMBACKUP_TOOLBAR_VERIFY', true);
|
2026-06-02 13:47:36 -05:00
|
|
|
ToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'backups.delete');
|
2026-06-06 14:52:27 -05:00
|
|
|
ToolbarHelper::preferences('com_mokojoombackup');
|
2026-06-02 13:47:36 -05:00
|
|
|
}
|
|
|
|
|
}
|