'Spool for temporary storage of newsletter emails.', 'fields' => [ 'msid' => [ 'description' => 'The primary identifier for a mail spool record.', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ], 'entity_type' => [ 'description' => 'The entity type of this newsletter issue.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', ], 'entity_id' => [ 'description' => 'The entity id of this newsletter issue.', 'type' => 'int', 'not null' => TRUE, 'default' => 0, ], 'newsletter_id' => [ 'description' => 'The {simplenews_newsletter}.id this email belongs to.', 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', ], 'status' => [ 'description' => 'The sent status of the email (0 = hold, 1 = pending, 2 = done, 3 = in progress, 4 = skipped, 5 = failed).', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny', ], 'timestamp' => [ 'description' => 'The time status was set or changed.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, ], 'data' => [ 'description' => 'A serialized array of name value pairs that define a temporary subscriber.', 'type' => 'text', 'not null' => FALSE, 'size' => 'big', 'serialize' => TRUE, ], 'snid' => [ 'description' => 'Foreign key for subscriber table ({simplenews_subscriber}.id).', 'type' => 'int', 'not null' => FALSE, ], ], 'primary key' => ['msid'], 'indexes' => [ 'newsletter_id' => ['newsletter_id'], 'status' => ['status'], 'snid_newsletter_id' => ['snid', 'newsletter_id'], ], 'foreign keys' => [ 'newsletter_id' => [ 'table' => 'simplenews_newsletter', 'columns' => ['newsletter_id'], ], 'snid_newsletter_id' => [ 'table' => 'simplenews_subscription', 'columns' => [ 'snid' => 'snid', 'newsletter_id' => 'newsletter_id', ], ], ], ]; return $schema; } /** * Implements hook_install(). */ function simplenews_install() { if (\Drupal::service('config.installer')->isSyncing()) { return; } // Set the default values for test_address, from_address and from_name. $site_mail = \Drupal::config('system.site')->get('mail'); $site_name = \Drupal::config('system.site')->get('name'); $config = \Drupal::configFactory()->getEditable('simplenews.settings'); if (empty($site_mail)) { $site_mail = ini_get('sendmail_from'); } $config->set('newsletter.from_address', $site_mail); if (empty($site_name)) { $site_name = 'Drupal'; } $config->set('newsletter.from_name', $site_name); $config->save(TRUE); user_role_grant_permissions(AccountInterface::ANONYMOUS_ROLE, ['subscribe to newsletters']); user_role_grant_permissions(AccountInterface::AUTHENTICATED_ROLE, ['subscribe to newsletters']); // Init the default newsletter. $newsletter = Newsletter::load('default'); $newsletter->from_name = $site_name; $newsletter->from_address = $site_mail; $newsletter->trustData(); $newsletter->save(); } /** * Update simplenews_mail_spool table. */ function simplenews_update_8201() { $db_schema = Database::getConnection()->schema(); $db_schema->changeField('simplenews_mail_spool', 'snid', 'snid', [ 'description' => 'Foreign key for subscriber table ({simplenews_subscriber}.id).', 'type' => 'int', 'not null' => FALSE, ]); $db_schema->dropField('simplenews_mail_spool', 'mail'); } /** * Initialise newsletter allowed handlers field. */ function simplenews_update_8202() { foreach (Newsletter::loadMultiple() as $newsletter) { if (!isset($newsletter->allowed_handlers)) { $newsletter->allowed_handlers = []; $newsletter->save(); } } } /** * Convert simplenews_subscriber.subscriptions to base field. */ function simplenews_update_8203() { // Add new field definition. $field_definition = BaseFieldDefinition::create('simplenews_subscription') ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) ->setLabel(t('Subscriptions')) ->setSetting('target_type', 'simplenews_newsletter') ->setDisplayOptions('form', [ 'type' => 'simplenews_subscription_select', 'weight' => '0', 'settings' => [], 'third_party_settings' => [], ]); \Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition('subscriptions', 'simplenews_subscriber', 'simplenews', $field_definition); // Remove old configuration. // Cannot use FieldStorageConfig because it throws an exception due to the // clashing base field. $configurations_to_delete = ['field.field.simplenews_subscriber.simplenews_subscriber.subscriptions', 'field.storage.simplenews_subscriber.subscriptions']; $config_factory = \Drupal::configFactory(); $dependents = \Drupal::service('config.manager')->findConfigEntityDependents('config', $configurations_to_delete); foreach ($dependents as $config_name => $config_entity) { $config_entity = $config_factory->getEditable($config_name); $dependencies = $config_entity->get('dependencies.config'); $dependencies = array_diff($dependencies, $configurations_to_delete); $config_entity->set('dependencies.config', $dependencies); $config_entity->save(); } foreach ($configurations_to_delete as $config) { $config_factory->getEditable($config)->delete(); } } /** * Update all existing views using simplenews_subscriber.subscriptions. */ function simplenews_update_8204() { $config_factory = \Drupal::configFactory(); foreach ($config_factory->listAll('views.view.') as $view_config_name) { $view = $config_factory->getEditable($view_config_name); $displays = $view->get('display'); foreach ($displays as $display_name => $display) { if (!empty($display['display_options']['fields'])) { foreach ($display['display_options']['fields'] as $field_name => $field) { if (($field_name == 'subscriptions') && ($field['table'] == 'simplenews_subscriber__subscriptions')) { // Update the field. $key = "display.$display_name.display_options.fields.$field_name"; $view->clear($key); $key .= '_target_id'; $field['id'] .= '_target_id'; $field['field'] .= '_target_id'; $view->set($key, $field); } } } } $view->save(TRUE); } } /** * Add simplenews_issue error_count property. */ function simplenews_update_8205() { $manager = \Drupal::entityDefinitionUpdateManager(); $storage_definition = $manager->getFieldStorageDefinition('simplenews_issue', 'node'); $table_mapping = \Drupal::service('entity_type.manager')->getStorage('node')->getTableMapping(); $table_names[] = $table_mapping->getDedicatedDataTableName($storage_definition); $table_names[] = $table_mapping->getDedicatedRevisionTableName($storage_definition); $column_name = $table_mapping->getFieldColumnName($storage_definition, 'error_count'); $schema = Database::getConnection()->schema(); $new_property = [ 'description' => 'Counter of already sent newsletters.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, ]; foreach ($table_names as $table_name) { if (!$schema->fieldExists($table_name, $column_name)) { $schema->addField($table_name, $column_name, $new_property); } } $manager->updateFieldStorageDefinition($storage_definition); } /** * Remove simplenews_mail_spool error field. */ function simplenews_update_8206() { $schema = Database::getConnection()->schema(); $schema->dropField('simplenews_mail_spool', 'error'); } /** * Initialize tidy unconfirmed subscribers setting. */ function simplenews_update_8207() { $config = \Drupal::configFactory()->getEditable('simplenews.settings'); $config->set('subscription.tidy_unconfirmed', 0); $config->save(); } /** * Remove redundant view mode 'email_textalt'. */ function simplenews_update_830001() { \Drupal::entityTypeManager()->getStorage('entity_view_mode')->load('node.email_textalt')->delete(); } /** * Initialize plain-text alternative setting. */ function simplenews_update_830002() { $config = \Drupal::configFactory()->getEditable('simplenews.settings'); $config->set('mail.textalt', TRUE); $config->save(); } /** * Initialize skip_verification setting, remove single-confirmation emails. * Convert newsletter field opt_inout to 'access'. */ function simplenews_update_830003() { $config = \Drupal::configFactory()->getEditable('simplenews.settings'); $config->set('subscription.skip_verification', FALSE); $config->clear('subscription.use_combined'); $config->clear('subscription.confirm_subscribe_subject'); $config->clear('subscription.confirm_subscribe_unsubscribed'); $config->clear('subscription.confirm_subscribe_subscribed'); $config->clear('subscription.confirm_unsubscribe_subscribed'); $config->clear('subscription.confirm_unsubscribe_unsubscribed'); $config->save(); $newsletter_types = \Drupal::service('entity_type.manager')->getStorage('simplenews_newsletter')->loadMultiple(); foreach($newsletter_types as $type) { $type->set('access', $type->get('opt_inout') != 'hidden' ? 'default' : 'hidden'); $type->set('opt_inout', NULL); $type->save(); } } /** * Initialize subscription validate settings. */ function simplenews_update_830004() { $config = \Drupal::configFactory()->getEditable('simplenews.settings'); $config->set('subscription.validate_subject', "Manage your subscriptions at [site:name]"); $config->set('subscription.validate_body', "We have received a request to manage your subscriptions for [simplenews-subscriber:mail] at [site:url]. To proceed please use the link below.\r\n\r\n[simplenews-subscriber:manage-url]"); $config->clear('subscription.confirm_combined_line_subscribe_subscribed'); $config->clear('subscription.confirm_combined_line_subscribe_unsubscribed'); $config->clear('subscription.confirm_combined_line_unsubscribe_subscribed'); $config->clear('subscription.confirm_combined_line_unsubscribe_unsubscribed'); if ($config->get('subscription.confirm_combined_body') == "We have received a request for the following subscription changes for [simplenews-subscriber:mail] at [site:url]:\r\n\r\n[changes-list]\r\n\r\nTo confirm please use the link below.\r\n\r\n[simplenews-subscriber:combined-url]") { $config->set('subscription.confirm_combined_body', "We have received a request to subscribe [simplenews-subscriber:mail] at [site:url]. To confirm please use the link below.\r\n\r\n[simplenews-subscriber:combined-url]"); } if ($config->get('subscription.confirm_combined_body_unchanged') == "We have received a request for the following subscription changes for [simplenews-subscriber:mail] at [site:url]:\r\n\r\n[changes-list]\r\n\r\nNo confirmation necessary because all requested changes equal the current state.") { $config->set('subscription.confirm_combined_body_unchanged', "We have received a request to subscribe [simplenews-subscriber:mail] at [site:url]. No confirmation necessary because you are already subscribed."); } $config->save(); } /** * Initialize new settings on subscription block. */ function simplenews_update_830005() { $config_factory = \Drupal::configFactory(); foreach ($config_factory->listAll('block.block.') as $block_config_name) { $block_config = $config_factory->getEditable($block_config_name); if ($block_config->get('plugin') == 'simplenews_subscription_block') { $newsletters = $block_config->get('settings.newsletters'); if (count(array_filter($block_config->get('settings.newsletters'))) == 1) { $block_config->set('settings.default_newsletters', $newsletters) ->set('settings.newsletters', []); } else { $block_config->set('settings.default_newsletters', []); } $block_config->set('settings.show_manage', TRUE)->save(TRUE); } } } /** * Changes field simplenews_issue to non-translatable. */ function simplenews_update_830006() { $fields = \Drupal::entityTypeManager() ->getStorage('field_config') ->loadByProperties([ 'field_type' => 'simplenews_issue', ]); foreach ($fields as $field) { $updated_field = FieldConfig::create($field->toArray() + [ 'translatable' => FALSE, ]); $updated_field->original = $field; $updated_field->enforceIsNew(FALSE); $updated_field->save(); } } /** * Initialize issue_tokens setting. */ function simplenews_update_830007() { $config = \Drupal::configFactory()->getEditable('simplenews.settings'); $config->set('newsletter.issue_tokens', FALSE); $config->save(); } /** * Add a 'uuid' entity key to subscriber. */ function simplenews_update_830008() { $entity_type = \Drupal::entityDefinitionUpdateManager()->getEntityType('simplenews_subscriber'); $entity_keys = $entity_type->getKeys(); $entity_keys['uuid'] = 'uuid'; $entity_type->set('entity_keys', $entity_keys); \Drupal::entityDefinitionUpdateManager()->updateEntityType($entity_type); } /** * Fix 'uuid' entity key for subscriber. */ function simplenews_update_830009() { // The code in simplenews_update_830008() should be enough, but we have to // update the field storage too, see https://www.drupal.org/node/2554097. $manager = \Drupal::entityDefinitionUpdateManager(); $manager->updateFieldStorageDefinition($manager->getFieldStorageDefinition('uuid', 'simplenews_subscriber')); }