diff -rupN content.module content.module --- content.module 2008-11-10 16:56:35.000000000 +0100 +++ content.module 2008-11-26 17:37:30.000000000 +0100 @@ -495,7 +495,7 @@ function theme_content_multiple_values($ $items[] = &$element[$key]; } } - usort($items, '_content_sort_items_value_helper'); + uasort($items, '_content_sort_items_value_helper'); // Add the items as table rows. foreach ($items as $key => $item) { @@ -885,22 +885,37 @@ function content_field($op, &$node, $fie * returns filtered and adjusted item array */ function content_set_empty($field, $items) { - // Filter out empty values. + // Prepare an empty item. + $empty = array(); + foreach (array_keys($field['columns']) as $column) { + $empty[$column] = NULL; + } + + // Keep track of empty values. $filtered = array(); $function = $field['module'] .'_content_is_empty'; foreach ((array) $items as $delta => $item) { - if (!$function($item, $field)) { - $filtered[] = $item; - } + $filtered[$delta] = $function($item, $field) ? $empty : $item; } // Make sure we store the right number of 'empty' values. - $empty = array(); - foreach (array_keys($field['columns']) as $column) { - $empty[$column] = NULL; + if ($field['multiple'] == 1) { + // Remove last element if empty for multi-valued fields. + $last_item = end($filtered); + if ($function($last_item, $field)) { + unset($filtered[key($filtered)]); + } + } + else { + $pad = $field['multiple'] > 1 ? (int)$field['multiple'] : 1; + $count = count($filtered); + if ($count < $pad) { + $delta = max(array_keys($filtered)) + 1; + for ($i = $count; $i < $pad; $i++) { + $filtered[$delta++] = $empty; + } + } } - $pad = $field['multiple'] > 1 ? $field['multiple'] : 1; - $filtered = array_pad($filtered, $pad, $empty); return $filtered; } @@ -911,7 +926,7 @@ function content_set_empty($field, $item */ function _content_sort_items($field, $items) { if ($field['multiple'] >= 1 && isset($items[0]['_weight'])) { - usort($items, '_content_sort_items_helper'); + uasort($items, '_content_sort_items_helper'); foreach ($items as $delta => $item) { if (is_array($items[$delta])) { unset($items[$delta]['_weight']); @@ -994,7 +1009,14 @@ function content_storage($op, $node) { if (!isset($additions[$field_name])) { $additions[$field_name] = array(); } - $additions[$field_name][] = $item; + + // Preserve deltas when loading items from database. + if (isset($row['delta'])) { + $additions[$field_name][$row['delta']] = $item; + } + else { + $additions[$field_name][] = $item; + } } } } diff -rupN includes/content.node_form.inc includes/content.node_form.inc --- includes/content.node_form.inc 2008-10-04 15:14:21.000000000 +0200 +++ includes/content.node_form.inc 2008-11-26 13:54:19.000000000 +0100 @@ -157,21 +157,20 @@ function content_multiple_value_form(&$f switch ($field['multiple']) { case 0: + $deltas = array(0); $max = 0; break; case 1: $filled_items = content_set_empty($field, $items); - $current_item_count = isset($form_state['item_count'][$field_name]) - ? $form_state['item_count'][$field_name] - : count($items); + $deltas = array_keys($filled_items); // We always want at least one empty icon for the user to fill in. - $max = ($current_item_count > count($filled_items)) - ? $current_item_count - 1 - : $current_item_count; + $max = max($deltas) + 1; + $deltas[] = $max; break; default: $max = $field['multiple'] - 1; + $deltas = array_keys(array_fill(0, $field['multiple'], 0)); break; } @@ -186,7 +185,7 @@ function content_multiple_value_form(&$f ); $function = $field['widget']['module'] .'_widget'; - for ($delta = 0; $delta <= $max; $delta++) { + foreach ($deltas as $delta) { if ($element = $function($form, $form_state, $field, $items, $delta)) { $defaults = array( '#title' => ($field['multiple'] >= 1) ? '' : $title,