Index: feedapi_mapper.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedapi_mapper/feedapi_mapper.module,v
retrieving revision 1.1.2.7.2.23
diff -u -p -r1.1.2.7.2.23 feedapi_mapper.module
--- feedapi_mapper.module	30 Mar 2009 12:31:49 -0000	1.1.2.7.2.23
+++ feedapi_mapper.module	10 Apr 2009 20:36:19 -0000
@@ -26,6 +26,13 @@ function feedapi_mapper_menu() {
     'access callback' => 'feedapi_mapper_access_mapper',
     'access arguments' => array(1),
   );
+  $items['feedapi-mapper/delete/%node'] = array(
+    'page callback' => '_feedapi_mapper_delete',
+    'page arguments' => array(2),
+    'type' => MENU_CALLBACK,
+    'access callback' => 'feedapi_mapper_access_mapper',
+    'access arguments' => array(2),
+  );
   foreach (node_get_types() as $type) {
     $type_url_str = str_replace('_', '-', $type->type);
     $items['admin/content/node-type/'. $type_url_str .'/map'] = array(
@@ -36,7 +43,14 @@ function feedapi_mapper_menu() {
       'type' => MENU_LOCAL_TASK,
       'access callback' => 'feedapi_mapper_access_mapper',
       'access arguments' => array(3),
-      );
+    );
+    $items['feedapi-mapper/delete/'. $type_url_str] = array(
+      'page callback' => '_feedapi_mapper_delete',
+      'page arguments' => array(2),
+      'type' => MENU_CALLBACK,
+      'access callback' => 'feedapi_mapper_access_mapper',
+      'access arguments' => array(3),
+    );
   }
   return $items;
 }
