diff --git a/src/Data/DataReferenceUpdater.php b/src/Data/DataReferenceUpdater.php index f1fc28ce98..8c5cc343a5 100644 --- a/src/Data/DataReferenceUpdater.php +++ b/src/Data/DataReferenceUpdater.php @@ -98,7 +98,7 @@ protected function updateNestedFieldValues($fields, $dottedPrefix) { $fields ->filter(function ($field) { - return in_array($field->type(), ['replicator', 'grid', 'bard']); + return in_array($field->type(), ['replicator', 'grid', 'group', 'bard']); }) ->each(function ($field) use ($dottedPrefix) { $method = 'update'.ucfirst($field->type()).'Children'; @@ -155,6 +155,24 @@ protected function updateGridChildren($field, $dottedKey) }); } + /** + * Update group field children. + * + * @param \Statamic\Fields\Field $field + * @param string $dottedKey + */ + protected function updateGroupChildren($field, $dottedKey) + { + $data = $this->item->data(); + + $dottedPrefix = "{$dottedKey}."; + $fields = Arr::get($field->config(), 'fields'); + + if ($fields) { + $this->recursivelyUpdateFields((new Fields($fields))->all(), $dottedPrefix); + } + } + /** * Update bard field children. * diff --git a/tests/Listeners/UpdateAssetReferencesTest.php b/tests/Listeners/UpdateAssetReferencesTest.php index cbad0daa09..f7bb984b66 100644 --- a/tests/Listeners/UpdateAssetReferencesTest.php +++ b/tests/Listeners/UpdateAssetReferencesTest.php @@ -707,6 +707,56 @@ public function it_updates_nested_asset_fields_within_grid_fields() $this->assertEquals(['content/norris.jpg', 'lee.jpg'], Arr::get($entry->fresh()->data(), 'griddy.1.pics')); } + #[Test] + public function it_updates_nested_asset_fields_within_group_fields() + { + $collection = tap(Facades\Collection::make('articles'))->save(); + + $this->setInBlueprints('collections/articles', [ + 'fields' => [ + [ + 'handle' => 'group_field', + 'field' => [ + 'type' => 'group', + 'fields' => [ + [ + 'handle' => 'product', + 'field' => [ + 'type' => 'assets', + 'container' => 'test_container', + 'max_files' => 1, + ], + ], + [ + 'handle' => 'pics', + 'field' => [ + 'type' => 'assets', + 'container' => 'test_container', + ], + ], + ], + ], + ], + ], + ]); + + $entry = tap(Facades\Entry::make()->collection($collection)->data([ + 'group_field' => [ + 'product' => 'hoff.jpg', + 'pics' => ['hoff.jpg', 'norris.jpg', 'lee.jpg'], + ], + ]))->save(); + + $this->assertEquals('hoff.jpg', Arr::get($entry->data(), 'group_field.product')); + $this->assertEquals(['hoff.jpg', 'norris.jpg', 'lee.jpg'], Arr::get($entry->data(), 'group_field.pics')); + + $this->assetNorris->path('content/norris.jpg')->save(); + $this->assetHoff->delete(); + + $this->assertFalse(Arr::has($entry->fresh()->data(), 'group_field.product')); + $this->assertEquals(['content/norris.jpg', 'lee.jpg'], Arr::get($entry->fresh()->data(), 'group_field.pics')); + } + #[Test] public function it_updates_nested_asset_fields_within_bard_fields() {