Index: mappers/og.inc
===================================================================
RCS file: mappers/og.inc
diff -N mappers/og.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ mappers/og.inc	3 Aug 2010 04:38:44 -0000
@@ -0,0 +1,185 @@
+<?php
+
+/**
+ * @file
+ * On behalf implementation of Feeds mapping API for organic groups.
+ */
+
+/**
+ * Implementation of hook_feeds_node_processor_targets_alter().
+ *
+ * @see FeedsNodeProcessor::getMappingTargets().
+ */
+function og_feeds_node_processor_targets_alter(&$targets, $content_type) {
+  $fields = array();
+  if (!og_is_omitted_type($content_type)) {
+    $fields['spaces_og_audience'] = 'Spaces OG Group';
+    $fields['og_groups'] = 'OG Group';
+    $fields['og_description'] = 'OG Description';
+  }
+  foreach ($fields as $k => $name) {
+    $targets[$k] = array(
+      'name' => $name,
+      'callback' => "og_feeds_set_target",
+      'description' => t('The !name of the node.', array('!name' => $name)),
+    );
+  }
+}
+
+/**
+ * Implementation of feeds_user_processor_targets_alter().
+ */
+function og_feeds_user_processor_targets_alter(&$targets) {
+    $targets['og_register'] = array(
+      'name' => 'Organic Group',
+      'callback' => 'og_feeds_set_user_target',
+      'description' => t('The user is assigned as a member of the organic group.'),
+    );
+    $targets['og_register_from_user'] = array(
+      'name' => 'Organic Group(s) from Importing User',
+      'callback' => 'og_feeds_set_user_target',
+      'description' => t('The user is assigned as a member of the importing users organic groups.'),
+    );
+}
+
+function og_feeds_user_processor_inheritors_alter(&$inheritors) {
+  if (module_exists('og')) {	
+    $inheritors['og'] = array(
+      'name' => t('Inherit organic group(s)'),
+      'description' => t('Imported users inherit organic group membership from feed node.'),
+      'callback' => 'og_feeds_user_inherit_target',
+    );
+  }
+}
+
+/**
+* Inherit OG properties.
+*/
+function og_feeds_user_inherit_target($feed_node, $new_user) {
+  if (in_array($feed_node->type, og_get_types('group'))) {
+    $new_user->og_register = array();
+    $gid = $feed_node->nid;
+    $new_user->og_register = array($gid => $gid);
+  } else {
+  	if (isset($feed_node->og_groups)) {
+      if (!isset($new_user->og_register)) {
+        $new_user->og_register = array();
+      }
+      $new_user->og_register = array_merge($feed_node->og_groups, $new_user->og_register);
+      foreach ($new_user->og_register as $gid) {
+        if ($gid != 0) {
+          $transformed_groups[$gid] = $gid;
+        }
+      }
+      $new_user->og_register = $transformed_groups;
+  	}
+  }
+}
+
+/**
+ * Implementation of hook_feeds_set_target().
+ *
+ * @param $node
+ *   The target node.
+ * @param $target
+ *   The name of field on the target node to map to.
+ * @param $value
+ *   The value to be mapped.
+ *
+ */
+function og_feeds_set_target($node, $target, $value) {
+  $field = isset($node->$target) ? $node->$target : array();
+
+  if (!is_array($value)) {
+    //$value = array($value);
+    // Support multiple values via newlines
+    $value = explode("\n", $value);
+  }
+  array_trim($value);
+
+  foreach ($value as $v) {
+  	switch($target) {
+  	  case "og_groups":
+  	  case "spaces_og_audience":
+	    if (!is_array($v) && !is_object($v)) {
+	      // Return list of possible exact matches for the title
+	      $nids = _og_feeds_potential_references($v, 'equals', 1);
+	      
+	      // Use the first element of the returned array
+	      switch($target) {
+	        case 'og_groups':
+	          $field[] = array(key($nids) => key($nids));
+	          break;
+	        case 'spaces_og_audience':
+	          $field = key($nids);
+	          break;
+	      }
+	    }
+	    break;
+	  case "og_description":
+	    $field = $v;
+	    break;
+    }
+  }
+
+  $node->$target = $field;
+}
+
+/**
+ * Set the user profile target after import.
+ */
+function og_feeds_set_user_target($account, $target, $value) {
+  global $user;
+  $i = 0;
+  
+  if (!is_array($value)) {
+    //$value = array($value);
+    // Support multiple values via newlines
+    $value = explode("\n", $value);
+  }
+  
+  switch($target) {
+    case 'og_register':
+      foreach ($value as $v) {
+		if (!is_array($v) && !is_object($v)) {
+		  // Return list of possible exact matches for the title
+		  $nids = _og_feeds_potential_references($v, 'equals', 1);		    
+	      $field[key($nids)] = key($nids);
+		}
+	  }
+      break;
+    case 'og_register_from_user':
+      $target = 'og_register';
+      foreach ($user->og_groups as $nid => $og_array) {
+	      $field[$nid] = $nid;
+	  }
+      break;
+  }
+  
+  $account->{$target} = $field;
+  return $account;
+}
+
+function _og_feeds_potential_references($value, $test = 'equals', $limit = NULL) {
+  switch($test) {
+    case 'equals':
+      $where_clause = " WHERE n.title = '%s'";
+      break;
+    default:
+      $where_clause = NULL;
+      break;
+  }    
+  $args[] = $value;
+
+  $sql = db_rewrite_sql("SELECT n.nid, n.title AS node_title, n.type AS node_type FROM {node} n $where_clause");
+  $result = $limit ? db_query_range($sql, $args, 0, $limit) : db_query($sql, $args);
+  $references = array();
+  while ($node = db_fetch_object($result)) {
+    $references[$node->nid] = array(
+      'title' => $node->node_title,
+      'rendered' => check_plain($node->node_title),
+    );
+  }
+
+  return $references;
+}
\ No newline at end of file