@@ -197,6 +211,27 @@ function feedapi_mapper_form($form_state
   if (!$mapping = _feedapi_mapper_load_mapping($node->nid )) {
     $mapping = _feedapi_mapper_load_mapping($node->type);
   }
+  
+  $rows = array();
+  $param = isset($node->nid) ? $node->nid : $node->type;
+  foreach ($mapping as $node_field => $feed) {
+    $rows[] = array('node' => join('->', unserialize($node_field)), 'feed' => join('->', unserialize($feed)), 'delete' => l(t('Delete'), 'feedapi-mapper/delete/'. $param .'/'. base64_encode($node_field)));
+  }
+  if (count($rows) > 0) {
+    $current_map = theme('table', array('node' => t('Feed item'), 'feed' => t('Node'), 'delete' => ''), $rows);
+  }
+  
+  if (isset($current_map)) {
+    $form['current_map'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Current mapping'),
+      '#collapsible' => TRUE,
+      '#collapsed' => count($rows) > 0 ? FALSE : TRUE,
+    );
+    $form['current_map']['map'] = array(
+      '#value' => $current_map,
+    );
+  }
 
   if ($merged_item) {
     $form['feed_item'] = array(
@@ -232,23 +267,25 @@ function feedapi_mapper_form($form_state
       '#value' => $descriptions,
     );
   }
-  // Create mapping form.
-  $form['mapping'] = array(
+  
+  $form['map'] = array(
     '#type' => 'fieldset',
-    '#title' => t('Edit mapping'),
-    '#description' => t('This is a list of feed item elements that are available for mapping. Choose a mapping from the drop down to map a feed item element to a node field.'),
-    '#collapsible' => TRUE,
-    '#collapsed' => FALSE,
-    '#tree' => TRUE,
+    '#title' => t('Define a relationship between feed attributes and CCK fields'),
   );
-  foreach ($elements as $element_name => $path) {
-    $form['mapping'][$element_name] = array(
+  $form['map']['map_a'] = array(
       '#type' => 'select',
-      '#title' => $element_name,
+      '#title' => t('Node item'),
       '#options' => $field_mappers,
-      '#default_value' => isset($mapping[$path]) ? $mapping[$path] : '',
     );
-  }
+    $form['map']['map_b'] = array(
+      '#type' => 'select',
+      '#title' => t('Parsed feed item'),
+      '#options' => array_flip($elements),
+    );
+    $form['map']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Add'),
+    );
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Update'),
@@ -260,7 +297,7 @@ function feedapi_mapper_form($form_state
  * Submit hook.
  */
 function feedapi_mapper_form_submit($form, &$form_state) {
-  _feedapi_mapper_store_mapping($form_state['values']['nid'], $form_state['values']['mapping'], $form_state['values']['elements']);
+  _feedapi_mapper_store_mapping($form_state['values']['nid'], array($form_state['values']['map_b'] => $form_state['values']['map_a']), $form_state['values']['elements']);
 }
 
 /**
@@ -273,27 +310,44 @@ function feedapi_mapper_form_submit($for
  *   All elements of feed item.
  */
 function _feedapi_mapper_store_mapping($param, $mapping, $elements) {
-  // Wrap the mapping array (element_name => node_field)
-  // and the elements array (element_name => element_path)
-  // arrays into one:
-  // We store a mapping as element_path => node_field.
-  // - element_path and node_field are both a serialized array.
-  $stored_mapping = array();
-  foreach ($mapping as $element_name => $field) {
-    if ($field) {
-      $stored_mapping[$elements[$element_name]] = $field;
-    }
+  // Get the current mapping
+  if (is_numeric($param)) {
+    $existing_mapping = unserialize(db_result(db_query('SELECT mapping FROM {feedapi_mapper} WHERE nid = %d', $param)));
+  }
+  else if (is_string($param)) {
+    $existing_mapping = variable_set('feedapi_mapper_mapping_'. $param, array());
+  }
+  
+  // Add the newly defined mapping to the current
+  if (is_array($existing_mapping) && is_array($mapping)) {
+    $mapping = array_merge($existing_mapping, $mapping);
   }
+  
   if (is_numeric($param)) {
-    if (db_result(db_query('SELECT * FROM {feedapi_mapper} WHERE nid = %d', $param))) {
-      db_query('UPDATE {feedapi_mapper} SET mapping = \'%s\' WHERE nid = %d', serialize($stored_mapping), $param);
+    if (db_result(db_query('SELECT COUNT(*) FROM {feedapi_mapper} WHERE nid = %d', $param))) {
+      db_query('UPDATE {feedapi_mapper} SET mapping = \'%s\' WHERE nid = %d', serialize($mapping), $param);
     }
     else {
-      db_query('INSERT INTO {feedapi_mapper} (nid, mapping) VALUES (%d, \'%s\')', $param, serialize($stored_mapping));
+      db_query('INSERT INTO {feedapi_mapper} (nid, mapping) VALUES (%d, \'%s\')', $param, serialize($mapping));
     }
   }
   else if (is_string($param)) {
-    variable_set('feedapi_mapper_mapping_'. $param, $stored_mapping);
+    variable_set('feedapi_mapper_mapping_'. $param, $mapping);
+  }
+}
+
+/**
+ * Deletes the mapping from
+ *
+ */
+function _feedapi_mapper_delete($param) {
+  $key = base64_decode(arg(3));
+  if (isset($param->nid)) {
+    $existing_mapping = unserialize(db_result(db_query('SELECT mapping FROM {feedapi_mapper} WHERE nid = %d', $param->nid)));
+    unset($existing_mapping[$key]);
+    db_query('UPDATE {feedapi_mapper} SET mapping = \'%s\' WHERE nid = %d', serialize($existing_mapping), $param->nid);
+    drupal_set_message(t('The mapping entry has been deleted successfully'));
+    drupal_goto("node/{$param->nid}/map");
   }
 }
 
@@ -549,7 +603,6 @@ function _feedapi_mapper_array_merge_rec
 function _feedapi_mapper_get_field_mappers($node_type) {
   $field_names = _feedapi_mapper_get_field_names($node_type);
   $node->type = $node_type;
-  $field_mappers[0] = t('No mapping');
 
   // Load all available mappers and create an array of fields available as mapping target.
   _feedapi_mapper_load_mappers();
? mappers/feedapi_mapper_nodereference_meta.inc
? mappers/mappers
