block.install 9.92 KB
Newer Older
1 2
<?php

3 4
/**
 * @file
5
 * Install, update and uninstall functions for the block module.
6
 */
7
use Drupal\Component\Uuid\Uuid;
8
use Drupal\Core\Language\Language;
9

10
/**
11
 * Implements hook_install().
12 13
 */
function block_install() {
14 15

  // Block should go first so that other modules can alter its output
16 17
  // during hook_page_alter(). Almost everything on the page is a block,
  // so before block module runs, there will not be much to alter.
18
  module_set_weight('block', -5);
19
}
20 21

/**
22
 * @addtogroup updates-7.x-to-8.x
23 24 25
 * @{
 */

26 27 28 29 30 31 32 33
/**
 * Implements hook_update_dependencies().
 */
function block_update_dependencies() {
  // Convert role IDs after User module converted {role}.
  $dependencies['block'][8002] = array(
    'user' => 8002,
  );
34 35
  // Migrate users.data after User module prepared the tables.
  $dependencies['block'][8005] = array(
36
    'user' => 8016,
37
  );
38 39 40 41
  // Migrate custom blocks after field storage has been reorganized.
  $dependencies['block'][8008] = array(
    'field' => 8006,
  );
42 43 44
  return $dependencies;
}

45 46
/**
 * Block cache is always enabled in 8.x.
47 48
 *
 * @ingroup config_upgrade
49 50
 */
function block_update_8000() {
51
  update_variable_del('block_cache');
52 53
}

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
/**
 * Creates table {block_language} for language visibility settings per block.
 */
function block_update_8001() {
  $schema = array(
    'description' => 'Sets up display criteria for blocks based on langcode.',
    'fields' => array(
      'module' => array(
        'type' => 'varchar',
        'length' => 64,
        'not null' => TRUE,
        'description' => "The block's origin module, from {block}.module.",
      ),
      'delta' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'description' => "The block's unique delta within module, from {block}.delta.",
      ),
      'type' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'description' => "Language type name. Applied to filter the block by that type.",
      ),
      'langcode' => array(
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'description' => "The machine-readable name of this language from {language}.langcode.",
      ),
    ),
    'primary key' => array('module', 'delta', 'type', 'langcode'),
  );
  db_create_table('block_language', $schema);
}

91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
/**
 * Replace serial role IDs with machine name strings.
 *
 * @see user_update_8002()
 */
function block_update_8002() {
  // Change serial rid column into string.
  $column = array(
    'type' => 'varchar',
    'length' => 64,
    'not null' => TRUE,
    'description' => "The user's role ID from {users_roles}.rid.",
  );
  db_change_field('block_role', 'rid', 'rid', $column);

  // Rename the built-in serial role IDs into the hardcoded machine names.
  db_update('block_role')
    ->fields(array('rid' => DRUPAL_ANONYMOUS_RID))
    ->condition('rid', 1)
    ->execute();
  db_update('block_role')
    ->fields(array('rid' => DRUPAL_AUTHENTICATED_RID))
    ->condition('rid', 2)
    ->execute();
}

117 118 119 120 121 122 123 124 125
/**
 * Increase {block}.title length to 255 characters.
 */
function block_update_8003() {
  db_change_field('block', 'title', 'title', array(
    'type' => 'varchar',
    'length' => 255,
    'not null' => TRUE,
    'default' => '',
126
    'description' => 'Custom title for the block. (Empty string will use block default title, - None - will remove the title, text will cause block to use specified title.)',
127 128 129 130
    )
  );
}

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
/**
 * Rename default menu names.
 */
function block_update_8004() {
  // System menu's new block deltas are prefixed with 'menu-'.
  $map = array(
    'navigation' => 'menu-tools',
    'management' => 'menu-admin',
    'user-menu' => 'menu-account',
    'main-menu' => 'menu-main',
  );
  foreach ($map as $old => $new) {
    db_update('block')
      ->condition('module', 'system')
      ->condition('delta', $old)
      ->fields(array('delta' => $new))
      ->execute();
    db_update('block_language')
      ->condition('module', 'system')
      ->condition('delta', $old)
      ->fields(array('delta' => $new))
      ->execute();
    db_update('block_role')
      ->condition('module', 'system')
      ->condition('delta', $old)
      ->fields(array('delta' => $new))
      ->execute();
  }
}

161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
/**
 * Migrate {users}.data into {users_data}.
 */
function block_update_8005() {
  $query = db_select('_d7_users_data', 'ud');
  $query->addField('ud', 'uid');
  $query->addExpression("'block'", 'module');
  $query->addExpression("'block'", 'name');
  // Take over the extracted and serialized value in {_d7_users_data} as-is.
  $query->addField('ud', 'value');
  $query->addExpression('1', 'serialized');
  $query->condition('name', 'block');

  db_insert('users_data')
    ->from($query)
    ->execute();

  db_delete('_d7_users_data')
    ->condition('name', 'block')
    ->execute();
}

183 184 185 186
/**
 * Enable the Custom Block module.
 */
function block_update_8006() {
187
  Drupal::moduleHandler()->install(array('custom_block'));
188 189
}

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
/**
 * Migrate {block_custom} to {custom_block}.
 *
 * Note this table now resides in custom_block_schema() but for 7.x to 8.x
 * upgrades, changes must be made from block module as custom_block module is
 * only enabled during upgrade process.
 */
