summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngie Byron <webchick@24967.no-reply.drupal.org>2010-01-14 06:20:15 +0000
committerAngie Byron <webchick@24967.no-reply.drupal.org>2010-01-14 06:20:15 +0000
commit8a70cd09ca92526fa78d75bce8a7843baa8f4a6b (patch)
treed021ed33a39b8dee89930ad5a1ea5be9a615ce2e
parent52e5064d3241784ed110a9f268b9b39eb24dac1b (diff)
downloadbrdo-8a70cd09ca92526fa78d75bce8a7843baa8f4a6b.tar.gz
brdo-8a70cd09ca92526fa78d75bce8a7843baa8f4a6b.tar.bz2
#652048 by chx: Factor out the caching pattern from forum.
-rw-r--r--includes/common.inc43
-rw-r--r--modules/forum/forum.module17
2 files changed, 46 insertions, 14 deletions
diff --git a/includes/common.inc b/includes/common.inc
index 46bc96e01..75dbe5685 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -5251,6 +5251,49 @@ function drupal_render_cache_set(&$markup, $elements) {
}
/**
+ * Prepare an element for caching based on a query. This smart caching strategy
+ * saves Drupal from querying and rendering to HTML when the underlying query is
+ * unchanged.
+ *
+ * Expensive queries should use the query builder to create the query and then
+ * call this function. Executing the query and formatting results should happen
+ * in a #pre_render callback.
+ *
+ * @param $query
+ * A select query object as returned by db_select().
+ * @param $function
+ * The name of the function doing this caching. A _pre_render suffix will be
+ * added to this string and is also part of the cache key in
+ * drupal_render_cache_set() and drupal_render_cache_get().
+ * @param $expire
+ * The cache expire time, passed eventually to cache_set().
+ * @param $granularity
+ * One or more granularity constants passed to drupal_render_cid_parts().
+ *
+ * @return
+ * A renderable array with the following keys and values:
+ * - #query: The passed in $query.
+ * - #pre_render: $function with a _pre_render suffix.
+ * - #cache: An associative array prepared for drupal_render_cache_set().
+ */
+function drupal_render_cache_by_query($query, $function, $expire = CACHE_TEMPORARY, $granularity = NULL) {
+ $cache_keys = array_merge(array($function), drupal_render_cid_parts($granularity));
+ $query->preExecute();
+ $cache_keys[] = md5(serialize(array((string) $query, $query->getArguments())));
+ return array(
+ '#query' => $query,
+ '#pre_render' => array($function . '_pre_render'),
+ '#cache' => array(
+ 'keys' => $cache_keys,
+ 'expire' => $expire,
+ ),
+ );
+}
+
+/**
+
+
+/**
* Helper function for building cache ids.
*
* @param $granularity
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 53668052e..26513107a 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -637,21 +637,10 @@ function forum_block_view($delta = '') {
break;
}
- $cache_keys = array_merge(array('forum', $delta), drupal_render_cid_parts());
- // Cache based on the altered query. Enables us to cache with node access enabled.
- $query->preExecute();
- $cache_keys[] = md5(serialize(array((string) $query, $query->getArguments())));
-
$block['subject'] = $title;
- $block['content'] = array(
- '#access' => user_access('access content'),
- '#pre_render' => array('forum_block_view_pre_render'),
- '#cache' => array(
- 'keys' => $cache_keys,
- 'expire' => CACHE_TEMPORARY,
- ),
- '#query' => $query,
- );
+ // Cache based on the altered query. Enables us to cache with node access enabled.
+ $block['content'] = drupal_render_cache_by_query($query, 'forum_block_view');
+ $block['content']['#access'] = user_access('access content');
return $block;
}