Skip to content

Commit d6a494d

Browse files
[6.x] Only change date for localizations with an explicit date set (#14362)
1 parent 22a7b20 commit d6a494d

2 files changed

Lines changed: 88 additions & 0 deletions

File tree

src/Console/Commands/MigrateDatesToUtc.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ private function updateDateFields($item, Fields $fields, ?string $dottedPrefix =
120120
&& empty($dottedPrefix)
121121
&& $field->handle() === 'date'
122122
) {
123+
// Skip localized entries that inherit their date from the origin.
124+
// The origin will be migrated separately and the inheritance will continue to work.
125+
if (! $item->hasExplicitDate()) {
126+
return;
127+
}
128+
123129
// When entries are constructed, the datestamp from the filename would be provided but treated as UTC.
124130
// We need them to be adjusted back to the existing timezone.
125131
$item->date(Carbon::createFromFormat(

tests/Console/Commands/MigrateDatesToUtcTest.php

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,88 @@ public function it_converts_entry_date_field_in_entries_when_app_timezone_is_utc
9191
$this->it_converts_entry_date_field_in_entries();
9292
}
9393

94+
#[Test]
95+
public function it_skips_localized_entries_that_inherit_date_from_origin()
96+
{
97+
$this->setSites([
98+
'en' => ['url' => '/', 'locale' => 'en_US', 'name' => 'English'],
99+
'fr' => ['url' => '/fr/', 'locale' => 'fr_FR', 'name' => 'French'],
100+
'it' => ['url' => '/it/', 'locale' => 'it_IT', 'name' => 'Italian'],
101+
]);
102+
103+
$collection = tap(Collection::make('articles')->dated(true)->sites(['en', 'fr', 'it']))->save();
104+
105+
$collection->entryBlueprint()->setContents([
106+
'fields' => [
107+
['handle' => 'date', 'field' => ['type' => 'date', 'time_enabled' => true]],
108+
],
109+
])->save();
110+
111+
$origin = Entry::make()->id('origin')->locale('en')->collection('articles')->date('2025-01-01-1200');
112+
$origin->save();
113+
114+
$french = Entry::make()->id('fr-entry')->locale('fr')->collection('articles')->origin($origin);
115+
$french->save();
116+
117+
$italian = Entry::make()->id('it-entry')->locale('it')->collection('articles')->origin($origin);
118+
$italian->save();
119+
120+
// All entries should have the same date before migration
121+
$this->assertEquals('2025-01-01T12:00:00+00:00', $origin->date()->toIso8601String());
122+
$this->assertEquals('2025-01-01T12:00:00+00:00', $french->date()->toIso8601String());
123+
$this->assertEquals('2025-01-01T12:00:00+00:00', $italian->date()->toIso8601String());
124+
125+
$this->migrateDatesToUtc();
126+
127+
$origin = Entry::find('origin');
128+
$french = Entry::find('fr-entry');
129+
$italian = Entry::find('it-entry');
130+
131+
// Origin should be migrated
132+
$this->assertEquals('2025-01-01T17:00:00+00:00', $origin->date()->toIso8601String());
133+
134+
// Localized entries should still have the same date as origin (inherited)
135+
$this->assertEquals('2025-01-01T17:00:00+00:00', $french->date()->toIso8601String());
136+
$this->assertEquals('2025-01-01T17:00:00+00:00', $italian->date()->toIso8601String());
137+
138+
$this->assertFalse($french->hasExplicitDate());
139+
$this->assertFalse($italian->hasExplicitDate());
140+
}
141+
142+
#[Test]
143+
public function it_migrates_localized_entries_that_have_their_own_date()
144+
{
145+
$this->setSites([
146+
'en' => ['url' => '/', 'locale' => 'en_US', 'name' => 'English'],
147+
'fr' => ['url' => '/fr/', 'locale' => 'fr_FR', 'name' => 'French'],
148+
]);
149+
150+
$collection = tap(Collection::make('articles')->dated(true)->sites(['en', 'fr']))->save();
151+
152+
$collection->entryBlueprint()->setContents([
153+
'fields' => [
154+
['handle' => 'date', 'field' => ['type' => 'date', 'time_enabled' => true]],
155+
],
156+
])->save();
157+
158+
$origin = Entry::make()->id('origin')->locale('en')->collection('articles')->date('2025-01-01-1200');
159+
$origin->save();
160+
161+
$french = Entry::make()->id('fr-entry')->locale('fr')->collection('articles')->origin($origin)->date('2025-01-02-1400');
162+
$french->save();
163+
164+
$this->assertTrue($french->hasExplicitDate());
165+
166+
$this->migrateDatesToUtc();
167+
168+
$origin = Entry::find('origin');
169+
$french = Entry::find('fr-entry');
170+
171+
// Both should be migrated
172+
$this->assertEquals('2025-01-01T17:00:00+00:00', $origin->date()->toIso8601String());
173+
$this->assertEquals('2025-01-02T19:00:00+00:00', $french->date()->toIso8601String());
174+
}
175+
94176
#[Test]
95177
#[DataProvider('dateFieldsProvider')]
96178
public function it_converts_date_fields_in_terms(string $fieldHandle, array $field, $original, $expected)

0 commit comments

Comments
 (0)