diff --git a/content.module b/content.module index 1b73434f0d55272d4976c5c8fd1a3cac186188f7..c6cab76a9d12327cbc9cb32a01a8fe0550f68290 100644 --- a/content.module +++ b/content.module @@ -789,11 +789,23 @@ function _content_field_invoke_default($op, &$node, $teaser = NULL, $page = NULL } elseif (count($type['fields'])) { foreach ($type['fields'] as $field) { - $node_field = isset($node->$field['field_name']) ? $node->$field['field_name'] : array(); + $items = isset($node->$field['field_name']) ? $node->$field['field_name'] : array(); + + // Don't save empty items. + if ($op == 'presave') { + foreach ((array) $items as $delta => $item) { + $widget_types = _content_widget_types(); + $module = $widget_types[$field['widget']['type']]['module']; + $is_empty = $module .'_content_is_empty'; + if ($delta > 0 && $is_empty($item, $field)) { + unset($items[$delta]); + } + } + } $db_info = content_database_info($field); if (count($db_info['columns'])) { - $result = content_field($op, $node, $field, $node_field, $teaser, $page); + $result = content_field($op, $node, $field, $items, $teaser, $page); if (is_array($result)) { $return = array_merge($return, $result); } @@ -802,7 +814,7 @@ function _content_field_invoke_default($op, &$node, $teaser = NULL, $page = NULL } } if (isset($node->$field['field_name'])) { - $node->$field['field_name'] = $node_field; + $node->$field['field_name'] = $items; } } } diff --git a/content_views.inc b/content_views.inc index 708545ba55412cac6d4f4614dbd05417fec4d4fd..2bb14e55fa8273b60f8c97b96eb0772acfe37ce9 100644 --- a/content_views.inc +++ b/content_views.inc @@ -144,6 +144,8 @@ function content_views_field_handler_group($field_info, $field_data, $value, $da foreach ($field_info['content_db_info']['columns'] as $column => $attributes) { $query_columns[] = "node_data_$field[field_name].$attributes[column] AS $column"; } + // Add node.nid to the beginning of the list to keep db_rewrite_sql() + // from mistakenly adding DISTINCT to nodereference fields. $query = "SELECT node.nid, ". implode(', ', $query_columns) . " FROM {node} node". " LEFT JOIN {". $field_info['content_db_info']['table'] ."} node_data_$field[field_name] ON node.vid = node_data_$field[field_name].vid". diff --git a/nodereference.module b/nodereference.module index 22744980441e820b138edc75fc7b6b4a06a6d179..7beb9fdd15a05c631132ad74ab6d32b087d95cf4 100644 --- a/nodereference.module +++ b/nodereference.module @@ -153,19 +153,17 @@ function nodereference_field($op, &$node, $field, &$items, $teaser, $page) { } } return; + } +} - // Don't save empty items. - case 'presave': - if (is_array($items)) { - foreach ($items as $delta => $item) { - if ($delta > 0 && empty($item)) { - unset($items[$delta]); - unset($node->{$field['field_name'][$delta]}); - } - } - } - break; +/** + * Implementation of hook_content_is_empty(). + */ +function nodeference_content_is_empty($item, $field) { + if (empty($item['nid'])) { + return TRUE; } + return FALSE; } /** diff --git a/number.module b/number.module index df6ed3d1988d0e52a9e3bd98f03447d7a5fe31f0..46ea275bbd08cd3647ecff7c1ef1aa9ebae1acfc 100644 --- a/number.module +++ b/number.module @@ -167,19 +167,17 @@ function number_field($op, &$node, $field, &$items, $teaser, $page) { } } break; + } +} - // Don't save empty items. - case 'presave': - if (is_array($items)) { - foreach ($items as $delta => $item) { - if ($delta > 0 && empty($item)) { - unset($items[$delta]); - unset($node->{$field['field_name'][$delta]}); - } - } - } - break; +/** + * Implementation of hook_content_is_empty(). + */ +function number_content_is_empty($item, $field) { + if (empty($item['value'])) { + return TRUE; } + return FALSE; } /** diff --git a/text.module b/text.module index fc59f133a07825b28869fd0e9fc387ea44f5b8fe..832109bae80f71bc81265e3f9e8f02e6e1042672 100644 --- a/text.module +++ b/text.module @@ -153,20 +153,19 @@ function text_field($op, &$node, $field, &$items, $teaser, $page) { } break; - // Don't save empty items. - case 'presave': - if (is_array($items)) { - foreach ($items as $delta => $item) { - if ($delta > 0 && empty($item)) { - unset($items[$delta]); - unset($node->{$field['field_name'][$delta]}); - } - } - } - break; } } +/** + * Implementation of hook_content_is_empty(). + */ +function text_content_is_empty($item, $field) { + if (empty($item['value'])) { + return TRUE; + } + return FALSE; +} + /** * Implementation of hook_field_formatter_info(). */ diff --git a/userreference.module b/userreference.module index 0f1e037ac47e4ee704deec6441a057d8300f6ebc..0ace4e5aa7c3d34603e39d71ecdb0cef8fb9af27 100644 --- a/userreference.module +++ b/userreference.module @@ -77,19 +77,17 @@ function userreference_field($op, &$node, $field, &$items, $teaser, $page) { } } return; + } +} - // Don't save empty items. - case 'presave': - if (is_array($items)) { - foreach ($items as $delta => $item) { - if ($delta > 0 && empty($item)) { - unset($items[$delta]); - unset($node->{$field['field_name'][$delta]}); - } - } - } - break; +/** + * Implementation of hook_content_is_empty(). + */ +function userreference_content_is_empty($item, $field) { + if (empty($item['uid'])) { + return TRUE; } + return FALSE; } /**