function block_update_8007() {
  // Populate the {custom_block} and {custom_block_revision} table.
  $results = db_select('block_custom', 'bc')->fields('bc')->execute();

  $uuid = new Uuid();
  $execute = FALSE;
  $block_insert = db_insert('custom_block')->fields(array(
    'id',
    'uuid',
    'info',
    'revision_id',
    'langcode',
209 210
    'type',
    'changed',
211 212 213 214 215
  ));
  $revision_insert = db_insert('custom_block_revision')->fields(array(
    'id',
    'revision_id',
    'log',
216 217
    'info',
    'changed',
218 219 220 221 222 223 224
  ));
  foreach ($results as $block) {
    $custom_block = array(
      'id' => $block->bid,
      'uuid' => $uuid->generate(),
      'info' => $block->info,
      'revision_id' => $block->bid,
225
      'langcode' => Language::LANGCODE_NOT_SPECIFIED,
226 227
      'type' => 'basic',
      'changed' => REQUEST_TIME,
228 229 230 231 232
    );
    $revision = array(
      'id' => $block->bid,
      'revision_id' => $block->bid,
      'info' => $block->info,
233 234
      'log' => 'Initial value from 7.x to 8.x upgrade',
      'changed' => REQUEST_TIME,
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
    );
    $block_insert->values($custom_block);
    $revision_insert->values($revision);
    // We have something to execute.
    $execute = TRUE;
  }
  if ($execute) {
    $block_insert->execute();
    $revision_insert->execute();
  }
}

/**
 * Migrate {block_custom}.body and {block_custom}.format to block_body field.
 */
function block_update_8008() {
  $sandbox['#finished'] = 0;

  if (!isset($sandbox['total'])) {
    // Initial invocation.

    // First, create the body field.
    $body_field = array(
258 259
      'name' => 'block_body',
      'entity_type' => 'custom_block',
260 261 262
      'type' => 'text_with_summary',
      'module' => 'text',
      'cardinality' => 1,
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
      'schema' => array(
        'columns' => array(
          'value' => array(
            'type' => 'text',
            'size' => 'big',
            'not null' => FALSE,
          ),
          'summary' => array(
            'type' => 'text',
            'size' => 'big',
            'not null' => FALSE,
          ),
          'format' => array(
            'type' => 'varchar',
            'length' => 255,
            'not null' => FALSE,
          ),
        ),
        'indexes' => array(
          'format' => array('format'),
        ),
        'foreign keys' => array(
          'format' => array(
            'table' => 'filter_format',
            'columns' => array('format' => 'format'),
          ),
        ),
      ),
291
    );
292
    _update_8003_field_create_field($body_field);
293

294

295 296 297 298 299 300
    $instance = array(
      'entity_type' => 'custom_block',
      'bundle' => 'basic',
      'label' => 'Block body',
      'settings' => array('display_summary' => FALSE),
    );
301
    _update_8003_field_create_instance($body_field, $instance);
302

303 304 305 306 307 308 309 310
    module_load_install('entity');
    // Assign form settings for the 'default' form mode.
    $form_display = _update_8000_entity_get_form_display('custom_block', 'basic', 'default');
    $form_display->set('content.user_picture', array(
        'type' => 'text_textarea_with_summary',
      ))
      ->save();

311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
    // Initialize state for future calls.
    $sandbox['last'] = 0;
    $sandbox['count'] = 0;

    $query = db_select('block_custom', 'bc');
    $sandbox['total'] = $query->countQuery()->execute()->fetchField();

    $sandbox['body_field_id'] = $body_field['id'];
  }
  else {
    // Subsequent invocations.

    $found = FALSE;
    if ($sandbox['total']) {
      // Operate on each block in turn.
      $batch_size = 200;
      $query = db_select('block_custom', 'bc');
      $query
        ->fields('bc', array('bid', 'body', 'format'))
        ->condition('bc.bid', $sandbox['last'], '>')
        ->orderBy('bc.bid', 'ASC')
        ->range(0, $batch_size);
      $blocks = $query->execute();

      // Load the block, set up 'body' and save the field data.
      foreach ($blocks as $block) {
        $found = TRUE;

        $data = array(
340
          Language::LANGCODE_NOT_SPECIFIED => array(
341 342 343 344 345 346 347 348
            array(
              'format' => $block->format,
              'value' => $block->body
            )
          )
        );
        // This is a core update and no contrib modules are enabled yet, so
        // we can assume default field storage for a faster update.
349
        _update_8006_field_write_data_sql('custom_block', 'basic', $block->bid, $block->bid, 'block_body', $data);
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370

        $sandbox['last'] = $block->bid;
        $sandbox['count'] += 1;
      }

      $sandbox['#finished'] = min(0.99, $sandbox['count'] / $sandbox['total']);
    }

    if (!$found) {
      // All blocks are processed.

      // Remove the now-obsolete body info from block_custom.
      db_drop_field('block_custom', 'body');
      db_drop_field('block_custom', 'format');

      // We're done.
      $sandbox['#finished'] = 1;
    }
  }
}

371
/**
372
 * @} End of "addtogroup updates-7.x-to-8.x".
373 374
 * The next series of updates should start at 9000.
 */