Skip to content

Commit ecd1984

Browse files
committed
Merge branch '3.4' into 4.4
* 3.4: [Translation] Add missing use statement [Translation][Debug] Add installation and minimal example to README [Validator] try to call __get method if property is uninitialized Fix handling of empty_data's \Closure value in Date/Time form types
2 parents 442d561 + cf4fc31 commit ecd1984

File tree

6 files changed

+83
-13
lines changed

6 files changed

+83
-13
lines changed

Extension/Core/Type/DateTimeType.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,17 @@ public function buildForm(FormBuilderInterface $builder, array $options)
108108
'invalid_message_parameters',
109109
]));
110110

111-
if (isset($emptyData['date'])) {
111+
if ($emptyData instanceof \Closure) {
112+
$lazyEmptyData = static function ($option) use ($emptyData) {
113+
return static function (FormInterface $form) use ($emptyData, $option) {
114+
$emptyData = $emptyData($form->getParent());
115+
116+
return isset($emptyData[$option]) ? $emptyData[$option] : '';
117+
};
118+
};
119+
120+
$dateOptions['empty_data'] = $lazyEmptyData('date');
121+
} elseif (isset($emptyData['date'])) {
112122
$dateOptions['empty_data'] = $emptyData['date'];
113123
}
114124

@@ -127,7 +137,9 @@ public function buildForm(FormBuilderInterface $builder, array $options)
127137
'invalid_message_parameters',
128138
]));
129139

