From 3ebc6eb8a379198a24f8a992a70877e6b62bc57d Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Fri, 19 Sep 2025 20:54:55 +0100 Subject: [PATCH] Rework form exports command to not require eloquent repo to be enabled --- src/Commands/ExportForms.php | 106 ++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 44 deletions(-) diff --git a/src/Commands/ExportForms.php b/src/Commands/ExportForms.php index 7650efa4..e5ac6359 100644 --- a/src/Commands/ExportForms.php +++ b/src/Commands/ExportForms.php @@ -10,15 +10,14 @@ use Statamic\Contracts\Forms\FormRepository as FormRepositoryContract; use Statamic\Contracts\Forms\Submission as SubmissionContract; use Statamic\Contracts\Forms\SubmissionRepository as SubmissionRepositoryContract; -use Statamic\Eloquent\Forms\Form; -use Statamic\Eloquent\Forms\FormRepository; -use Statamic\Eloquent\Forms\Submission; -use Statamic\Eloquent\Forms\SubmissionRepository; +use Statamic\Eloquent\Forms\FormModel; +use Statamic\Eloquent\Forms\SubmissionModel; +use Statamic\Facades\Form; +use Statamic\Facades\FormSubmission; use Statamic\Forms\Form as StacheForm; use Statamic\Forms\FormRepository as StacheFormRepository; use Statamic\Forms\Submission as StacheSubmission; use Statamic\Stache\Repositories\SubmissionRepository as StacheSubmissionRepository; -use Statamic\Statamic; class ExportForms extends Command { @@ -29,14 +28,17 @@ class ExportForms extends Command * * @var string */ - protected $signature = 'statamic:eloquent:export-forms'; + protected $signature = 'statamic:eloquent:export-forms + {--force : Force the export to run, with all prompts answered "yes"} + {--only-forms : Only export forms} + {--only-submissions : Only export submissions}'; /** * The console command description. * * @var string */ - protected $description = 'Export eloquent based forms to flat files.'; + protected $description = 'Export eloquent based forms and submissions to flat files.'; /** * Execute the console command. @@ -47,11 +49,9 @@ public function handle() { $this->usingDefaultRepositories(function () { $this->exportForms(); + $this->exportSubmissions(); }); - $this->newLine(); - $this->info('Forms exported'); - return 0; } @@ -62,57 +62,75 @@ private function usingDefaultRepositories(Closure $callback) Facade::clearResolvedInstance(SubmissionContract::class); Facade::clearResolvedInstance(SubmissionRepositoryContract::class); - app()->bind(FormContract::class, Form::class); - app()->bind(FormRepositoryContract::class, FormRepository::class); - app()->bind(SubmissionContract::class, Submission::class); - app()->bind(SubmissionRepositoryContract::class, SubmissionRepository::class); - app()->bind(\Statamic\Contracts\Forms\SubmissionQueryBuilder::class, \Statamic\Eloquent\Forms\SubmissionQueryBuilder::class); + app()->bind(FormContract::class, StacheForm::class); + app()->bind(FormRepositoryContract::class, StacheFormRepository::class); + app()->bind(SubmissionContract::class, StacheSubmission::class); + app()->bind(SubmissionRepositoryContract::class, StacheSubmissionRepository::class); $callback(); } private function exportForms() { - $forms = (new FormRepository)->all(); + if (! $this->shouldExportForms()) { + return; + } - app()->bind(FormContract::class, StacheForm::class); + $forms = FormModel::all(); $this->withProgressBar($forms, function ($form) { - $newForm = (new StacheForm) - ->handle($form->handle()) - ->title($form->title()) - ->store($form->store()) - ->email($form->email()) - ->honeypot($form->honeypot()); - - Statamic::repository(FormRepositoryContract::class, StacheFormRepository::class); - Facade::clearResolvedInstance(SubmissionRepositoryContract::class); - - $newForm->save(); + Form::make() + ->handle($form->handle) + ->title($form->title) + ->store($form->settings['store'] ?? null) + ->email($form->settings['email'] ?? null) + ->honeypot($form->settings['honeypot'] ?? null) + ->data($form->settings['data'] ?? []) + ->save(); + }); - Statamic::repository(FormRepositoryContract::class, FormRepository::class); - Facade::clearResolvedInstance(SubmissionRepositoryContract::class); + $this->newLine(); + $this->info('Forms exported'); + } - $form->submissions()->each(function ($submission) use ($newForm) { - $id = $submission->date()->getPreciseTimestamp(4); - $id = substr($id, 0, -4).'.'.substr($id, -4); + private function exportSubmissions() + { + if (! $this->shouldExportSubmissions()) { + return; + } - $newSubmission = (new StacheSubmission) - ->id($id) - ->form($newForm) - ->data($submission->data()); + $submissions = SubmissionModel::all(); - Statamic::repository(SubmissionRepositoryContract::class, StacheSubmissionRepository::class); - Facade::clearResolvedInstance(SubmissionRepositoryContract::class); + $this->withProgressBar($submissions, function ($submission) { + if (! $form = Form::find($submission->form)) { + return; + } - $newSubmission->save(); + $id = $submission->created_at->getPreciseTimestamp(4); + $id = substr($id, 0, -4).'.'.substr($id, -4); - Statamic::repository(SubmissionRepositoryContract::class, SubmissionRepository::class); - Facade::clearResolvedInstance(SubmissionRepositoryContract::class); - }); + FormSubmission::make() + ->id($id) + ->form($form) + ->data($submission->data) + ->save(); }); $this->newLine(); - $this->info('Forms exported'); + $this->info('Submissions exported'); + } + + private function shouldExportForms(): bool + { + return $this->option('only-forms') + || ! $this->option('only-submissions') + && ($this->option('force') || $this->confirm('Do you want to export forms?')); + } + + private function shouldExportSubmissions(): bool + { + return $this->option('only-submissions') + || ! $this->option('only-forms') + && ($this->option('force') || $this->confirm('Do you want to export submissions?')); } }