### Eclipse Workspace Patch 1.0
#P CCK 6.x
Index: modules/nodereference/nodereference.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/modules/nodereference/nodereference.module,v
retrieving revision 1.138.2.21
diff -u -r1.138.2.21 nodereference.module
--- modules/nodereference/nodereference.module	15 Aug 2008 14:16:13 -0000	1.138.2.21
+++ modules/nodereference/nodereference.module	22 Aug 2008 16:55:53 -0000
@@ -190,14 +190,37 @@
 function nodereference_field($op, &$node, $field, &$items, $teaser, $page) {
   switch ($op) {
     case 'validate':
-      $refs = _nodereference_potential_references($field);
-      foreach ($items as $delta => $item) {
-        if (is_array($item)) {
-          $error_element = isset($item['_error_element']) ? $item['_error_element'] : '';
-          unset($item['_error_element']);
-          if (!empty($item['nid'])) {
-            if (!isset($refs[$item['nid']])) {
-              form_set_error($error_element, t("%name: this post can't be referenced.", array('%name' => t($field['widget']['label']))));
+      if (_nodereference_views_mode($field)) {
+        // Referenceable nodes defined by a View.
+        $refs = _nodereference_potential_references($field);
+        foreach ($items as $delta => $item) {
+          if (is_array($item)) {
+            $error_element = isset($item['_error_element']) ? $item['_error_element'] : '';
+            unset($item['_error_element']);
+            if (!empty($item['nid'])) {
+              if (!isset($refs[$item['nid']])) {
+                form_set_error($error_element, t("%name: this post can't be referenced.", array('%name' => t($field['widget']['label']))));
+              }
+            }
+          }
+        }
+      }
+      else {
+        // Referenceable nodes defined by content type :
+        // Let's be smart and avoid retrieveing all referenceable nodes.
+        static $node_types = array();
+        foreach ($items as $delta => $item) {
+          if (is_array($item)) {
+            $error_element = isset($item['_error_element']) ? $item['_error_element'] : '';
+            unset($item['_error_element']);
+            if (!empty($item['nid'])) {
+              $nid = $item['nid'];
+              if (!isset($node_types[$nid])) {
+                $node_types[$nid] = db_result(db_query('SELECT type FROM {node} WHERE nid = %d', $nid));
+              }
+              if (!in_array($node_types[$nid], array_filter($field['referenceable_types']))) {
+                form_set_error($error_element, t("%name: this post can't be referenced.", array('%name' => t($field['widget']['label']))));
+              }
             }
           }
         }
@@ -641,6 +664,13 @@
 }
 
 /**
+ * Helper function : is the field using 'advanced - Views mode' ?
+ */
+function _nodereference_views_mode($field) {
+  return (module_exists('views') && !empty($field['advanced_view']) && $field['advanced_view'] != '--');
+}
+
+/**
  * Fetch an array of all candidate referenced nodes.
  *
  * This info is used in various places (aloowed values, autocomplete results,
@@ -671,7 +701,7 @@
 
   if (!isset($results[$field['field_name']][$string][$exact_string])) {
     $references = FALSE;
-    if (module_exists('views') && !empty($field['advanced_view']) && $field['advanced_view'] != '--') {
+    if (_nodereference_views_mode($field)) {
       $references = _nodereference_potential_references_views($field, $string, $exact_string);
     }
     // If the view doesn't exist, we got FALSE, and fallback to the regular 'standard mode'.
