Loading core/lib/Drupal/Core/Datetime/Element/Datetime.php +2 −2 Original line number Diff line number Diff line Loading @@ -90,8 +90,8 @@ public static function valueCallback(&$element, $input, FormStateInterface $form else { $date_input = $element['#date_date_element'] != 'none' && !empty($input['date']) ? $input['date'] : ''; $time_input = $element['#date_time_element'] != 'none' && !empty($input['time']) ? $input['time'] : ''; $date_format = $element['#date_date_format'] != 'none' ? static::getHtml5DateFormat($element) : ''; $time_format = $element['#date_time_element'] != 'none' ? static::getHtml5TimeFormat($element) : ''; $date_format = $element['#date_date_element'] != 'none' && $element['#date_date_format'] != 'none' ? static::getHtml5DateFormat($element) : ''; $time_format = $element['#date_time_element'] != 'none' && $element['#date_time_format'] != 'none' ? static::getHtml5TimeFormat($element) : ''; } // Seconds will be omitted in a post in case there's no entry. Loading core/tests/Drupal/KernelTests/Core/Datetime/Element/DatetimeFormElementTest.php +38 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,14 @@ public function buildForm(array $form, FormStateInterface $form_state): array { '#date_time_element' => 'none', ]; // Test time-only element. $form['datetime_time_only'] = [ '#type' => 'datetime', '#date_date_element' => 'none', '#date_time_element' => 'time', '#date_time_format' => 'H:i', ]; $form['submit'] = [ '#type' => 'submit', '#value' => 'Submit', Loading Loading @@ -95,6 +103,7 @@ public function testNoErrorMetOnFormSubmit(): void { // No error expected when a datetime-local element has a valid value. $form_state = new FormState(); $form_state->setValue('datetime_local_picker', ['date' => '2025-02-18T12:00']); $form_state->setValue('datetime_time_only', ['time' => '12:00']); $this->formBuilder->submitForm($this, $form_state); $this->assertEmpty($form_state->getErrors()); } Loading Loading @@ -175,4 +184,33 @@ public function testDatetimeLocalProcessDatetime(): void { $this->assertArrayNotHasKey('time', $result); } /** * Checks expected values are returned by ::valueCallback(). * * Test only applied to time-only datetime element. * * @legacy-covers ::valueCallback */ public function testDatetimeTimeOnlyValueCallback(): void { $element = [ '#type' => 'datetime', '#date_date_element' => 'none', '#date_time_element' => 'time', '#date_time_format' => 'H:i:s', ]; $input = [ 'time' => '14:30:00', ]; $form_state = new FormState(); $form_state->setValue('datetime_time_only', ['time' => '14:30']); $result = Datetime::valueCallback($element, $input, $form_state); $this->assertIsArray($result); $this->assertArrayHasKey('time', $result); $this->assertEquals('14:30:00', $result['time']); $this->assertArrayHasKey('object', $result); $this->assertInstanceOf(DrupalDateTime::class, $result['object']); $this->assertEquals('14:30:00', $result['object']->format('H:i:s')); } } Loading
core/lib/Drupal/Core/Datetime/Element/Datetime.php +2 −2 Original line number Diff line number Diff line Loading @@ -90,8 +90,8 @@ public static function valueCallback(&$element, $input, FormStateInterface $form else { $date_input = $element['#date_date_element'] != 'none' && !empty($input['date']) ? $input['date'] : ''; $time_input = $element['#date_time_element'] != 'none' && !empty($input['time']) ? $input['time'] : ''; $date_format = $element['#date_date_format'] != 'none' ? static::getHtml5DateFormat($element) : ''; $time_format = $element['#date_time_element'] != 'none' ? static::getHtml5TimeFormat($element) : ''; $date_format = $element['#date_date_element'] != 'none' && $element['#date_date_format'] != 'none' ? static::getHtml5DateFormat($element) : ''; $time_format = $element['#date_time_element'] != 'none' && $element['#date_time_format'] != 'none' ? static::getHtml5TimeFormat($element) : ''; } // Seconds will be omitted in a post in case there's no entry. Loading
core/tests/Drupal/KernelTests/Core/Datetime/Element/DatetimeFormElementTest.php +38 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,14 @@ public function buildForm(array $form, FormStateInterface $form_state): array { '#date_time_element' => 'none', ]; // Test time-only element. $form['datetime_time_only'] = [ '#type' => 'datetime', '#date_date_element' => 'none', '#date_time_element' => 'time', '#date_time_format' => 'H:i', ]; $form['submit'] = [ '#type' => 'submit', '#value' => 'Submit', Loading Loading @@ -95,6 +103,7 @@ public function testNoErrorMetOnFormSubmit(): void { // No error expected when a datetime-local element has a valid value. $form_state = new FormState(); $form_state->setValue('datetime_local_picker', ['date' => '2025-02-18T12:00']); $form_state->setValue('datetime_time_only', ['time' => '12:00']); $this->formBuilder->submitForm($this, $form_state); $this->assertEmpty($form_state->getErrors()); } Loading Loading @@ -175,4 +184,33 @@ public function testDatetimeLocalProcessDatetime(): void { $this->assertArrayNotHasKey('time', $result); } /** * Checks expected values are returned by ::valueCallback(). * * Test only applied to time-only datetime element. * * @legacy-covers ::valueCallback */ public function testDatetimeTimeOnlyValueCallback(): void { $element = [ '#type' => 'datetime', '#date_date_element' => 'none', '#date_time_element' => 'time', '#date_time_format' => 'H:i:s', ]; $input = [ 'time' => '14:30:00', ]; $form_state = new FormState(); $form_state->setValue('datetime_time_only', ['time' => '14:30']); $result = Datetime::valueCallback($element, $input, $form_state); $this->assertIsArray($result); $this->assertArrayHasKey('time', $result); $this->assertEquals('14:30:00', $result['time']); $this->assertArrayHasKey('object', $result); $this->assertInstanceOf(DrupalDateTime::class, $result['object']); $this->assertEquals('14:30:00', $result['object']->format('H:i:s')); } }