diff --git a/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php b/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php index 71f33ae..2868376 100644 --- a/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php +++ b/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php @@ -15,8 +15,10 @@ namespace Joomla\Component\MokoSuiteBackup\Administrator\Controller; defined('_JEXEC') or die; +use Joomla\CMS\Factory; use Joomla\CMS\MVC\Controller\BaseController; use Joomla\CMS\Session\Session; +use Joomla\Component\MokoSuiteBackup\Administrator\Engine\PlaceholderResolver; use Joomla\Component\MokoSuiteBackup\Administrator\Engine\SteppedBackupEngine; use Joomla\Component\MokoSuiteBackup\Administrator\Engine\SteppedRestoreEngine; use Joomla\Component\MokoSuiteBackup\Administrator\Utility\BackupDirectory; @@ -283,7 +285,32 @@ class AjaxController extends BaseController return; } - $resolved = BackupDirectory::resolve($rawPath); + /* Resolve all placeholders — both directory ([HOME], [DEFAULT_DIR]) + and name-level ([site_name], [host], [profile_id], etc.) */ + $profileId = $this->input->getInt('profile_id', 0); + + if ($profileId > 0) { + $db = Factory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->quoteName('#__mokosuitebackup_profiles')) + ->where($db->quoteName('id') . ' = ' . $profileId); + $db->setQuery($query); + $profile = $db->loadObject(); + } + + if (empty($profile)) { + /* No profile context — create a minimal dummy for PlaceholderResolver */ + $profile = (object) [ + 'id' => 1, + 'title' => 'default', + 'backup_type' => 'full', + ]; + } + + $resolver = new PlaceholderResolver($profile); + $withNamePlaceholders = $resolver->resolve($rawPath); + $resolved = BackupDirectory::resolve($withNamePlaceholders); if (BackupDirectory::hasPlaceholders($resolved)) { $this->sendJson([