Index: modules/block/block.module =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.module,v retrieving revision 1.223 diff -u -p -r1.223 block.module --- modules/block/block.module 25 Aug 2006 23:54:18 -0000 1.223 +++ modules/block/block.module 27 Aug 2006 15:51:56 -0000 @@ -7,6 +7,14 @@ */ /** + * Constants to define the caching modes for blocks + */ +define('BLOCK_NOT_CACHABLE', 0); +define('BLOCK_ALWAYS_CACHED', 1); +define('BLOCK_CACHED_PER_USER', 2); +define('BLOCK_CACHED_PER_ROLE', 3); + +/** * Implementation of hook_help(). */ function block_help($section) { @@ -170,6 +178,9 @@ function _block_rehash() { foreach ($module_blocks as $delta => $block) { $block['module'] = $module; $block['delta'] = $delta; + $block['cache_mode'] = isset($block['cache_mode']) ? $block['cache_mode'] : BLOCK_ALWAYS_CACHED; + // default cache time to live is one hour + $block['cache_ttl'] = isset($block['cache_ttl']) ? $block['cache_ttl'] : 3600; // If previously written to database, load values. if ($old_blocks[$module][$delta]) { $block['status'] = $old_blocks[$module][$delta]->status; @@ -202,7 +213,7 @@ function _block_rehash() { // Reinsert new set of blocks into table. foreach ($blocks as $block) { - db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle, title) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d, '%s')", $block['module'], $block['delta'], $theme_key, $block['status'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle'], $block['title']); + db_query("INSERT INTO {blocks} (module, delta, theme, status, cache_mode, cache_ttl, weight, region, visibility, pages, custom, throttle, title) VALUES ('%s', '%s', '%s', %d, %d, %d, %d, '%s', %d, '%s', %d, %d, '%s')", $block['module'], $block['delta'], $theme_key, $block['status'], $block['cache_mode'], $block['cache_ttl'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle'], $block['title']); } db_unlock_tables(); @@ -682,9 +693,36 @@ function block_list($region) { // Check the current throttle status and see if block should be displayed // based on server load. if (!($block->throttle && (module_invoke('throttle', 'status') > 0))) { - $array = module_invoke($block->module, 'block', 'view', $block->delta); - if (isset($array) && is_array($array)) { - foreach ($array as $k => $v) { + switch ($block->cache_mode) { + case BLOCK_NOT_CACHABLE: + $cid = NULL; + break; + case BLOCK_ALWAYS_CACHED: + $cid = "$block->module:$block->delta"; + break; + case BLOCK_CACHED_PER_USER: + $cid = "$block->module:$block->delta:$user->uid"; + break; + case BLOCK_CACHED_PER_ROLE: + $cid = "$block->module:$block->delta:". serialize($user->roles); + break; + } + if ($cid) { + $cache = cache_get($cid, 'cache_block'); + } + + if ($cache->data) { + $block_view = unserialize($cache->data); + } + else { + $block_view = module_invoke($block->module, 'block', 'view', $block->delta); + if ($cid) { + cache_set($cid, 'cache_block', serialize($block_view), $block['cache_ttl'] ? (time() + $block['cache_ttl']) : CACHE_PERMANENT); + } + } + + if (isset($block_view) && is_array($block_view)) { + foreach ($block_view as $k => $v) { $block->$k = $v; } } Index: modules/user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.662 diff -u -p -r1.662 user.module --- modules/user/user.module 27 Aug 2006 08:56:35 -0000 1.662 +++ modules/user/user.module 27 Aug 2006 15:51:57 -0000 @@ -506,9 +506,17 @@ function user_block($op = 'list', $delta if ($op == 'list') { $blocks[0]['info'] = t('User login'); + $blocks[0]['cache_mode'] = BLOCK_ALWAYS_CACHED; + $blocks[0]['cache_ttl'] = 0; $blocks[1]['info'] = t('Navigation'); + // The navigation block isn't cachable as it also depends on the + // page where it appears + $blocks[1]['cache_mode'] = BLOCK_NOT_CACHABLE; $blocks[2]['info'] = t('Who\'s new'); + $blocks[2]['cache_mode'] = BLOCK_ALWAYS_CACHED; + $blocks[2]['cache_ttl'] = 900; $blocks[3]['info'] = t('Who\'s online'); + $blocks[3]['cache_mode'] = BLOCK_NOT_CACHABLE; return $blocks; }