function prepare_block_list()
{
$block_types = Plugins::filter('block_list', array());
$dash_blocks = Plugins::filter('dashboard_block_list', array());
$block_types = array_diff_key($block_types, $dash_blocks);
$all_block_instances = DB::get_results('SELECT b.* FROM {blocks} b ORDER BY b.title ASC', array(), 'Block');
$block_instances = array();
$invalid_block_instances = array();
// get dashboard block instances from plugins that may not be active
$dash_blocks_instances = array();
$scopes = $this->theme->get_scopes('dashboard');
foreach ($scopes as $scope) {
$dash_blocks_instances = array_merge($dash_blocks, $this->theme->get_blocks('dashboard', $scope->id, $this->theme));
}
$dash_blocks_instances = array_merge($dash_blocks_instances, $this->theme->get_blocks('dashboard', 0, $this->theme));
foreach ($dash_blocks_instances as $dash_instance) {
$dash_blocks[$dash_instance->type] = $dash_instance->type;
}
foreach ($all_block_instances as $instance) {
if (isset($block_types[$instance->type])) {
$block_instances[] = $instance;
} elseif (isset($dash_blocks[$instance->type])) {
// Do not add this dashboard block to the block instance list on the theme page
} else {
$instance->invalid_message = _t('This data is for a block of type "%s", which is no longer provided by a theme or plugin.', array($instance->type));
$invalid_block_instances[] = $instance;
}
}
$this->theme->blocks = $block_types;
$this->theme->block_instances = $block_instances;
$this->theme->invalid_block_instances = $invalid_block_instances;
}