Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 62 additions & 44 deletions src/Commands/ExportForms.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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.
Expand All @@ -47,11 +49,9 @@ public function handle()
{
$this->usingDefaultRepositories(function () {
$this->exportForms();
$this->exportSubmissions();
});

$this->newLine();
$this->info('Forms exported');

return 0;
}

Expand All @@ -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?'));
}
}