diff --git a/src/Parser/StructuredDataParser.php b/src/Parser/StructuredDataParser.php index beefb5e..43172dd 100644 --- a/src/Parser/StructuredDataParser.php +++ b/src/Parser/StructuredDataParser.php @@ -8,12 +8,15 @@ use Statamic\Contracts\Data\Augmentable; use Statamic\Contracts\Entries\Entry as EntryContract; use Statamic\Contracts\Taxonomies\Term as TermContract; +use Statamic\Facades\GlobalSet as GlobalSetFacade; use Statamic\Facades\Site as SiteFacade; use Statamic\Facades\Term; use Statamic\Fields\Value; use Statamic\Fields\Values; use Statamic\Fieldtypes\Bard; use Statamic\Fieldtypes\Bard\Augmentor as BardAugmentor; +use Statamic\Globals\GlobalSet; +use Statamic\Globals\Variables; use Statamic\Sites\Site; use Statamic\View\Antlers\Antlers; use Statamic\View\Antlers\AntlersString; @@ -235,11 +238,34 @@ protected function getParseContext(EntryContract|TermContract|Model $item): arra $siteAugmented = $site->toAugmentedArray(); $itemAugmented = ($item instanceof Augmentable) ? $item->toAugmentedArray() : []; $modelAttributes = $item instanceof Model ? $item->toArray() : []; + /** @var Collection $globalSets */ + $globalSets = GlobalSetFacade::all(); + /** @var array $globals */ + $globals = $globalSets + ->reduce(function (array $carry, GlobalSet $globalSet) use ($site): array { + $handle = $globalSet->handle(); + /** @var Variables|null $variables */ + $variables = $globalSet->in($site->handle()); + $values = $variables?->toAugmentedArray() ?? []; + + if ($values === []) { + return $carry; + } + + $carry[$handle] = $values; + + foreach ($values as $key => $value) { + $carry[$handle.':'.$key] = $value; + } + + return $carry; + }, []); return array_merge( ['config' => config()->all()], ['site' => $siteAugmented], ['absolute_url' => $this->resolveAbsoluteUrl($item)], + $globals, $itemAugmented, $modelAttributes ); diff --git a/tests/Unit/Parser/StructuredDataParserTest.php b/tests/Unit/Parser/StructuredDataParserTest.php index 0194bc5..3064c2e 100644 --- a/tests/Unit/Parser/StructuredDataParserTest.php +++ b/tests/Unit/Parser/StructuredDataParserTest.php @@ -11,12 +11,16 @@ use Statamic\Contracts\View\Antlers\Parser as AntlersParserContract; use Statamic\Entries\Entry; use Statamic\Facades\Collection as CollectionFacade; +use Statamic\Facades\GlobalSet as GlobalSetFacade; use Statamic\Facades\Site as SiteFacade; use Statamic\Facades\Taxonomy as TaxonomyFacade; use Statamic\Facades\Term as TermFacade; use Statamic\Fields\Value; use Statamic\Fields\Values; use Statamic\Fieldtypes\Bard; +use Statamic\Globals\GlobalCollection; +use Statamic\Globals\GlobalSet; +use Statamic\Globals\Variables; use Statamic\Query\EloquentQueryBuilder; use Statamic\Sites\Site; use Statamic\Taxonomies\Taxonomy; @@ -689,4 +693,55 @@ public function parse_context_merges_model_attributes(): void $this->assertSame('Test Bike', $result['name']); $this->assertSame('BIKE-1', $result['sku']); } + + #[Test] + public function get_parse_context_includes_global_set_values(): void + { + $collection = CollectionFacade::make('blog')->save(); + $entry = (new Entry)->collection($collection)->id('entry-123'); + + $site = $this->mock(Site::class, function (MockInterface $mock): void { + $mock->shouldReceive('toAugmentedArray')->andReturn(['handle' => 'default'])->byDefault(); + $mock->shouldReceive('handle')->andReturn('default')->byDefault(); + }); + SiteFacade::shouldReceive('current')->andReturn($site)->byDefault(); + SiteFacade::shouldReceive('multiEnabled')->andReturn(false)->byDefault(); + SiteFacade::shouldReceive('hasMultiple')->andReturn(false)->byDefault(); + SiteFacade::shouldReceive('default')->andReturn($site)->byDefault(); + SiteFacade::shouldReceive('all')->andReturn(collect([$site]))->byDefault(); + + $populatedVariables = $this->mock(Variables::class, function (MockInterface $mock): void { + $mock->shouldReceive('toAugmentedArray')->andReturn([ + 'company_name' => 'Acme', + 'phone' => '123', + ]); + }); + + $populatedGlobal = $this->mock(GlobalSet::class, function (MockInterface $mock) use ($populatedVariables): void { + $mock->shouldReceive('handle')->andReturn('company'); + $mock->shouldReceive('in')->with('default')->andReturn($populatedVariables); + }); + + $emptyGlobal = $this->mock(GlobalSet::class, function (MockInterface $mock): void { + $mock->shouldReceive('handle')->andReturn('empty'); + $mock->shouldReceive('in')->with('default')->andReturn(null); + }); + + GlobalSetFacade::shouldReceive('all')->andReturn(new GlobalCollection([$populatedGlobal, $emptyGlobal])); + + $parser = new StructuredDataParser; + $method = (new \ReflectionClass($parser))->getMethod('getParseContext'); + $method->setAccessible(true); + $result = $method->invoke($parser, $entry); + + $this->assertIsArray($result); + /** @var array $result */ + $this->assertSame([ + 'company_name' => 'Acme', + 'phone' => '123', + ], $result['company']); + $this->assertSame('Acme', $result['company:company_name']); + $this->assertSame('123', $result['company:phone']); + $this->assertArrayNotHasKey('empty', $result); + } }