Commit 8a70cd09 authored by webchick's avatar webchick

#652048 by chx: Factor out the caching pattern from forum.

parent 52e5064d
......@@ -5250,6 +5250,49 @@ function drupal_render_cache_set(&$markup, $elements) {
cache_set($cid, $data, $bin, $expire);
}
/**
* 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.
*
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment