You are here

function webform_update_8025 in Webform 6.x

Same name and namespace in other branches
  1. 8.5 includes/webform.install.update.inc \webform_update_8025()

Issue #2857417: Add support for open and close date/time to Webform nodes. Update database scheme.

File

includes/webform.install.update.inc, line 505
Archived Webform update hooks.

Code

function webform_update_8025() {

  // Issue #2863986: Allow updating modules with new service dependencies.
  \Drupal::service('kernel')
    ->rebuildContainer();

  /** @var \Drupal\webform\WebformEntityReferenceManagerInterface $entity_reference_manager */
  $entity_reference_manager = \Drupal::service('webform.entity_reference_manager');
  $webform_tables = $entity_reference_manager
    ->getTableNames();
  $database_schema = \Drupal::database()
    ->schema();
  $schema = \Drupal::keyValue('entity.storage_schema.sql')
    ->getAll();
  foreach ($schema as $item_name => $item) {
    foreach ($item as $table_name => $table_schema) {
      foreach ($table_schema as $schema_key => $schema_data) {
        if ($schema_key === 'fields') {
          foreach ($schema_data as $field_name => $field_data) {
            $is_webform_field_status = isset($webform_tables[$table_name]) && $field_name === $webform_tables[$table_name] . '_status';
            $is_webform_field_integer = $field_data['type'] === 'int';
            if ($is_webform_field_status && $is_webform_field_integer) {
              $temp_field_name = $field_name . '_temp';

              // Add temp status field and copy value.
              $database_schema
                ->addField($table_name, $temp_field_name, [
                'type' => 'varchar',
                'length' => 20,
              ]);
              \Drupal::database()
                ->query("UPDATE {" . $table_name . "} SET {$temp_field_name} = 'open' WHERE {$field_name} = 1")
                ->execute();
              \Drupal::database()
                ->query("UPDATE {" . $table_name . "} SET {$temp_field_name} = 'closed' WHERE {$field_name} <> 1")
                ->execute();

              // Drop, re-create, and restore status field.
              $schema[$item_name][$table_name]['fields'][$field_name] = [
                'description' => 'Flag to control whether this webform should be open, closed, or scheduled for new submissions.',
                'type' => 'varchar',
                'length' => 20,
              ];
              $database_schema
                ->dropField($table_name, $field_name);
              $database_schema
                ->addField($table_name, $field_name, $schema[$item_name][$table_name]['fields'][$field_name]);
              \Drupal::database()
                ->query("UPDATE {" . $table_name . "} SET {$field_name} = {$temp_field_name}")
                ->execute();

              // Drop temp field.
              $database_schema
                ->dropField($table_name, $temp_field_name);

              // Add open and close.
              $states = [
                'open',
                'close',
              ];
              foreach ($states as $state) {
                $state_field_name = preg_replace('/_status$/', '_' . $state, $field_name);
                $schema[$item_name][$table_name]['fields'][$state_field_name] = [
                  'description' => "The {$state} date/time.",
                  'type' => 'varchar',
                  'length' => 20,
                ];
                $database_schema
                  ->addField($table_name, $state_field_name, $schema[$item_name][$table_name]['fields'][$state_field_name]);
              }
            }
          }
        }
      }
    }
  }
  \Drupal::keyValue('entity.storage_schema.sql')
    ->setMultiple($schema);
}