Index: modules/block/block.module =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.module,v retrieving revision 1.226 diff -u -F^f -r1.226 block.module --- modules/block/block.module 31 Aug 2006 20:22:34 -0000 1.226 +++ modules/block/block.module 1 Sep 2006 07:39:17 -0000 @@ -152,57 +152,43 @@ function block_block($op = 'list', $delt */ function _block_rehash() { global $theme_key; + $blocks = array(); init_theme(); - $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s'", $theme_key); - while ($old_block = db_fetch_object($result)) { - $old_blocks[$old_block->module][$old_block->delta] = $old_block; - } - - $blocks = array(); - foreach (module_list() as $module) { $module_blocks = module_invoke($module, 'block', 'list'); if ($module_blocks) { foreach ($module_blocks as $delta => $block) { $block['module'] = $module; $block['delta'] = $delta; - // If previously written to database, load values. - if ($old_blocks[$module][$delta]) { - $block['status'] = $old_blocks[$module][$delta]->status; - $block['weight'] = $old_blocks[$module][$delta]->weight; - $block['region'] = $old_blocks[$module][$delta]->region; - $block['visibility'] = $old_blocks[$module][$delta]->visibility; - $block['pages'] = $old_blocks[$module][$delta]->pages; - $block['custom'] = $old_blocks[$module][$delta]->custom; - $block['throttle'] = $old_blocks[$module][$delta]->throttle; - $block['title'] = $old_blocks[$module][$delta]->title; - } - // Otherwise, use any set values, or else substitute defaults. - else { - $properties = array('status' => 0, 'weight' => 0, 'region' => 'left', 'pages' => '', 'custom' => 0, 'title' => ''); - foreach ($properties as $property => $default) { - if (!isset($block[$property])) { - $block[$property] = $default; - } + $block_list[$module .'-'. $delta] = TRUE; + $properties = array('status' => 0, 'weight' => 0, 'region' => 'left', 'pages' => '', 'custom' => 0); + foreach ($properties as $property => $default) { + if (!isset($block[$property])) { + $block[$property] = $default; } } - - $blocks[] = $block; + $blocks[$module .'-'. $delta] = $block; } } } - db_lock_table('blocks'); - // Remove all blocks from table. - db_query("DELETE FROM {blocks} WHERE theme = '%s'", $theme_key); + $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s'", $theme_key); + while ($block = db_fetch_array($result)) { + $key = $block['module'] .'-'. $block['delta']; + if (isset($blocks[$key])) { + unset($block_list[$key]); + $blocks[$key] = array_merge($blocks[$key], $block); + } + else { + db_query("DELETE FROM {blocks} WHERE theme = '%s' AND module = '%s' AND delta = '%s'", $theme_key, $block['module'], $block['delta']); + } + } - // 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']); + foreach (array_keys($block_list) as $key) { + db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d)", $blocks[$key]['module'], $blocks[$key]['delta'], $theme_key, $blocks[$key]['status'], $blocks[$key]['weight'], $blocks[$key]['region'], $blocks[$key]['visibility'], $blocks[$key]['pages'], $blocks[$key]['custom'], $blocks[$key]['throttle']); } - db_unlock_tables(); return $blocks; }