update_fix_d7_block_deltas
function update_fix_d7_block_deltas
update_fix_d7_block_deltas(&$sandbox, $renamed_deltas, $moved_deltas)
A helper function that modules can use to assist with the transformation from numeric block deltas to string block deltas during the 6.x -> 7.x upgrade.
@todo This function should be removed in 8.x.
Parameters
$sandbox: An array holding data for the batch process.
$renamed_deltas: An associative array. Keys are module names, values an associative array mapping the old block deltas to the new block deltas for the module. Example:
$renamed_deltas = array( 'mymodule' => array( 0 => 'mymodule-block-1', 1 => 'mymodule-block-2', ), );
$moved_deltas: An associative array. Keys are source module names, values an associative array mapping the (possibly renamed) block name to the new module name. Example:
$moved_deltas = array( 'user' => array( 'navigation' => 'system', ), );
File
- includes/update.inc, line 355
- Drupal database update API.
Code
function update_fix_d7_block_deltas(&$sandbox, $renamed_deltas, $moved_deltas) { // Loop through each block and make changes to the block tables. // Only run this the first time through the batch update. if (!isset($sandbox['progress'])) { // Determine whether to use the old or new block table names. $block_tables = db_table_exists('blocks') ? array('blocks', 'blocks_roles') : array('block', 'block_role'); foreach ($block_tables as $table) { foreach ($renamed_deltas as $module => $deltas) { foreach ($deltas as $old_delta => $new_delta) { // Only do the update if the old block actually exists. $block_exists = db_query("SELECT COUNT(*) FROM {" . $table . "} WHERE module = :module AND delta = :delta", array( ':module' => $module, ':delta' => $old_delta, )) ->fetchField(); if ($block_exists) { // Delete any existing blocks with the new module+delta. db_delete($table) ->condition('module', $module) ->condition('delta', $new_delta) ->execute(); // Rename the old block to the new module+delta. db_update($table) ->fields(array('delta' => $new_delta)) ->condition('module', $module) ->condition('delta', $old_delta) ->execute(); } } } foreach ($moved_deltas as $old_module => $deltas) { foreach ($deltas as $delta => $new_module) { // Only do the update if the old block actually exists. $block_exists = db_query("SELECT COUNT(*) FROM {" . $table . "} WHERE module = :module AND delta = :delta", array( ':module' => $old_module, ':delta' => $delta, )) ->fetchField(); if ($block_exists) { // Delete any existing blocks with the new module+delta. db_delete($table) ->condition('module', $new_module) ->condition('delta', $delta) ->execute(); // Rename the old block to the new module+delta. db_update($table) ->fields(array('module' => $new_module)) ->condition('module', $old_module) ->condition('delta', $delta) ->execute(); } } } } // Initialize batch update information. $sandbox['progress'] = 0; $sandbox['last_user_processed'] = -1; $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} WHERE data LIKE :block", array( ':block' => '%' . db_like(serialize('block')) . '%', )) ->fetchField(); } // Now do the batch update of the user-specific block visibility settings. $limit = 100; $result = db_select('users', 'u') ->fields('u', array('uid', 'data')) ->condition('uid', $sandbox['last_user_processed'], '>') ->condition('data', '%' . db_like(serialize('block')) . '%', 'LIKE') ->orderBy('uid', 'ASC') ->range(0, $limit) ->execute(); foreach ($result as $row) { $data = unserialize($row->data); $user_needs_update = FALSE; foreach ($renamed_deltas as $module => $deltas) { foreach ($deltas as $old_delta => $new_delta) { if (isset($data['block'][$module][$old_delta])) { // Transfer the old block visibility settings to the newly-renamed // block, and mark this user for a database update. $data['block'][$module][$new_delta] = $data['block'][$module][$old_delta]; unset($data['block'][$module][$old_delta]); $user_needs_update = TRUE; } } } foreach ($moved_deltas as $old_module => $deltas) { foreach ($deltas as $delta => $new_module) { if (isset($data['block'][$old_module][$delta])) { // Transfer the old block visibility settings to the moved // block, and mark this user for a database update. $data['block'][$new_module][$delta] = $data['block'][$old_module][$delta]; unset($data['block'][$old_module][$delta]); $user_needs_update = TRUE; } } } // Update the current user. if ($user_needs_update) { db_update('users') ->fields(array('data' => serialize($data))) ->condition('uid', $row->uid) ->execute(); } // Update our progress information for the batch update. $sandbox['progress']++; $sandbox['last_user_processed'] = $row->uid; } // Indicate our current progress to the batch update system. if ($sandbox['progress'] < $sandbox['max']) { $sandbox['#finished'] = $sandbox['progress'] / $sandbox['max']; } }
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/includes!update.inc/function/update_fix_d7_block_deltas/7.x