Skip to content

Commit 679be6b

Browse files
authored
Add export console commands to support moving back to stache (#157)
1 parent 47c9870 commit 679be6b

12 files changed

+1028
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ composer.lock
22
vendor
33
.phpunit.result.cache
44
.php_cs.cache
5+
.nova/*

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ We have provided imports from file based content for each repository, which can
5757
- Revisions: `php please eloquent:import-revisions`
5858
- Taxonomies: `php please eloquent:import-taxonomies`
5959

60+
## Exporting back to file based content
61+
62+
We have provided exports from eloquent to file based content for each repository, which can be run as follows:
63+
64+
- Assets: `php please eloquent:export-assets`
65+
- Blueprints and Fieldsets: `php please eloquent:export-blueprints`
66+
- Collections: `php please eloquent:export-collections`
67+
- Entries: `php please eloquent:export-entries`
68+
- Forms: `php please eloquent:export-forms`
69+
- Globals: `php please eloquent:export-globals`
70+
- Navs: `php please eloquent:export-navs`
71+
- Revisions: `php please eloquent:export-revisions`
72+
- Taxonomies: `php please eloquent:export-taxonomies`
73+
6074
## Storing Users in a Database
6175

6276
Statamic has a [built-in users eloquent driver](https://statamic.dev/tips/storing-users-in-a-database) if you'd like to cross that bridge too.

src/Commands/ExportAssets.php

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
namespace Statamic\Eloquent\Commands;
4+
5+
use Closure;
6+
use Illuminate\Console\Command;
7+
use Illuminate\Support\Facades\Facade;
8+
use Illuminate\Support\Str;
9+
use Statamic\Assets\Asset;
10+
use Statamic\Assets\AssetContainer;
11+
use Statamic\Assets\AssetRepository;
12+
use Statamic\Console\RunsInPlease;
13+
use Statamic\Contracts\Assets\Asset as AssetContract;
14+
use Statamic\Contracts\Assets\AssetContainer as AssetContainerContract;
15+
use Statamic\Contracts\Assets\AssetContainerRepository as AssetContainerRepositoryContract;
16+
use Statamic\Contracts\Assets\AssetRepository as AssetRepositoryContract;
17+
use Statamic\Eloquent\Assets\AssetContainerModel;
18+
use Statamic\Eloquent\Assets\AssetModel;
19+
use Statamic\Facades\Asset as AssetFacade;
20+
use Statamic\Facades\AssetContainer as AssetContainerFacade;
21+
use Statamic\Stache\Repositories\AssetContainerRepository;
22+
use Statamic\Statamic;
23+
24+
class ExportAssets extends Command
25+
{
26+
use RunsInPlease;
27+
28+
/**
29+
* The name and signature of the console command.
30+
*
31+
* @var string
32+
*/
33+
protected $signature = 'statamic:eloquent:export-assets';
34+
35+
/**
36+
* The console command description.
37+
*
38+
* @var string
39+
*/
40+
protected $description = 'Exports eloquent asset containers and assets to file based.';
41+
42+
/**
43+
* Execute the console command.
44+
*
45+
* @return int
46+
*/
47+
public function handle()
48+
{
49+
$this->usingDefaultRepositories(function () {
50+
$this->exportAssetContainers();
51+
$this->exportAssets();
52+
});
53+
54+
return 0;
55+
}
56+
57+
private function usingDefaultRepositories(Closure $callback)
58+
{
59+
Facade::clearResolvedInstance(AssetContainerRepositoryContract::class);
60+
Facade::clearResolvedInstance(AssetRepositoryContract::class);
61+
62+
Statamic::repository(AssetContainerRepositoryContract::class, AssetContainerRepository::class);
63+
Statamic::repository(AssetRepositoryContract::class, AssetRepository::class);
64+
65+
app()->bind(AssetContainerContract::class, AssetContainer::class);
66+
app()->bind(AssetContract::class, Asset::class);
67+
68+
$callback();
69+
}
70+
71+
private function exportAssetContainers()
72+
{
73+
if (! $this->confirm('Do you want to export asset containers?')) {
74+
return;
75+
}
76+
77+
$containers = AssetContainerModel::all();
78+
79+
$this->withProgressBar($containers, function ($model) {
80+
AssetContainerFacade::make()
81+
->title($model->title)
82+
->handle($model->handle)
83+
->disk($model->disk ?? config('filesystems.default'))
84+
->allowUploads($model->settings['allow_uploads'] ?? null)
85+
->allowDownloading($model->settings['allow_downloading'] ?? null)
86+
->allowMoving($model->settings['allow_moving'] ?? null)
87+
->allowRenaming($model->settings['allow_renaming'] ?? null)
88+
->createFolders($model->settings['create_folders'] ?? null)
89+
->searchIndex($model->settings['search_index'] ?? null)
90+
->save();
91+
});
92+
93+
$this->newLine();
94+
$this->info('Asset containers imported');
95+
}
96+
97+
private function exportAssets()
98+
{
99+
if (! $this->confirm('Do you want to export assets?')) {
100+
return;
101+
}
102+
103+
$assets = AssetModel::all();
104+
105+
$this->withProgressBar($assets, function ($model) {
106+
$container = Str::before($model->handle, '::');
107+
$path = Str::after($model->handle, '::');
108+
109+
AssetFacade::make()
110+
->container($container)
111+
->path($path)
112+
->writeMeta($model->data);
113+
});
114+
115+
$this->newLine();
116+
$this->info('Assets imported');
117+
}
118+
}

