function webform_update_8025 in Webform 6.x
Same name and namespace in other branches
- 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);
}