130-
if (isset($emptyData['time'])) {
140+
if ($emptyData instanceof \Closure) {
141+
$timeOptions['empty_data'] = $lazyEmptyData('time');
142+
} elseif (isset($emptyData['time'])) {
131143
$timeOptions['empty_data'] = $emptyData['time'];
132144
}
133145

Extension/Core/Type/DateType.php

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,28 @@ public function buildForm(FormBuilderInterface $builder, array $options)
8282
// so we need to handle the cascade setting here
8383
$emptyData = $builder->getEmptyData() ?: [];
8484

85-
if (isset($emptyData['year'])) {
86-
$yearOptions['empty_data'] = $emptyData['year'];
87-
}
88-
if (isset($emptyData['month'])) {
89-
$monthOptions['empty_data'] = $emptyData['month'];
90-
}
91-
if (isset($emptyData['day'])) {
92-
$dayOptions['empty_data'] = $emptyData['day'];
85+
if ($emptyData instanceof \Closure) {
86+
$lazyEmptyData = static function ($option) use ($emptyData) {
87+
return static function (FormInterface $form) use ($emptyData, $option) {
88+
$emptyData = $emptyData($form->getParent());
89+
90+
return isset($emptyData[$option]) ? $emptyData[$option] : '';
91+
};
92+
};
93+
94+
$yearOptions['empty_data'] = $lazyEmptyData('year');
95+
$monthOptions['empty_data'] = $lazyEmptyData('month');
96+
$dayOptions['empty_data'] = $lazyEmptyData('day');
97+
} else {
98+
if (isset($emptyData['year'])) {
99+
$yearOptions['empty_data'] = $emptyData['year'];
100+
}
101+
if (isset($emptyData['month'])) {
102+
$monthOptions['empty_data'] = $emptyData['month'];
103+
}
104+
if (isset($emptyData['day'])) {
105+
$dayOptions['empty_data'] = $emptyData['day'];
106+
}
93107
}
94108

95109
if (isset($options['invalid_message'])) {

Extension/Core/Type/TimeType.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,17 @@ public function buildForm(FormBuilderInterface $builder, array $options)
9393
// so we need to handle the cascade setting here
9494
$emptyData = $builder->getEmptyData() ?: [];
9595

96-
if (isset($emptyData['hour'])) {
96+
if ($emptyData instanceof \Closure) {
97+
$lazyEmptyData = static function ($option) use ($emptyData) {
98+
return static function (FormInterface $form) use ($emptyData, $option) {
99+
$emptyData = $emptyData($form->getParent());
100+
101+
return isset($emptyData[$option]) ? $emptyData[$option] : '';
102+
};
103+
};
104+
105+
$hourOptions['empty_data'] = $lazyEmptyData('hour');
106+
} elseif (isset($emptyData['hour'])) {
97107
$hourOptions['empty_data'] = $emptyData['hour'];
98108
}
99109

@@ -160,14 +170,18 @@ public function buildForm(FormBuilderInterface $builder, array $options)
160170
$builder->add('hour', self::$widgets[$options['widget']], $hourOptions);
161171

162172
if ($options['with_minutes']) {
163-
if (isset($emptyData['minute'])) {
173+
if ($emptyData instanceof \Closure) {
174+
$minuteOptions['empty_data'] = $lazyEmptyData('minute');
175+
} elseif (isset($emptyData['minute'])) {
164176
$minuteOptions['empty_data'] = $emptyData['minute'];
165177
}
166178
$builder->add('minute', self::$widgets[$options['widget']], $minuteOptions);
167179
}
168180

169181
if ($options['with_seconds']) {
170-
if (isset($emptyData['second'])) {
182+
if ($emptyData instanceof \Closure) {
183+
$secondOptions['empty_data'] = $lazyEmptyData('second');
184+
} elseif (isset($emptyData['second'])) {
171185
$secondOptions['empty_data'] = $emptyData['second'];
172186
}
173187
$builder->add('second', self::$widgets[$options['widget']], $secondOptions);

Tests/Extension/Core/Type/DateTimeTypeTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Form\Tests\Extension\Core\Type;
1313

1414
use Symfony\Component\Form\FormError;
15+
use Symfony\Component\Form\FormInterface;
1516

1617
class DateTimeTypeTest extends BaseTypeTest
1718
{
@@ -671,6 +672,9 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa
671672
]);
672673
$form->submit(null);
673674

675+
if ($emptyData instanceof \Closure) {
676+
$emptyData = $emptyData($form);
677+
}
674678
$this->assertSame($emptyData, $form->getViewData());
675679
$this->assertEquals($expectedData, $form->getNormData());
676680
$this->assertEquals($expectedData, $form->getData());
@@ -679,11 +683,17 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa
679683
public function provideEmptyData()
680684
{
681685
$expectedData = \DateTime::createFromFormat('Y-m-d H:i', '2018-11-11 21:23');
686+
$lazyEmptyData = static function (FormInterface $form) {
687+
return $form->getConfig()->getCompound() ? ['date' => ['year' => '2018', 'month' => '11', 'day' => '11'], 'time' => ['hour' => '21', 'minute' => '23']] : '2018-11-11T21:23:00';
688+
};
682689

683690
return [
684691
'Simple field' => ['single_text', '2018-11-11T21:23:00', $expectedData],
685692
'Compound text field' => ['text', ['date' => ['year' => '2018', 'month' => '11', 'day' => '11'], 'time' => ['hour' => '21', 'minute' => '23']], $expectedData],
686693
'Compound choice field' => ['choice', ['date' => ['year' => '2018', 'month' => '11', 'day' => '11'], 'time' => ['hour' => '21', 'minute' => '23']], $expectedData],
694+
'Simple field lazy' => ['single_text', $lazyEmptyData, $expectedData],
695+
'Compound text field lazy' => ['text', $lazyEmptyData, $expectedData],
696+
'Compound choice field lazy' => ['choice', $lazyEmptyData, $expectedData],
687697
];
688698
}
689699

Tests/Extension/Core/Type/DateTypeTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Form\ChoiceList\View\ChoiceView;
1515
use Symfony\Component\Form\FormError;
16+
use Symfony\Component\Form\FormInterface;
1617
use Symfony\Component\Intl\Util\IntlTestHelper;
1718

1819
class DateTypeTest extends BaseTypeTest
@@ -1022,6 +1023,9 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa
10221023
]);
10231024
$form->submit(null);
10241025

1026+
if ($emptyData instanceof \Closure) {
1027+
$emptyData = $emptyData($form);
1028+
}
10251029
$this->assertSame($emptyData, $form->getViewData());
10261030
$this->assertEquals($expectedData, $form->getNormData());
10271031
$this->assertEquals($expectedData, $form->getData());
@@ -1030,11 +1034,17 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa
10301034
public function provideEmptyData()
10311035
{
10321036
$expectedData = \DateTime::createFromFormat('Y-m-d H:i:s', '2018-11-11 00:00:00');
1037+
$lazyEmptyData = static function (FormInterface $form) {
1038+
return $form->getConfig()->getCompound() ? ['year' => '2018', 'month' => '11', 'day' => '11'] : '2018-11-11';
1039+
};
10331040

10341041
return [
10351042
'Simple field' => ['single_text', '2018-11-11', $expectedData],
10361043
'Compound text fields' => ['text', ['year' => '2018', 'month' => '11', 'day' => '11'], $expectedData],
10371044
'Compound choice fields' => ['choice', ['year' => '2018', 'month' => '11', 'day' => '11'], $expectedData],
1045+
'Simple field lazy' => ['single_text', $lazyEmptyData, $expectedData],
1046+
'Compound text fields lazy' => ['text', $lazyEmptyData, $expectedData],
1047+
'Compound choice fields lazy' => ['choice', $lazyEmptyData, $expectedData],
10381048
];
10391049
}
10401050

Tests/Extension/Core/Type/TimeTypeTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Form\ChoiceList\View\ChoiceView;
1515
use Symfony\Component\Form\FormError;
16+
use Symfony\Component\Form\FormInterface;
1617

1718
class TimeTypeTest extends BaseTypeTest
1819
{
@@ -929,6 +930,9 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa
929930
]);
930931
$form->submit(null);
931932

933+
if ($emptyData instanceof \Closure) {
934+
$emptyData = $emptyData($form);
935+
}
932936
$this->assertSame($emptyData, $form->getViewData());
933937
$this->assertEquals($expectedData, $form->getNormData());
934938
$this->assertEquals($expectedData, $form->getData());
@@ -937,11 +941,17 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa
937941
public function provideEmptyData()
938942
{
939943
$expectedData = \DateTime::createFromFormat('Y-m-d H:i', '1970-01-01 21:23');
944+
$lazyEmptyData = static function (FormInterface $form) {
945+
return $form->getConfig()->getCompound() ? ['hour' => '21', 'minute' => '23'] : '21:23';
946+
};
940947

941948
return [
942949
'Simple field' => ['single_text', '21:23', $expectedData],
943950
'Compound text field' => ['text', ['hour' => '21', 'minute' => '23'], $expectedData],
944951
'Compound choice field' => ['choice', ['hour' => '21', 'minute' => '23'], $expectedData],
952+
'Simple field lazy' => ['single_text', $lazyEmptyData, $expectedData],
953+
'Compound text field lazy' => ['text', $lazyEmptyData, $expectedData],
954+
'Compound choice field lazy' => ['choice', $lazyEmptyData, $expectedData],
945955
];
946956
}
947957
}

0 commit comments

Comments
 (0)