#819816: sort fields even when they implement a custom handling of multiple values.

From: Damien Tournoud <damien@commerceguys.com>


---
 field/field.default.inc |    6 ++----
 field/field.module      |   14 ++++----------
 2 files changed, 6 insertions(+), 14 deletions(-)

diff --git modules/field/field.default.inc modules/field/field.default.inc
index 549ac20..b4e885b 100644
--- modules/field/field.default.inc
+++ modules/field/field.default.inc
@@ -65,12 +65,10 @@ function field_default_validate($entity_type, $entity, $field, $instance, $langc
 }
 
 function field_default_submit($entity_type, $entity, $field, $instance, $langcode, &$items, $form, &$form_state) {
-  // Reorder items to account for drag-n-drop reordering.
-  if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) {
-    $items = _field_sort_items($field, $items);
-  }
   // Filter out empty values.
   $items = _field_filter_items($field, $items);
+  // Reorder items to account for drag-n-drop reordering.
+  $items = _field_sort_items($field, $items);
 }
 
 /**
diff --git modules/field/field.module modules/field/field.module
index 06be61d..5958695 100644
--- modules/field/field.module
+++ modules/field/field.module
@@ -315,12 +315,9 @@ function _field_sort_items($field, $items) {
  * (copied form element_sort(), which acts on #weight keys)
  */
 function _field_sort_items_helper($a, $b) {
-  $a_weight = (is_array($a) && isset($a['_weight'])) ? $a['_weight'] : 0;
-  $b_weight = (is_array($b) && isset($b['_weight'])) ? $b['_weight'] : 0;
-  if ($a_weight == $b_weight) {
-    return 0;
-  }
-  return ($a_weight < $b_weight) ? -1 : 1;
+  $a_weight = (is_array($a) ? $a['_weight'] : 0;
+  $b_weight = (is_array($b) ? $b['_weight'] : 0;
+  return $b_weight - $a_weight;
 }
 
 /**
@@ -329,10 +326,7 @@ function _field_sort_items_helper($a, $b) {
 function _field_sort_items_value_helper($a, $b) {
   $a_weight = (is_array($a) && isset($a['_weight']['#value'])) ? $a['_weight']['#value'] : 0;
   $b_weight = (is_array($b) && isset($b['_weight']['#value'])) ? $b['_weight']['#value'] : 0;
-  if ($a_weight == $b_weight) {
-    return 0;
-  }
-  return ($a_weight < $b_weight) ? -1 : 1;
+  return $b_weight - $a_weight;
 }
 
 /**
