From dc2655cc0e4fdd71876b416f0c5a84536d825b98 Mon Sep 17 00:00:00 2001
From: Alex Barth <alex_b@53995.no-reply.drupal.org>
Date: Sun, 18 Jul 2010 19:06:10 +0000
Subject: [PATCH] #838018 infojunkie: Mapper for Formatted Number CCK field.

---
 CHANGELOG.txt                            |   1 +
 mappers/formatted_number.inc             |  54 ++++++++++++
 tests/feeds_mapper_formatted_number.test | 102 +++++++++++++++++++++++
 3 files changed, 157 insertions(+)
 create mode 100644 mappers/formatted_number.inc
 create mode 100644 tests/feeds_mapper_formatted_number.test

diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index eddb5940..e89090da 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -3,6 +3,7 @@
 Feeds 6.x 1.X XXXX
 ------------------
 
+- #838018 infojunkie: Mapper for Formatted Number CCK field.
 - #856408 c.ex: Pass all $targets for hook_feeds_node_processor_targets_alter()
   by reference.
 - #853194 andrewlevine, alex_b: Mapping: don't reset all targets.
diff --git a/mappers/formatted_number.inc b/mappers/formatted_number.inc
new file mode 100644
index 00000000..f2647630
--- /dev/null
+++ b/mappers/formatted_number.inc
@@ -0,0 +1,54 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * On behalf implementation of Feeds mapping API for Formatted Number CCK.
+ */
+
+/**
+ * Implementation of feeds_node_processor_target_alter().
+ */
+function formatted_number_feeds_node_processor_targets_alter(&$targets, $content_type) {
+  if (module_exists('formatted_number')) {
+    $info = content_types($content_type);
+    $fields = array();
+    if (isset($info['fields']) && count($info['fields'])) {
+      foreach ($info['fields'] as $field_name => $field) {
+        if (in_array($field['type'], array_keys(formatted_number_get_fields_info()))) {
+          $fields[$field_name] = isset($field['widget']['label']) ? $field['widget']['label'] : $field_name;
+        }
+      }
+    }
+    foreach ($fields as $k => $name) {
+      $targets[$k] = array(
+        'name' => $name,
+        'callback' => 'formatted_number_feeds_set_target',
+        'description' => t('The CCK !name field of the node.', array('!name' => $name)),
+      );
+    }
+  }
+}
+
+/**
+ * Set the CCK field target after import.
+ */
+function formatted_number_feeds_set_target($node, $target, $value) {
+  $field = isset($node->$target) ? $node->$target : array();
+
+  // Handle multiple value fields.
+  if (is_array($value)) {
+    $i = 0;
+    foreach ($value as $v) {
+      if (!is_array($v) && !is_object($v)) {
+        $field[$i]['value'] = parse_formatted_number($v, TRUE);
+      }
+      $i++;
+    }
+  }
+  else {
+    $field[0]['value'] = parse_formatted_number($value, TRUE);
+  }
+
+  $node->$target = $field;
+}
diff --git a/tests/feeds_mapper_formatted_number.test b/tests/feeds_mapper_formatted_number.test
new file mode 100644
index 00000000..76a6b227
--- /dev/null
+++ b/tests/feeds_mapper_formatted_number.test
@@ -0,0 +1,102 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Test case for simple CCK field mapper mappers/content.inc.
+ */
+
+require_once(drupal_get_path('module', 'feeds') . '/tests/feeds_mapper_test.inc');
+
+/**
+ * Class for testing Feeds <em>formatted_number</em> mapper.
+ */
+class FeedsMapperFormattedNumberTestCase extends FeedsMapperTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => t('Mapper: Formatted Number'),
+      'description' => t('Test Feeds Mapper support for Formatted Number CCK fields. <strong>Requires CCK, Format Number API and Formatted Number CCK modules</strong>.'),
+      'group' => t('Feeds'),
+    );
+  }
+
+  /**
+   * Set up the test.
+   */
+  function setUp() {
+    // Call parent setup with required modules.
+    parent::setUp('feeds', 'feeds_ui', 'ctools', 'content', 'format_number', 'formatted_number');
+
+    // Create user and login.
+    $this->drupalLogin($this->drupalCreateUser(
+        array(
+          'administer content types',
+          'administer feeds',
+          'administer nodes',
+          'administer site configuration'
+        )
+    ));
+  }
+
+  /**
+   * Basic test loading a doulbe entry CSV file.
+   */
+  function test() {
+
+    // Create content type.
+    $typename = $this->createContentType(NULL, array(
+      'beta' => array('type' => 'formatted_integer', 'widget' => 'formatted_number'),
+      'gamma' => array('type' => 'formatted_decimal', 'widget' => 'formatted_number'),
+      'delta' => array('type' => 'formatted_float', 'widget' => 'formatted_number'),
+    ));
+
+    // Create and configure importer.
+    $this->createFeedConfiguration('Content CSV', 'csv');
+    $this->setSettings('csv', NULL, array('content_type' => '','import_period' => FEEDS_SCHEDULE_NEVER,));
+    $this->setPlugin('csv', 'FeedsFileFetcher');
+    $this->setPlugin('csv', 'FeedsCSVParser');
+    $this->setSettings('csv', 'FeedsNodeProcessor', array('content_type' => $typename));
+    $this->addMappings('csv', array(
+      array(
+        'source' => 'title',
+        'target' => 'title',
+      ),
+      array(
+        'source' => 'created',
+        'target' => 'created',
+      ),
+      array(
+        'source' => 'body',
+        'target' => 'body',
+      ),
+      array(
+        'source' => 'beta',
+        'target' => 'field_beta',
+      ),
+      array(
+        'source' => 'gamma',
+        'target' => 'field_gamma',
+      ),
+      array(
+        'source' => 'delta',
+        'target' => 'field_delta',
+      ),
+    ));
+
+    // Import CSV file.
+    $this->importFile('csv', $this->absolutePath() .'/tests/feeds/content.csv');
+    $this->assertText('Created 2 '. $typename .' nodes.');
+
+    // Check the two imported files.
+    $this->drupalGet('node/1/edit');
+    $this->assertCCKFieldValue('beta', '42');
+    $this->assertCCKFieldValue('gamma', '4.20');
+    $this->assertCCKFieldValue('delta', '3.14');
+
+    $this->drupalGet('node/2/edit');
+    $this->assertCCKFieldValue('beta', '32');
+    $this->assertCCKFieldValue('gamma', '1.20');
+    $this->assertCCKFieldValue('delta', '5.63');
+  }
+}
-- 
GitLab