summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/common.inc12
-rw-r--r--modules/simpletest/tests/common.test10
2 files changed, 19 insertions, 3 deletions
diff --git a/includes/common.inc b/includes/common.inc
index c1dc6f8f2..7b97fe67d 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -3493,11 +3493,19 @@ function element_children(&$elements, $sort = FALSE) {
}
}
}
- // Sort the element if necessary.
+ // Sort the children if necessary.
if ($sort && $sortable) {
uasort($children, 'element_sort');
+ // Put the sorted children back into $elements in the correct order, to
+ // preserve sorting if the same element is passed through
+ // element_children() twice.
+ foreach ($children as $key => $child) {
+ unset($elements[$key]);
+ $elements[$key] = $child;
+ }
+ $elements['#sorted'] = TRUE;
}
- $elements['#sorted'] = TRUE;
+
return array_keys($children);
}
diff --git a/modules/simpletest/tests/common.test b/modules/simpletest/tests/common.test
index 209b4503d..3aa248e6b 100644
--- a/modules/simpletest/tests/common.test
+++ b/modules/simpletest/tests/common.test
@@ -542,7 +542,15 @@ class DrupalRenderUnitTestCase extends DrupalWebTestCase {
// Confirm that the $elements array has '#sorted' set to TRUE.
$this->assertTrue($elements['#sorted'], t("'#sorted' => TRUE was added to the array"));
- // Now the same array structure, but with #sorted set to TRUE.
+ // Pass $elements through element_children() and ensure it remains
+ // sorted in the correct order. drupal_render() will return an empty string
+ // if used on the same array in the same request.
+ $children = element_children($elements);
+ $this->assertTrue(array_shift($children) == 'first', t('Child found in the correct order.'));
+ $this->assertTrue(array_shift($children) == 'second', t('Child found in the correct order.'));
+
+
+ // The same array structure again, but with #sorted set to TRUE.
$elements = array(
'second' => array(
'#weight' => 10,