src/Commands/ExportBlueprints.php

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?php
2+
3+
namespace Statamic\Eloquent\Commands;
4+
5+
use Closure;
6+
use Illuminate\Console\Command;
7+
use Illuminate\Support\Facades\Facade;
8+
use Statamic\Console\RunsInPlease;
9+
use Statamic\Eloquent\Fields\BlueprintModel;
10+
use Statamic\Eloquent\Fields\FieldsetModel;
11+
use Statamic\Fields\Blueprint as StacheBlueprint;
12+
use Statamic\Fields\Fieldset as StacheFieldset;
13+
use Statamic\Support\Arr;
14+
15+
class ExportBlueprints extends Command
16+
{
17+
use RunsInPlease;
18+
19+
/**
20+
* The name and signature of the console command.
21+
*
22+
* @var string
23+
*/
24+
protected $signature = 'statamic:eloquent:export-blueprints';
25+
26+
/**
27+
* The console command description.
28+
*
29+
* @var string
30+
*/
31+
protected $description = 'Export eloquent based blueprints and fieldsets to flat files.';
32+
33+
/**
34+
* Execute the console command.
35+
*
36+
* @return int
37+
*/
38+
public function handle()
39+
{
40+
$this->usingDefaultRepositories(function () {
41+
$this->exportBlueprints();
42+
$this->exportFieldsets();
43+
});
44+
45+
return 0;
46+
}
47+
48+
private function usingDefaultRepositories(Closure $callback)
49+
{
50+
Facade::clearResolvedInstance(\Statamic\Fields\BlueprintRepository::class);
51+
Facade::clearResolvedInstance(\Statamic\Fields\FieldsetRepository::class);
52+
53+
app()->bind(\Statamic\Fields\BlueprintRepository::class, function () {
54+
return (new \Statamic\Fields\BlueprintRepository)
55+
->setDirectory(resource_path('blueprints'));
56+
});
57+
58+
app()->singleton(\Statamic\Fields\FieldsetRepository::class, function () {
59+
return (new \Statamic\Fields\FieldsetRepository)
60+
->setDirectory(resource_path('fieldsets'));
61+
});
62+
63+
$callback();
64+
}
65+
66+
private function exportBlueprints()
67+
{
68+
$this->withProgressBar(BlueprintModel::all(), function ($model) {
69+
if (! $model->namespace) {
70+
return;
71+
}
72+
73+
(new StacheBlueprint())
74+
->setHandle($model->handle)
75+
->setHidden(Arr::get($model->data, 'hide'))
76+
->setOrder(Arr::get($model->data, 'order'))
77+
->setNamespace($model->namespace)
78+
->setContents($this->updateOrderFromBlueprintSections($model->data))
79+
->save();
80+
});
81+
82+
$this->newLine();
83+
$this->info('Blueprints exported');
84+
}
85+
86+
private function exportFieldsets()
87+
{
88+
$this->withProgressBar(FieldsetModel::all(), function ($model) {
89+
if (! $model->handle) {
90+
return;
91+
}
92+
93+
(new StacheFieldset($model->handle))
94+
->setContents($model->data)
95+
->save();
96+
});
97+
98+
$this->newLine();
99+
$this->info('Fieldsets exported');
100+
}
101+
102+
private function updateOrderFromBlueprintSections($contents)
103+
{
104+
$contents['tabs'] = collect($contents['tabs'] ?? [])
105+
->sortBy('__count')
106+
->map(function ($tab) {
107+
unset($tab['__count']);
108+
109+
if (isset($tab['sections']) && is_array($tab['sections'])) {
110+
$tab['sections'] = collect($tab['sections'])
111+
->sortBy('__count')
112+
->map(function ($section) use (&$sectionCount) {
113+
unset($section['__count']);
114+
115+
return $section;
116+
})
117+
->toArray();
118+
}
119+
120+
return $tab;
121+
})
122+
->toArray();
123+
124+
return $contents;
125+
}
126+
}

0 commit comments

Comments
 (0)