diff --git a/mappers/date.inc b/mappers/date.inc index 19db7bf..ea57e27 100644 --- a/mappers/date.inc +++ b/mappers/date.inc @@ -70,7 +70,7 @@ function date_feeds_set_target(FeedsSource $source, $entity, $target, array $val foreach ($values as $value) { $value = _date_feeds_get_date_object($value, $default_tz); - if (!empty($value->errors)) { + if (!$value || !empty($value->errors)) { $field[LANGUAGE_NONE][$delta][$value_key] = ''; } else { @@ -171,13 +171,20 @@ function _date_feeds_get_date_object($value, DateTimeZone $default_tz) { return new DateObject($value->format(DATE_FORMAT_ISO), $value->getTimezone()); } - if (is_string($value)) { + if (is_string($value) || is_object($value) && method_exists($value, '__toString')) { $value = trim($value); } + // Filter out meaningless values. + if (empty($value) || !is_scalar($value)) { + return FALSE; + } + // Support year values. - if ((string) $value === (string) (int) $value && strlen($value) <= 4) { - return new DateObject('January ' . $value, $default_tz); + if ((string) $value === (string) (int) $value) { + if ($value >= variable_get('date_min_year', 100) && $value <= variable_get('date_max_year', 4000)) { + return new DateObject('January ' . $value, $default_tz); + } } return new DateObject($value, $default_tz); diff --git a/tests/feeds_mapper_date.test b/tests/feeds_mapper_date.test index 7dd8cfa..78c75ec 100644 --- a/tests/feeds_mapper_date.test +++ b/tests/feeds_mapper_date.test @@ -37,11 +37,11 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { $typename = $this->createContentType(array(), array( 'date' => 'date', 'datestamp' => 'datestamp', - //'datetime' => 'datetime', // REMOVED because the field is broken ATM. + 'datetime' => 'datetime', )); // Hack to get date fields to not round to every 15 minutes. - foreach (array('date', 'datestamp') as $field) { + foreach (array('date', 'datestamp', 'datetime') as $field) { $field = 'field_' . $field; $edit = array( 'widget_type' => 'date_select', @@ -84,6 +84,10 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { 'source' => 'timestamp', 'target' => 'field_datestamp:start', ), + 4 => array( + 'source' => 'timestamp', + 'target' => 'field_datetime:start', + ), )); $edit = array( @@ -108,6 +112,7 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { $this->drupalGet("node/$i/edit"); $this->assertNodeFieldValue('date', $values[$i-1]); $this->assertNodeFieldValue('datestamp', $values[$i-1]); + $this->assertNodeFieldValue('datetime', $values[$i-1]); } } @@ -141,6 +146,7 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { $edit = array( 'instance[widget][settings][increment]' => 1, 'field[settings][enddate_get]' => 1, + 'instance[settings][default_value]' => 'blank', ); $this->drupalPost('admin/structure/types/manage/' . $typename . '/fields/' . $field, $edit, 'Save settings'); $edit = array( @@ -210,11 +216,11 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { ); for ($i = 1; $i <= 2; $i++) { $this->drupalGet("node/$i/edit"); - $this->assertNodeFieldValue('date', $date_values[$i]['created']); + $this->assertFieldByName('field_date[und][0][value][date]', $date_values[$i]['created']); $this->assertFieldByName('field_date[und][0][value2][date]', $date_values[$i]['end']); - $this->assertNodeFieldValue('datestamp', $date_values[$i]['created']); + $this->assertFieldByName('field_datestamp[und][0][value][date]', $date_values[$i]['created']); $this->assertFieldByName('field_datestamp[und][0][value2][date]', $date_values[$i]['end']); - $this->assertNodeFieldValue('datetime', $date_values[$i]['created']); + $this->assertFieldByName('field_datetime[und][0][value][date]', $date_values[$i]['created']); $this->assertFieldByName('field_datetime[und][0][value2][date]', $date_values[$i]['end']); } @@ -225,12 +231,12 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { // Check if all values were cleared out for both nodes. for ($i = 1; $i <= 2; $i++) { $this->drupalGet("node/$i/edit"); - $this->assertNoNodeFieldValue('date', $date_values[$i]['created']); - $this->assertNoFieldByName('field_date[und][0][value2][date]', $date_values[$i]['end']); - $this->assertNoNodeFieldValue('datestamp', $date_values[$i]['created']); - $this->assertNoFieldByName('field_datestamp[und][0][value2][date]', $date_values[$i]['end']); - $this->assertNoNodeFieldValue('datetime', $date_values[$i]['created']); - $this->assertNoFieldByName('field_datetime[und][0][value2][date]', $date_values[$i]['end']); + $this->assertFieldByName('field_date[und][0][value][date]', ''); + $this->assertFieldByName('field_date[und][0][value2][date]', ''); + $this->assertFieldByName('field_datestamp[und][0][value][date]', ''); + $this->assertFieldByName('field_datestamp[und][0][value2][date]', ''); + $this->assertFieldByName('field_datetime[und][0][value][date]', ''); + $this->assertFieldByName('field_datetime[und][0][value2][date]', ''); $this->drupalGet("node/$i"); $this->assertNoText('date_label'); $this->assertNoText('datestamp_label'); @@ -242,11 +248,11 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { $this->assertText('Updated 2 nodes'); for ($i = 1; $i <= 2; $i++) { $this->drupalGet("node/$i/edit"); - $this->assertNodeFieldValue('date', $date_values[$i]['created']); + $this->assertFieldByName('field_date[und][0][value][date]', $date_values[$i]['created']); $this->assertFieldByName('field_date[und][0][value2][date]', $date_values[$i]['end']); - $this->assertNodeFieldValue('datestamp', $date_values[$i]['created']); + $this->assertFieldByName('field_datestamp[und][0][value][date]', $date_values[$i]['created']); $this->assertFieldByName('field_datestamp[und][0][value2][date]', $date_values[$i]['end']); - $this->assertNodeFieldValue('datetime', $date_values[$i]['created']); + $this->assertFieldByName('field_datetime[und][0][value][date]', $date_values[$i]['created']); $this->assertFieldByName('field_datetime[und][0][value2][date]', $date_values[$i]['end']); } @@ -256,12 +262,12 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { // Check if all values were cleared out for node 1. $this->drupalGet('node/1/edit'); - $this->assertNoNodeFieldValue('date', $date_values[1]['created']); - $this->assertNoFieldByName('field_date[und][0][value2][date]', $date_values[1]['end']); - $this->assertNoNodeFieldValue('datestamp', $date_values[1]['created']); - $this->assertNoFieldByName('field_datestamp[und][0][value2][date]', $date_values[1]['end']); - $this->assertNoNodeFieldValue('datetime', $date_values[1]['created']); - $this->assertNoFieldByName('field_datetime[und][0][value2][date]', $date_values[1]['end']); + $this->assertFieldByName('field_date[und][0][value2][date]', ''); + $this->assertFieldByName('field_date[und][0][value2][date]', ''); + $this->assertFieldByName('field_datestamp[und][0][value2][date]', ''); + $this->assertFieldByName('field_datestamp[und][0][value2][date]', ''); + $this->assertFieldByName('field_datetime[und][0][value2][date]', ''); + $this->assertFieldByName('field_datetime[und][0][value2][date]', ''); // Check if labels for fields that should be cleared out are not shown. $this->drupalGet('node/1'); $this->assertNoText('date_label');