Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a562ba2

Browse files
bug #36020 [Form] ignore microseconds submitted by Edge (xabbuh)
This PR was merged into the 3.4 branch. Discussion ---------- [Form] ignore microseconds submitted by Edge | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix #35989 | License | MIT | Doc PR | Commits ------- 20971df ignore microseconds submitted by Edge
2 parents 523f5c0 + 20971df commit a562ba2

File tree

2 files changed

+59
-9
lines changed

2 files changed

+59
-9
lines changed

src/Symfony/Component/Form/Extension/Core/Type/TimeType.php

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,18 @@ public function buildForm(FormBuilderInterface $builder, array $options)
5757
if ('single_text' === $options['widget']) {
5858
$builder->addViewTransformer(new DateTimeToStringTransformer($options['model_timezone'], $options['view_timezone'], $format));
5959

60-
// handle seconds ignored by user's browser when with_seconds enabled
61-
// https://codereview.chromium.org/450533009/
62-
if ($options['with_seconds']) {
63-
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $e) {
64-
$data = $e->getData();
65-
if ($data && preg_match('/^\d{2}:\d{2}$/', $data)) {
66-
$e->setData($data.':00');
60+
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $e) use ($options) {
61+
$data = $e->getData();
62+
if ($data && preg_match('/^(?P<hours>\d{2}):(?P<minutes>\d{2})(?::(?P<seconds>\d{2})(?:\.\d+)?)?$/', $data, $matches)) {
63+
if ($options['with_seconds']) {
64+
// handle seconds ignored by user's browser when with_seconds enabled
65+
// https://codereview.chromium.org/450533009/
66+
$e->setData(sprintf('%s:%s:%s', $matches['hours'], $matches['minutes'], isset($matches['seconds']) ? $matches['seconds'] : '00'));
67+
} else {
68+
$e->setData(sprintf('%s:%s', $matches['hours'], $matches['minutes']));
6769
}
68-
});
69-
}
70+
}
71+
});
7072
} else {
7173
$hourOptions = $minuteOptions = $secondOptions = [
7274
'error_bubbling' => true,

src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,54 @@ public function testSubmitWithSecondsAndBrowserOmissionSeconds()
239239
$this->assertEquals('03:04:00', $form->getViewData());
240240
}
241241

242+
public function testSubmitWithoutSecondsAndBrowserAddingSeconds()
243+
{
244+
$form = $this->factory->create(static::TESTED_TYPE, null, [
245+
'model_timezone' => 'UTC',
246+
'view_timezone' => 'UTC',
247+
'input' => 'string',
248+
'widget' => 'single_text',
249+
'with_seconds' => false,
250+
]);
251+
252+
$form->submit('03:04:00');
253+
254+
$this->assertEquals('03:04:00', $form->getData());
255+
$this->assertEquals('03:04', $form->getViewData());
256+
}
257+
258+
public function testSubmitWithSecondsAndBrowserAddingMicroseconds()
259+
{
260+
$form = $this->factory->create(static::TESTED_TYPE, null, [
261+
'model_timezone' => 'UTC',
262+
'view_timezone' => 'UTC',
263+
'input' => 'string',
264+
'widget' => 'single_text',
265+
'with_seconds' => true,
266+
]);
267+
268+
$form->submit('03:04:00.000');
269+
270+
$this->assertEquals('03:04:00', $form->getData());
271+
$this->assertEquals('03:04:00', $form->getViewData());
272+
}
273+
274+
public function testSubmitWithoutSecondsAndBrowserAddingMicroseconds()
275+
{
276+
$form = $this->factory->create(static::TESTED_TYPE, null, [
277+
'model_timezone' => 'UTC',
278+
'view_timezone' => 'UTC',
279+
'input' => 'string',
280+
'widget' => 'single_text',
281+
'with_seconds' => false,
282+
]);
283+
284+
$form->submit('03:04:00.000');
285+
286+
$this->assertEquals('03:04:00', $form->getData());
287+
$this->assertEquals('03:04', $form->getViewData());
288+
}
289+
242290
public function testSetDataWithoutMinutes()
243291
{
244292
$form = $this->factory->create(static::TESTED_TYPE, null, [

0 commit comments

Comments
 (0)