Skip to content

Commit 58c1e9f

Browse files
authored
Split globals and global variables, provide eloquent global variable repository (#178)
1 parent 17681a1 commit 58c1e9f

File tree

8 files changed

+122
-30
lines changed

8 files changed

+122
-30
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
},
2525
"require": {
2626
"php": "^8.0",
27-
"statamic/cms": "^4.6.0"
27+
"statamic/cms": "^4.16"
2828
},
2929
"require-dev": {
3030
"doctrine/dbal": "^3.3",

config/eloquent-driver.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,13 @@
4747
],
4848

4949
'global_sets' => [
50-
'driver' => 'eloquent',
51-
'model' => \Statamic\Eloquent\Globals\GlobalSetModel::class,
52-
'variables_model' => \Statamic\Eloquent\Globals\VariablesModel::class,
50+
'driver' => 'eloquent',
51+
'model' => \Statamic\Eloquent\Globals\GlobalSetModel::class,
52+
],
53+
54+
'global_set_variables' => [
55+
'driver' => 'eloquent',
56+
'model' => \Statamic\Eloquent\Globals\VariablesModel::class,
5357
],
5458

5559
'navigations' => [

src/Globals/GlobalRepository.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Statamic\Eloquent\Globals;
44

55
use Statamic\Contracts\Globals\GlobalSet as GlobalSetContract;
6-
use Statamic\Contracts\Globals\Variables as VariablesContract;
76
use Statamic\Facades\Blink;
87
use Statamic\Globals\GlobalCollection;
98
use Statamic\Stache\Repositories\GlobalRepository as StacheRepository;
@@ -69,7 +68,6 @@ public static function bindings(): array
6968
{
7069
return [
7170
GlobalSetContract::class => GlobalSet::class,
72-
VariablesContract::class => Variables::class,
7371
];
7472
}
7573
}

src/Globals/GlobalSet.php

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Statamic\Eloquent\Globals;
44

55
use Statamic\Contracts\Globals\GlobalSet as Contract;
6-
use Statamic\Contracts\Globals\Variables as VariablesContract;
76
use Statamic\Eloquent\Globals\GlobalSetModel as Model;
87
use Statamic\Globals\GlobalSet as FileEntry;
98

@@ -18,13 +17,6 @@ public static function fromModel(Model $model)
1817
->title($model->title)
1918
->model($model);
2019

21-
$variablesModel = app('statamic.eloquent.global_sets.variables_model');
22-
23-
$localizations = $variablesModel::query()->where('handle', $model->handle)->get();
24-
foreach ($localizations as $localization) {
25-
$global->addLocalization(app(VariablesContract::class)::fromModel($localization));
26-
}
27-
2820
return $global;
2921
}
3022

@@ -37,23 +29,12 @@ public static function makeModelFromContract(Contract $source)
3729
{
3830
$class = app('statamic.eloquent.global_sets.model');
3931

40-
$source->localizations()->each(function ($value) {
41-
Variables::makeModelFromContract($value);
42-
});
43-
4432
return $class::firstOrNew(['handle' => $source->handle()])->fill([
4533
'title' => $source->title(),
4634
'settings' => [], // future proofing
4735
]);
4836
}
4937

