? nodereference_url-428988.patch
Index: nodereference_url.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodereference_url/nodereference_url.module,v
retrieving revision 1.27
diff -u -p -r1.27 nodereference_url.module
--- nodereference_url.module	7 Apr 2010 07:10:25 -0000	1.27
+++ nodereference_url.module	25 Apr 2010 02:12:07 -0000
@@ -22,8 +22,6 @@ function nodereference_url_theme() {
  */
 function nodereference_url_form_alter(&$form, &$form_state, $form_id) {
   if ($form_id == 'content_field_edit_form' && isset($form['#field']) && $form['#field']['widget']['type'] == 'nodereference_url') {
-    // Hide settings that don't apply to this widget.
-    $form['field']['multiple']['#type'] = 'value';
     $form['widget']['description']['#title'] = t('Fallback widget help text');
     $form['widget']['description']['#weight'] = -1;
   }
@@ -35,13 +33,21 @@ function nodereference_url_form_alter(&$
 function nodereference_url_widget_info() {
   return array(
     'nodereference_url' => array(
-      'label' => t('Reference from URL'),
+      'label' => t('Reference from URL (fallback: select)'),
       'field types' => array('nodereference'),
       'multiple values' => CONTENT_HANDLE_MODULE,
       'callbacks' => array(
         'default value' => CONTENT_CALLBACK_NONE,
       ),
     ),
+    'nodereference_url_autocomplete' => array(
+      'label' => t('Reference from URL (fallback: autocomplete)'),
+      'field types' => array('nodereference'),
+      'multiple values' => CONTENT_HANDLE_CORE,
+      'callbacks' => array(
+        'default value' => CONTENT_CALLBACK_NONE,
+      ),
+    ),
   );
 }
 
@@ -69,7 +75,8 @@ function nodereference_url_build_all_lin
   $fields = content_fields();
   foreach ($fields as $field_name => $field) {
     foreach (_nodereference_url_field_instances($field_name) as $target_type => $instance) {
-      if ($instance['widget']['type'] == 'nodereference_url') {
+      if ($instance['widget']['type'] == 'nodereference_url' 
+        || $instance['widget']['type'] == 'nodereference_url_autocomplete') {
         $link_settings = $instance['widget']['node_link'];
         if (($link_settings['teaser'] && $teaser == TRUE) || ($link_settings['full'] && $teaser == FALSE)) {
           if ($link = nodereference_url_build_link($node, $instance, $teaser)) {
@@ -238,17 +245,34 @@ function nodereference_url_widget_settin
           '#type' => 'radios',
           '#title' => t('Fallback behavior'),
           '#options' => array(
-            'autocomplete' => t('Use autocomplete widget'),
             'select' => t('Use select list widget'),
             'page_not_found' => t('Display page not found error'),
             'leave_blank' => t('Leave the field blank'),
           ),
-          '#default_value' => isset($widget['fallback']) ? $widget['fallback'] : 'autocomplete',
+          '#default_value' => isset($widget['fallback']) ? $widget['fallback'] : 'select',
           '#description' => t('If no content is referenced in the URL, determine how the form should be handled.'),
           '#required' => TRUE,
           '#element_validate' => array('nodereference_url_fallback_validate'),
           '#weight' => -3,
         );
+      } elseif ($widget['type'] == 'nodereference_url_autocomplete') {
+         $form['fallback'] = array(
+          '#type' => 'radios',
+          '#title' => t('Fallback behavior'),
+          '#options' => array(
+            'autocomplete' => t('Use autocomplete widget'),
+            'page_not_found' => t('Display page not found error'),
+            'leave_blank' => t('Leave the field blank'),
+          ),
+          '#default_value' => isset($widget['fallback']) ? $widget['fallback'] : 'autocomplete',
+          '#description' => t('If no content is referenced in the URL, determine how the form should be handled.'),
+          '#required' => TRUE,
+          '#element_validate' => array('nodereference_url_fallback_validate'),
+          '#weight' => -3,
+        );     
+      
+      }
+      if ($widget['type'] == 'nodereference_url' || $widget['type'] == 'nodereference_url_autocomplete') {
         $form['edit_fallback'] = array(
           '#type' => 'checkbox',
           '#title' => t('Use fallback behavior when editing content'),
@@ -314,16 +338,6 @@ function nodereference_url_fallback_vali
 }
 
 /**
- * FAPI #element_validate callback for the nodereference_autocomplete widget.
- *
- * This function doesn't actually validate, it just reformats form_state value
- * into an array of a suitable format for nodereference module
- */
-function nodereference_url_autocomplete_validate($element, &$form_state) {
-  form_set_value($element, array($form_state['values'][$element['#field_name']]), $form_state);
-}
-
-/**
  * Element validation function that makes title required when creating a link.
  */
 function nodereference_url_node_link_validate($element, &$form_state) {
@@ -341,10 +355,9 @@ function nodereference_url_widget(&$form
   $field_name = $field['field_name'];
   $field_name_url = preg_replace('/^field_/', '', $field_name);
   $referenced_nid = NULL;
-
   // Check for an existing NID.
-  if (isset($items[0]['nid']) && is_numeric($items[0]['nid'])) {
-    $referenced_nid = $items[0]['nid'];
+  if (isset($items[$delta]['nid']) && is_numeric($items[$delta]['nid'])) {
+    $referenced_nid = $items[$delta]['nid'];
   }
   // Check for a reference in the query string.
   elseif (isset($_GET[$field_name_url]) && is_numeric($_GET[$field_name_url])) {
@@ -352,7 +365,7 @@ function nodereference_url_widget(&$form
   }
   // Pull from the URL.
   else {
-    $referenced_nid = nodereference_url_get_nid($field_name);
+    $referenced_nid = nodereference_url_get_nid($field_name, $delta);
   }
 
   // Check that the NID is a valid reference.
@@ -362,15 +375,14 @@ function nodereference_url_widget(&$form
       $referenced_nid = NULL;
     }
   }
-
+  
   // If no NID is available or editing this field, use the fallback behavior.
-  if (empty($referenced_nid) || (!empty($field['widget']['edit_fallback']) && !empty($items))) {
+  if (empty($referenced_nid) || (!(empty($form['#node']->nid) && $delta == 0) && !empty($field['widget']['edit_fallback']) && !empty($items))) {
     // If not on a node/add page (such as editing a node that does not yet have
-    // a reference), switch to using an autocomplete widget.
-    if (in_array($field['widget']['fallback'], array('page_not_found', 'leave_blank')) && nodereference_url_get_nid($field_name) === FALSE) {
-      $field['widget']['fallback'] = 'autocomplete';
+    // a reference), switch to using an select or autocomplete widget.
+    if (in_array($field['widget']['fallback'], array('page_not_found', 'leave_blank')) && nodereference_url_get_nid($field_name, $delta) === FALSE) {
+      $field['widget']['fallback'] = ($field['widget']['type'] == 'nodereference_url'?'select':'autocomplete');
     }
-
     // Page not found error.
     // Check for the form_build_id to prevent throwing a page not found on
     // manual builds. See http://drupal.org/node/397606.
@@ -399,14 +411,23 @@ function nodereference_url_widget(&$form
   }
 
   if (isset($referenced_nid) && (empty($element['#type']))) {
-    $element[0]['nid'] = array(
-      '#title' => $field['widget']['label'],
-      '#type' => 'nodereference_url',
-      '#field_name' => $field_name,
-      '#default_value' => $referenced_nid,
-    );
-  }
+    if ($field['widget']['type'] == 'nodereference_url') {
+      $element[0]['nid'] = array(
+        '#title' => $field['widget']['label'],
+        '#type' => 'nodereference_url',
+        '#field_name' => $field_name,
+        '#default_value' => $referenced_nid,
+      );
+    } else {
+       $element['nid'] = array(
+        '#title' => $field['widget']['label'],
+        '#type' => 'nodereference_url',
+        '#field_name' => $field_name,
+        '#default_value' => $referenced_nid,
+      );
 
+    }
+  }
   return $element;
 }
 
@@ -457,22 +478,31 @@ function nodereference_url_process_selec
 /**
  * Check the current URL and pull the referenced node from it.
  */
-function nodereference_url_get_nid($field_name) {
+function nodereference_url_get_nid($field_name, $delta) {
+  $args_seen = array();
   $add_urls = variable_get('nodereference_url_paths', array('node/add/%type/%nid'));
   $field_name_url = preg_replace('/^field_/', '', $field_name);
   $referenced_nid = NULL;
-
+  
   foreach ($add_urls as $url) {
     $args = explode('/', $url);
     foreach ($args as $part => $arg) {
       // Set the target NID if matching on this part of the URL.
       if ($arg == '%nid') {
-        $referenced_nid = arg($part);
+        
+        
+        if ($delta == $args_seen[$arg]){
+          $referenced_nid = arg($part);
+        }
+        $args_seen[$arg]++;
       }
       // Set the target NID based on the field name, allowing for multiple
       // references in the same URL.
       elseif ($arg == '%' . $field_name_url) {
-        $referenced_nid = arg($part);
+        if ($delta == $args_seen[$arg]){
+          $referenced_nid = arg($part);
+        }
+        $args_seen[$arg]++;
       }
       // Skip any other wildcards in the URL.
       elseif (strpos($arg, '%') === 0) {
