Skip to content
Snippets Groups Projects
Commit 7ef4e455 authored by eiriksm's avatar eiriksm Committed by Chris Leppanen
Browse files

Issue #697842 by eiriksm, franz, Webmaster Perpignan: Added Support array of values for dates.

parent 4846c3cd
No related branches found
No related tags found
No related merge requests found
...@@ -32,6 +32,7 @@ files[] = plugins/FeedsUserProcessor.inc ...@@ -32,6 +32,7 @@ files[] = plugins/FeedsUserProcessor.inc
files[] = tests/feeds.test files[] = tests/feeds.test
files[] = tests/feeds_date_time.test files[] = tests/feeds_date_time.test
files[] = tests/feeds_mapper_date.test files[] = tests/feeds_mapper_date.test
files[] = tests/feeds_mapper_date_multiple.test
files[] = tests/feeds_mapper_field.test files[] = tests/feeds_mapper_field.test
files[] = tests/feeds_mapper_file.test files[] = tests/feeds_mapper_file.test
files[] = tests/feeds_mapper_path.test files[] = tests/feeds_mapper_path.test
......
...@@ -43,23 +43,26 @@ function date_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam ...@@ -43,23 +43,26 @@ function date_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
* The value to be mapped. Should be either a (flexible) date string * The value to be mapped. Should be either a (flexible) date string
* or a FeedsDateTimeElement object. * or a FeedsDateTimeElement object.
* *
* @todo Support array of values for dates.
*/ */
function date_feeds_set_target($source, $entity, $target, $feed_element) { function date_feeds_set_target($source, $entity, $target, $feed_element) {
list($field_name, $sub_field) = explode(':', $target, 2); list($field_name, $sub_field) = explode(':', $target, 2);
if (!($feed_element instanceof FeedsDateTimeElement)) { if (!($feed_element instanceof FeedsDateTimeElement)) {
if (is_array($feed_element)) { if (!is_array($feed_element)) {
$feed_element = $feed_element[0]; $feed_element = array($feed_element);
} }
if (empty($feed_element) || !is_numeric($feed_element) && !date_create($feed_element)) { $delta = 0;
$feed_element = new FeedsDateTimeElement(NULL, NULL); foreach ($feed_element as $f) {
} if (empty($f) || !is_numeric($f) && !date_create($f)) {
elseif ($sub_field == 'end') { $array_element = new FeedsDateTimeElement(NULL, NULL);
$feed_element = new FeedsDateTimeElement(NULL, $feed_element); }
} elseif ($sub_field == 'end') {
else { $array_element = new FeedsDateTimeElement(NULL, $f);
$feed_element = new FeedsDateTimeElement($feed_element, NULL); }
else {
$array_element = new FeedsDateTimeElement($f, NULL);
}
$array_element->buildDateField($entity, $field_name, $delta);
$delta++;
} }
} }
$feed_element->buildDateField($entity, $field_name);
} }
...@@ -465,13 +465,13 @@ class FeedsDateTimeElement extends FeedsElement { ...@@ -465,13 +465,13 @@ class FeedsDateTimeElement extends FeedsElement {
* Helper method for buildDateField(). Build a FeedsDateTimeElement object * Helper method for buildDateField(). Build a FeedsDateTimeElement object
* from a standard formatted node. * from a standard formatted node.
*/ */
protected static function readDateField($entity, $field_name) { protected static function readDateField($entity, $field_name, $delta = 0) {
$ret = new FeedsDateTimeElement(); $ret = new FeedsDateTimeElement();
if (isset($entity->{$field_name}['und'][0]['date']) && $entity->{$field_name}['und'][0]['date'] instanceof FeedsDateTime) { if (isset($entity->{$field_name}['und'][$delta]['date']) && $entity->{$field_name}['und'][$delta]['date'] instanceof FeedsDateTime) {
$ret->start = $entity->{$field_name}['und'][0]['date']; $ret->start = $entity->{$field_name}['und'][$delta]['date'];
} }
if (isset($entity->{$field_name}['und'][0]['date2']) && $entity->{$field_name}['und'][0]['date2'] instanceof FeedsDateTime) { if (isset($entity->{$field_name}['und'][$delta]['date2']) && $entity->{$field_name}['und'][$delta]['date2'] instanceof FeedsDateTime) {
$ret->end = $entity->{$field_name}['und'][0]['date2']; $ret->end = $entity->{$field_name}['und'][$delta]['date2'];
} }
return $ret; return $ret;
} }
...@@ -479,15 +479,17 @@ class FeedsDateTimeElement extends FeedsElement { ...@@ -479,15 +479,17 @@ class FeedsDateTimeElement extends FeedsElement {
/** /**
* Build a entity's date field from our object. * Build a entity's date field from our object.
* *
* @param $entity * @param object $entity
* The entity to build the date field on. * The entity to build the date field on.
* @param $field_name * @param str $field_name
* The name of the field to build. * The name of the field to build.
* @param int $delta
* The delta in the field.
*/ */
public function buildDateField($entity, $field_name) { public function buildDateField($entity, $field_name, $delta = 0) {
$info = field_info_field($field_name); $info = field_info_field($field_name);
$oldfield = FeedsDateTimeElement::readDateField($entity, $field_name); $oldfield = FeedsDateTimeElement::readDateField($entity, $field_name, $delta);
// Merge with any preexisting objects on the field; we take precedence. // Merge with any preexisting objects on the field; we take precedence.
$oldfield = $this->merge($oldfield); $oldfield = $this->merge($oldfield);
$use_start = $oldfield->start; $use_start = $oldfield->start;
...@@ -523,24 +525,24 @@ class FeedsDateTimeElement extends FeedsElement { ...@@ -523,24 +525,24 @@ class FeedsDateTimeElement extends FeedsElement {
$entity->{$field_name} = array('und' => array()); $entity->{$field_name} = array('und' => array());
} }
if ($use_start) { if ($use_start) {
$entity->{$field_name}['und'][0]['timezone'] = $use_start->getTimezone()->getName(); $entity->{$field_name}['und'][$delta]['timezone'] = $use_start->getTimezone()->getName();
$entity->{$field_name}['und'][0]['offset'] = $use_start->getOffset(); $entity->{$field_name}['und'][$delta]['offset'] = $use_start->getOffset();
$use_start->setTimezone($db_tz); $use_start->setTimezone($db_tz);
$entity->{$field_name}['und'][0]['date'] = $use_start; $entity->{$field_name}['und'][$delta]['date'] = $use_start;
/** /**
* @todo the date_type_format line could be simplified based upon a patch * @todo the date_type_format line could be simplified based upon a patch
* DO issue #259308 could affect this, follow up on at some point. * DO issue #259308 could affect this, follow up on at some point.
* Without this, all granularity info is lost. * Without this, all granularity info is lost.
* $use_start->format(date_type_format($field['type'], $use_start->granularity)); * $use_start->format(date_type_format($field['type'], $use_start->granularity));
*/ */
$entity->{$field_name}['und'][0]['value'] = $use_start->format(date_type_format($info['type'])); $entity->{$field_name}['und'][$delta]['value'] = $use_start->format(date_type_format($info['type']));
} }
if ($use_end) { if ($use_end) {
// Don't ever use end to set timezone (for now) // Don't ever use end to set timezone (for now)
$entity->{$field_name}['und'][0]['offset2'] = $use_end->getOffset(); $entity->{$field_name}['und'][$delta]['offset2'] = $use_end->getOffset();
$use_end->setTimezone($db_tz); $use_end->setTimezone($db_tz);
$entity->{$field_name}['und'][0]['date2'] = $use_end; $entity->{$field_name}['und'][$delta]['date2'] = $use_end;
$entity->{$field_name}['und'][0]['value2'] = $use_end->format(date_type_format($info['type'])); $entity->{$field_name}['und'][$delta]['value2'] = $use_end->format(date_type_format($info['type']));
} }
} }
} }
......
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
<title>2 date values</title>
<guid>123456789</guid>
<date>Wed, 06 Jan 2010 15:05:00 GMT+00:00</date>
<date>Thu, 07 Jan 2010 15:08:00 GMT+00:00</date>
</item>
<item>
<title>4 date values</title>
<guid>1234567890</guid>
<date>Wed, 06 Jan 2010 15:00:00 GMT+00:00</date>
<date>Thu, 07 Jan 2010 15:00:00 GMT+00:00</date>
<date>Fri, 08 Jan 2010 15:00:00 GMT+00:00</date>
<date>Sat, 09 Jan 2010 15:00:00 GMT+00:00</date>
</item>
<item>
<title>Bogus date values</title>
<guid>1234567892</guid>
<date>Wed, 36 Jan 2010 15:00:00 GMT+00:00</date>
<date>Foo, 07 Bar 2010 95:00:00 GMT+00:00</date>
<date>This is just pure bogus. No date here!</date>
</item>
<item>
<title>Single date value</title>
<guid>1234567894</guid>
<date>Wed, 06 Jan 2010 14:00:00 GMT+00:00</date>
</item>
</items>
...@@ -39,11 +39,33 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase { ...@@ -39,11 +39,33 @@ class FeedsMapperDateTestCase extends FeedsMapperTestCase {
//'datetime' => 'datetime', // REMOVED because the field is broken ATM. //'datetime' => 'datetime', // REMOVED because the field is broken ATM.
)); ));
// Hack to get date fields to not round to every 15 minutes.
foreach (array('date', 'datestamp') as $field) {
$field = 'field_' . $field;
$edit = array(
'widget_type' => 'date_select',
);
$this->drupalPost('admin/structure/types/manage/' . $typename . '/fields/' . $field . '/widget-type', $edit, 'Continue');
$edit = array(
'instance[widget][settings][increment]' => 1,
);
$this->drupalPost('admin/structure/types/manage/' . $typename . '/fields/' . $field, $edit, 'Save settings');
$edit = array(
'widget_type' => 'date_text',
);
$this->drupalPost('admin/structure/types/manage/' . $typename . '/fields/' . $field . '/widget-type', $edit, 'Continue');
}
// Create and configure importer. // Create and configure importer.
$this->createImporterConfiguration('Date RSS', 'daterss'); $this->createImporterConfiguration('Date RSS', 'daterss');
$this->setSettings('daterss', NULL, array('content_type' => '', 'import_period' => FEEDS_SCHEDULE_NEVER)); $this->setSettings('daterss', NULL, array(
'content_type' => '',
'import_period' => FEEDS_SCHEDULE_NEVER,
));
$this->setPlugin('daterss', 'FeedsFileFetcher'); $this->setPlugin('daterss', 'FeedsFileFetcher');
$this->setSettings('daterss', 'FeedsNodeProcessor', array('bundle' => $typename)); $this->setSettings('daterss', 'FeedsNodeProcessor', array(
'bundle' => $typename,
));
$this->addMappings('daterss', array( $this->addMappings('daterss', array(
0 => array( 0 => array(
'source' => 'title', 'source' => 'title',
......
<?php
/**
* @file
* Test case for CCK date multi-field mapper mappers/date.inc.
*/
/**
* Class for testing Feeds <em>content</em> mapper.
*
* @todo: Add test method iCal
* @todo: Add test method for end date
*/
class FeedsMapperDateMultipleTestCase extends FeedsMapperTestCase {
public static function getInfo() {
return array(
'name' => 'Mapper: Date, multi value fields',
'description' => 'Test Feeds Mapper support for CCK multi valiue Date fields.',
'group' => 'Feeds',
'dependencies' => array('date', 'feeds_xpathparser'),
);
}
public function setUp() {
parent::setUp(array('date_api', 'date', 'feeds_xpathparser'));
variable_set('date_default_timezone', 'UTC');
}
/**
* Testing import by loading a 4 item XML file.
*/
public function test() {
$this->drupalGet('admin/config/regional/settings');
// Create content type.
$typename = $this->createContentType(array(), array(
'date' => 'date',
));
// Make the field hold unlimited values
$edit = array(
'field[cardinality]' => -1,
);
$this->drupalPost('admin/structure/types/manage/' . $typename . '/fields/field_date', $edit, 'Save settings');
$this->assertText('Saved date_date_label configuration');
// Create and configure importer.
$this->createImporterConfiguration('Multi dates', 'multidates');
$this->setSettings('multidates', NULL, array(
'content_type' => '',
'import_period' => FEEDS_SCHEDULE_NEVER,
));
$this->setPlugin('multidates', 'FeedsFileFetcher');
$this->setPlugin('multidates', 'FeedsXPathParserXML');
$this->setSettings('multidates', 'FeedsNodeProcessor', array(
'bundle' => $typename,
));
$this->addMappings('multidates', array(
0 => array(
'source' => 'xpathparser:0',
'target' => 'title',
),
1 => array(
'source' => 'xpathparser:1',
'target' => 'guid',
),
2 => array(
'source' => 'xpathparser:2',
'target' => 'field_date:start',
),
));
$edit = array(
'xpath[context]' => '//item',
'xpath[sources][xpathparser:0]' => 'title',
'xpath[sources][xpathparser:1]' => 'guid',
'xpath[sources][xpathparser:2]' => 'date',
'xpath[allow_override]' => FALSE,
);
$this->setSettings('multidates', 'FeedsXPathParserXML', $edit);
$edit = array(
'allowed_extensions' => 'xml',
'directory' => 'public://feeds',
);
$this->setSettings('multidates', 'FeedsFileFetcher', $edit);
// Import XML file.
$this->importFile('multidates', $this->absolutePath() . '/tests/feeds/multi-date.xml');
$this->assertText('Created 4 nodes');
// Check the imported nodes.
$values = array(
1 => array(
'01/06/2010 - 15:00',
'01/07/2010 - 15:15',
),
2 => array(
'01/06/2010 - 15:00',
'01/07/2010 - 15:00',
'01/08/2010 - 15:00',
'01/09/2010 - 15:00',
),
3 => array(
'', // Bogus date was filtered out.
),
4 => array(
'01/06/2010 - 14:00',
)
);
foreach ($values as $v => $key) {
$this->drupalGet("node/$v/edit");
foreach ($key as $delta => $value) {
$this->assertFieldById('edit-field-date-und-' . $delta . '-value-date', $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