50-
public function makeLocalization($site)
51-
{
52-
return app(VariablesContract::class)
53-
->globalSet($this)
54-
->locale($site);
55-
}
56-
5738
public function model($model = null)
5839
{
5940
if (func_num_args() === 0) {
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace Statamic\Eloquent\Globals;
4+
5+
use Statamic\Contracts\Globals\Variables;
6+
use Statamic\Globals\VariablesCollection;
7+
use Statamic\Stache\Repositories\GlobalVariablesRepository as StacheRepository;
8+
use Statamic\Support\Str;
9+
10+
class GlobalVariablesRepository extends StacheRepository
11+
{
12+
public function all(): VariablesCollection
13+
{
14+
return VariablesCollection::make(
15+
VariablesModel::all()
16+
->each(function ($model) {
17+
return app(Variables::class)::fromModel($model);
18+
})
19+
);
20+
}
21+
22+
public function find($id): ?Variables
23+
{
24+
$id = Str::split($id, '::');
25+
26+
$model = VariablesModel::query()
27+
->where('handle', $id[0])
28+
->when(count($id) > 1, function ($query) use ($id) {
29+
$query->where('locale', $id[1]);
30+
})
31+
->first();
32+
33+
if (! $model) {
34+
return null;
35+
}
36+
37+
return app(Variables::class)::fromModel($model);
38+
}
39+
40+
public function whereSet($handle): VariablesCollection
41+
{
42+
return VariablesCollection::make(
43+
VariablesModel::query()
44+
->where('handle', $handle)
45+
->get()
46+
->map(function ($model) {
47+
return app(Variables::class)::fromModel($model);
48+
})
49+
);
50+
}
51+
52+
public function save($variable)
53+
{
54+
$model = $variable->toModel();
55+
$model->save();
56+
57+
$variable->model($model->fresh());
58+
}
59+
60+
public function delete($variable)
61+
{
62+
$variable->model()->delete();
63+
}
64+
65+
public static function bindings(): array
66+
{
67+
return [
68+
Variables::class => \Statamic\Eloquent\Globals\Variables::class,
69+
];
70+
}
71+
}

src/Globals/Variables.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@
22

33
namespace Statamic\Eloquent\Globals;
44

5+
use Illuminate\Database\Eloquent\Model;
56
use Statamic\Contracts\Globals\Variables as Contract;
6-
use Statamic\Eloquent\Globals\VariablesModel as Model;
77
use Statamic\Globals\Variables as FileEntry;
88

99
class Variables extends FileEntry
1010
{
11+
protected $model;
12+
1113
public static function fromModel(Model $model)
1214
{
1315
return (new static())
1416
->globalSet($model->handle)
1517
->locale($model->locale)
1618
->data($model->data)
17-
->origin($model->origin ?? null);
19+
->origin($model->origin ?? null)
20+
->model($model);
1821
}
1922

2023
public function toModel()
@@ -24,7 +27,7 @@ public function toModel()
2427

2528
public static function makeModelFromContract(Contract $source)
2629
{
27-
$class = app('statamic.eloquent.global_sets.variables_model');
30+
$class = app('statamic.eloquent.global_set_variables.model');
2831

2932
$data = $source->data();
3033

@@ -52,4 +55,15 @@ public function save()
5255

5356
return $this;
5457
}
58+
59+
public function model($model = null)
60+
{
61+
if (func_num_args() === 0) {
62+
return $this->model;
63+
}
64+
65+
$this->model = $model;
66+
67+
return $this;
68+
}
5569
}

src/ServiceProvider.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Statamic\Contracts\Entries\EntryRepository as EntryRepositoryContract;
1010
use Statamic\Contracts\Forms\FormRepository as FormRepositoryContract;
1111
use Statamic\Contracts\Globals\GlobalRepository as GlobalRepositoryContract;
12+
use Statamic\Contracts\Globals\GlobalVariablesRepository as GlobalVariablesRepositoryContract;
1213
use Statamic\Contracts\Revisions\RevisionRepository as RevisionRepositoryContract;
1314
use Statamic\Contracts\Structures\CollectionTreeRepository as CollectionTreeRepositoryContract;
1415
use Statamic\Contracts\Structures\NavigationRepository as NavigationRepositoryContract;
@@ -22,6 +23,7 @@
2223
use Statamic\Eloquent\Entries\EntryRepository;
2324
use Statamic\Eloquent\Forms\FormRepository;
2425
use Statamic\Eloquent\Globals\GlobalRepository;
26+
use Statamic\Eloquent\Globals\GlobalVariablesRepository;
2527
use Statamic\Eloquent\Listeners\UpdateStructuredEntryOrder;
2628
use Statamic\Eloquent\Revisions\RevisionRepository;
2729
use Statamic\Eloquent\Structures\CollectionTreeRepository;
@@ -127,6 +129,7 @@ public function register()
127129
$this->registerEntries();
128130
$this->registerForms();
129131
$this->registerGlobals();
132+
$this->registerGlobalVariables();
130133
$this->registerRevisions();
131134
$this->registerStructures();
132135
$this->registerStructureTrees();
@@ -280,9 +283,20 @@ private function registerGlobals()
280283
$this->app->bind('statamic.eloquent.global_sets.model', function () {
281284
return config('statamic.eloquent-driver.global_sets.model');
282285
});
286+
}
287+
288+
private function registerGlobalVariables()
289+
{
290+
$usingOldConfigKeys = config()->has('statamic.eloquent-driver.global_sets.variables_model');
291+
292+
if (config($usingOldConfigKeys ? 'statamic.eloquent-driver.global_sets.driver' : 'statamic.eloquent-driver.global_set_variables.driver', 'file') != 'eloquent') {
293+
return;
294+
}
295+
296+
Statamic::repository(GlobalVariablesRepositoryContract::class, GlobalVariablesRepository::class);
283297

284-
$this->app->bind('statamic.eloquent.global_sets.variables_model', function () {
285-
return config('statamic.eloquent-driver.global_sets.variables_model');
298+
$this->app->bind('statamic.eloquent.global_set_variables.model', function () use ($usingOldConfigKeys) {
299+
return config($usingOldConfigKeys ? 'statamic.eloquent-driver.global_sets.variables_model' : 'statamic.eloquent-driver.global_set_variables.model');
286300
});
287301

288302
Statamic::repository(GlobalRepositoryContract::class, GlobalRepository::class);

tests/Data/Globals/VariablesTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ public function it_gets_file_contents_for_saving_a_localized_set()
6363
'empty' => [], // and this should get stripped out because there's no origin to fall back to.
6464
]);
6565

66+
$global->addLocalization($a);
67+
$global->addLocalization($b);
68+
$global->addLocalization($c);
69+
6670
$expected = <<<'EOT'
6771
array:
6872
- 'first one'
@@ -130,6 +134,12 @@ public function if_the_value_is_explicitly_set_to_null_then_it_should_not_fall_b
130134
'two' => null,
131135
]);
132136

137+
$global->addLocalization($a);
138+
$global->addLocalization($b);
139+
$global->addLocalization($c);
140+
$global->addLocalization($d);
141+
$global->addLocalization($e);
142+
133143
$this->assertEquals([
134144
'one' => 'alfa',
135145
'two' => 'bravo',

0 commit comments

Comments
 (0)