Skip to content
Snippets Groups Projects
Verified Commit b12a1586 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2993165 by kkasson, tatianag, Spokje, mpdonadio, xurizaemon, raman.b,...

Issue #2993165 by kkasson, tatianag, Spokje, mpdonadio, xurizaemon, raman.b, wombatbuddy, pooja saraah, tannguyenhn, VladimirAus, ranjith_kumar_k_u, jannakha, pameeela: Date Only field shows incorrect default value when UTC date is different than user's date

(cherry picked from commit c9d63410)
parent 1857fea1
No related branches found
No related tags found
9 merge requests!4488Issue #3376281: Random machine names no longer need to be wrapped in strtolower(),!3149Issue #3282285: Email "" does not comply with addr-spec of RFC 2822,!3000Issue #793660: Check for failure of hook_install,!2940Issue #3320240: Entity count query returns a string instead of int,!2937Issue #3315245: Order of languages overrides default language fallback,!2877Issue #3056652 by yogeshmpawar, mashermike, aalin, ranjith_kumar_k_u: Link...,!1627Issue #3082958: Add gitignore(s) to composer-ready project templates,!1014Issue #3226806: Move filter implementations from filter.module to plugin classes,!939Issue #2971209: Allow the MediaLibraryUiBuilder service to use an alternative view display
......@@ -86,10 +86,16 @@ public function massageFormValues(array $values, array $form, FormStateInterface
protected function createDefaultValue($date, $timezone) {
// The date was created and verified during field_load(), so it is safe to
// use without further inspection.
$year = $date->format('Y');
$month = $date->format('m');
$day = $date->format('d');
$date->setTimezone(new \DateTimeZone($timezone));
if ($this->getFieldSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
$date->setDefaultDateTime();
// Reset the date to handle cases where the UTC offset is greater than
// 12 hours.
$date->setDate($year, $month, $day);
}
$date->setTimezone(new \DateTimeZone($timezone));
return $date;
}
......
......@@ -99,6 +99,8 @@ protected function setUp() {
'administer content types',
'bypass node access',
'administer node fields',
'administer node form display',
'administer node display',
]);
$this->drupalLogin($web_user);
......
<?php
namespace Drupal\Tests\datetime\Functional;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
/**
* Tests Datetime widgets functionality.
*
* @group datetime
*/
class DateTimeWidgetTest extends DateTestBase {
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* The default display settings to use for the formatters.
*
* @var array
*/
protected $defaultSettings = ['timezone_override' => ''];
/**
* {@inheritdoc}
*/
protected function getTestFieldType() {
return 'datetime';
}
/**
* Test default value functionality.
*/
public function testDateonlyDefaultValue() {
// Create a test content type.
$this->drupalCreateContentType(['type' => 'dateonly_content']);
// Create a field storage with settings to validate.
$field_storage = FieldStorageConfig::create([
'field_name' => 'field_dateonly',
'entity_type' => 'node',
'type' => 'datetime',
'settings' => ['datetime_type' => 'date'],
]);
$field_storage->save();
$field = FieldConfig::create([
'field_storage' => $field_storage,
'bundle' => 'dateonly_content',
]);
$field->save();
$edit = [
'fields[field_dateonly][region]' => 'content',
'fields[field_dateonly][type]' => 'datetime_default',
];
$this->drupalGet('admin/structure/types/manage/dateonly_content/form-display');
$this->submitForm($edit, 'Save');
$this->drupalGet('admin/structure/types/manage/dateonly_content/display');
$this->submitForm($edit, 'Save');
// Set now as default_value.
$edit = [
'default_value_input[default_date_type]' => 'now',
];
$this->drupalGet('admin/structure/types/manage/dateonly_content/fields/node.dateonly_content.field_dateonly');
$this->submitForm($edit, 'Save settings');
// Check that default value is selected in default value form.
$this->drupalGet('admin/structure/types/manage/dateonly_content/fields/node.dateonly_content.field_dateonly');
$option_field = $this->assertSession()->optionExists('edit-default-value-input-default-date-type', 'now');
$this->assertTrue($option_field->hasAttribute('selected'));
$this->assertSession()->fieldValueEquals('default_value_input[default_date]', '');
// Loop through defined timezones to test that date-only defaults work at
// the extremes.
foreach (static::$timezones as $timezone) {
$this->setSiteTimezone($timezone);
$this->assertEquals($timezone, $this->config('system.date')->get('timezone.default'), 'Time zone set to ' . $timezone);
$this->drupalGet('node/add/dateonly_content');
$request_time = $this->container->get('datetime.time')->getRequestTime();
$today = $this->dateFormatter->format($request_time, 'html_date', NULL, $timezone);
$this->assertSession()->fieldValueEquals('field_dateonly[0][value][date]', $today);
$edit = [
'title[0][value]' => $timezone,
];
$this->submitForm($edit, 'Save');
$this->assertSession()->pageTextContains('dateonly_content ' . $timezone . ' has been created');
$node = $this->drupalGetNodeByTitle($timezone);
$today_storage = $this->dateFormatter->format($request_time, 'html_date', NULL, $timezone);
$this->assertEquals($today_storage, $node->field_dateonly->value);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment