summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/common.inc22
-rw-r--r--modules/comment/comment.module1
-rw-r--r--modules/taxonomy/taxonomy.module3
3 files changed, 18 insertions, 8 deletions
diff --git a/includes/common.inc b/includes/common.inc
index 2ecf25069..e33a5c187 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -3199,7 +3199,10 @@ function drupal_alter($type, &$data) {
*
* Recursively iterates over each of the array elements, generating HTML code.
* This function is usually called from within a another function, like
- * drupal_get_form() or node_view().
+ * drupal_get_form() or node_view(). Elements are sorted internally using
+ * uasort(). Since this is expensive, when passing already sorted elements to
+ * drupal_render(), for example from a database query, set
+ * $elements['#sorted'] = TRUE to avoid sorting them a second time.
*
* @param $elements
* The structured array describing the data to be rendered.
@@ -3207,6 +3210,7 @@ function drupal_alter($type, &$data) {
* The rendered HTML.
*/
function drupal_render(&$elements) {
+ // Early-return nothing if user does not have access.
if (!isset($elements) || (isset($elements['#access']) && !$elements['#access'])) {
return NULL;
}
@@ -3230,15 +3234,19 @@ function drupal_render(&$elements) {
}
}
- $content = '';
- // Either the elements did not go through form_builder or one of the children
- // has a #weight.
- if (!isset($elements['#sorted'])) {
- uasort($elements, "element_sort");
+ // Sort the elements by weight, if there are any children, and they have not
+ // been sorted elsewhere already, for example by a database query. Pre-sorted
+ // elements should have $elements['#sorted'] set to TRUE to avoid unnecessary
+ // calls to uasort().
+ $children = !isset($elements['#children']) ? element_children($elements) : FALSE;
+ if (empty($elements['#sorted']) && $children) {
+ uasort($elements, 'element_sort');
+ $elements['#sorted'] = TRUE;
}
+
+ $content = '';
$elements += array('#title' => NULL, '#description' => NULL);
if (!isset($elements['#children'])) {
- $children = element_children($elements);
// Render all the children that use a theme function.
if (isset($elements['#theme']) && empty($elements['#theme_used'])) {
$elements['#theme_used'] = TRUE;
diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index da9ea6f35..913a1a548 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -498,6 +498,7 @@ function comment_nodeapi_view($node, $teaser) {
if ($node->comment && (bool)menu_get_object() && $node->build_mode != NODE_BUILD_PREVIEW) {
$node->content['comments'] = array(
'#markup' => comment_render($node),
+ '#sorted' => TRUE,
);
}
}
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index ecbe2c9de..695b45bc1 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -76,7 +76,8 @@ function taxonomy_nodeapi_view($node) {
$node->content['links']['terms'] = array(
'#type' => 'node_links',
- '#value' => $links
+ '#value' => $links,
+ '#sorted' => TRUE,
);
}