Index: modules/block/block.module =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.module,v retrieving revision 1.321 diff -u -p -r1.321 block.module --- modules/block/block.module 3 Feb 2009 12:30:14 -0000 1.321 +++ modules/block/block.module 6 Feb 2009 15:42:04 -0000 @@ -475,6 +475,22 @@ function _block_load_blocks() { $blocks = array(); $rids = array_keys($user->roles); + + + $result = db_query("SELECT * FROM {block} WHERE theme = :theme AND status = 1, ORDER BY b.region, b.weight, b.module', array(':theme' => $theme_key)); + foreach ($result as $record) { + $key = $record->module . $record->delta; + $blocks[$key] = $record; + } + foreach ($module_implements('block_visibility') as $module) { + $function = $module . 'block_visibility'; + $function($blocks); + } + + // TODO take the filtered array of blocks and have it keyed by region. + // and of course move everything else out of here into hook implementations. + + $blocks = array(); $result = db_query(db_rewrite_sql("SELECT DISTINCT b.* FROM {block} b LEFT JOIN {block_role} r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = '%s' AND b.status = 1 AND (r.rid IN (" . db_placeholders($rids) . ") OR r.rid IS NULL) ORDER BY b.region, b.weight, b.module", 'b', 'bid'), array_merge(array($theme_key), $rids)); while ($block = db_fetch_object($result)) { if (!isset($blocks[$block->region])) { Index: modules/user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.962 diff -u -p -r1.962 user.module --- modules/user/user.module 3 Feb 2009 18:55:32 -0000 1.962 +++ modules/user/user.module 6 Feb 2009 15:42:06 -0000 @@ -109,6 +109,29 @@ function user_field_build_modes($obj_typ return $modes; } +/** + * Implementation of hook_block_visibility(). + */ +function user_block_visibility(&$blocks) { + global $user; + $result = db_query('SELECT module, delta, rid FROM {block_role}')->fetchAll(); + + $blocks_roles = array(); + foreach ($result as $record) { + $blocks_roles[$record->module . $record->delta][] = $record->rid; + } + + $blocks_by_role = array_intersect_key($blocks, $blocks_roles); + foreach ($blocks_by_role as $block) { + if (!array_diff($blocks_roles[$block]), array_keys($user->roles)) { + unset $blocks[$block]; + } + } +} + + + + function user_external_load($authname) { $result = db_query("SELECT uid FROM {authmap} WHERE authname = '%s'", $authname);