From 5a672454ade13a8b64cad8bdc99253790ac35447 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Mon, 22 Jun 2026 09:27:14 -0500 Subject: [PATCH] feat: scheduled task for automated content snapshots (#56) Add mokosuitebackup.snapshot task type for com_scheduler with params for content_types and description_format ([date]/[datetime] placeholders). Closes #56 --- .../forms/run_snapshot.xml | 16 ++++++ .../src/Extension/MokoSuiteBackupTask.php | 52 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 source/packages/plg_task_mokosuitebackup/forms/run_snapshot.xml diff --git a/source/packages/plg_task_mokosuitebackup/forms/run_snapshot.xml b/source/packages/plg_task_mokosuitebackup/forms/run_snapshot.xml new file mode 100644 index 00000000..e3e0dc73 --- /dev/null +++ b/source/packages/plg_task_mokosuitebackup/forms/run_snapshot.xml @@ -0,0 +1,16 @@ + + +
+
+ + + + + + +
+
diff --git a/source/packages/plg_task_mokosuitebackup/src/Extension/MokoSuiteBackupTask.php b/source/packages/plg_task_mokosuitebackup/src/Extension/MokoSuiteBackupTask.php index 4a0e020c..25421484 100644 --- a/source/packages/plg_task_mokosuitebackup/src/Extension/MokoSuiteBackupTask.php +++ b/source/packages/plg_task_mokosuitebackup/src/Extension/MokoSuiteBackupTask.php @@ -43,6 +43,11 @@ final class MokoSuiteBackupTask extends CMSPlugin implements SubscriberInterface 'method' => 'runBackupProfile', 'form' => 'run_profile', ], + 'mokosuitebackup.snapshot' => [ + 'langConstPrefix' => 'PLG_TASK_MOKOJOOMBACKUP_TASK_RUN_SNAPSHOT', + 'method' => 'runContentSnapshot', + 'form' => 'run_snapshot', + ], ]; public static function getSubscribedEvents(): array @@ -93,4 +98,51 @@ final class MokoSuiteBackupTask extends CMSPlugin implements SubscriberInterface return Status::KNOCKOUT; } + + /** + * Create a content snapshot using the configured content types. + * + * @param ExecuteTaskEvent $event The task execution event + * + * @return int Status::OK on success, Status::KNOCKOUT on failure + */ + private function runContentSnapshot(ExecuteTaskEvent $event): int + { + $params = $event->getArgument('params'); + $contentTypes = (array) ($params->content_types ?? ['articles', 'categories', 'modules']); + $descFormat = (string) ($params->description_format ?? '[date] Scheduled snapshot'); + + // Resolve placeholders in the description + $description = str_replace( + ['[date]', '[datetime]'], + [date('Y-m-d'), date('Y-m-d H:i:s')], + $descFormat + ); + + // Load the snapshot engine from the component + $engineFile = JPATH_ADMINISTRATOR . '/components/com_mokosuitebackup/src/Engine/SnapshotEngine.php'; + + if (!file_exists($engineFile)) { + $this->logTask('MokoSuiteBackup component not installed — cannot create snapshot.'); + + return Status::KNOCKOUT; + } + + if (!class_exists('\\Joomla\\Component\\MokoSuiteBackup\\Administrator\\Engine\\SnapshotEngine')) { + require_once $engineFile; + } + + $engine = new \Joomla\Component\MokoSuiteBackup\Administrator\Engine\SnapshotEngine(); + $result = $engine->create($contentTypes, $description); + + if ($result['success']) { + $this->logTask('Snapshot complete: ' . $result['message']); + + return Status::OK; + } + + $this->logTask('Snapshot failed: ' . $result['message']); + + return Status::KNOCKOUT; + } }