smart_date-3.1.0-beta1/smart_date.install

smart_date.install
<?php

/**
 * @file
 * Install, update and uninstall functions for smart_date module.
 */

declare(strict_types=1);

use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
use Drupal\node\NodeStorage;

/**
 * Implements hook_install().
 */
function smart_date_update_8201() {
  $field_type = 'smartdate';
  // Define the columns we want to add.
  $specs = [
    'rrule' => [
      'type' => 'int',
      'label' => t('RRule ID'),
      'unsigned' => TRUE,
      'not null' => FALSE,
    ],
    'timezone' => [
      'type' => 'varchar',
      'label' => t('Timezone'),
      'length' => 32,
    ],
  ];

  _smart_date_field_columns_add($field_type, $specs, FALSE);
}

/**
 * Add rule index column for recurring dates.
 */
function smart_date_update_8202() {
  $field_type = 'smartdate';
  // Define the columns we want to add.
  $specs = [
    'rrule_index' => [
      'type' => 'int',
      'label' => t('RRule Index'),
      'unsigned' => TRUE,
      'not null' => FALSE,
    ],
  ];

  _smart_date_field_columns_add($field_type, $specs);

  // If Smart Date Recur isn't enabled, nothing more to do.
  if (!\Drupal::moduleHandler()->moduleExists('smart_date_recur')) {
    return;
  }

  // Now, populate the new column.
  $rules = \Drupal::entityTypeManager()->getStorage('smart_date_rule')->loadMultiple();
  if (empty($rules)) {
    return;
  }
  $manager = \Drupal::entityDefinitionUpdateManager();
  $database = \Drupal::database();
  foreach ($rules as $rule) {
    // @todo Need to populate $before here?
    $instances = $rule->getRuleInstances();
    if (!$instances) {
      continue;
    }
    $rid = $rule->id();
    $entity_type_id = $rule->entity_type->getString();
    $field_name = $rule->field_name->getString();
    // Get db table.
    $field_storage_definition = $manager->getFieldStorageDefinition($field_name, $entity_type_id);
    $storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
    $table_mapping = $storage->getTableMapping([
      $field_name => $field_storage_definition,
    ]);
    $table_name = $table_mapping->getDedicatedDataTableName($field_storage_definition);
    foreach ($instances as $index => $instance) {
      // Update the row.
      $database->update($table_name)
        ->fields([
          $field_name . '_rrule_index' => $index,
        ])
        ->condition($field_name . '_value', $instance['value'])
        ->condition($field_name . '_end_value', $instance['end_value'])
        ->condition($field_name . '_rrule', $rid)
        ->condition($field_name . '_rrule_index', NULL, 'IS NULL')
        ->execute();
    }
  }
}

/**
 * Set site_time_toggle value on Smart Date Formats to match previous behavior.
 */
function smart_date_update_8301() {
  $format_storage = \Drupal::entityTypeManager()
    ->getStorage('smart_date_format');
  $formats = $format_storage
    ->loadMultiple(NULL);
  foreach ($formats as $format) {
    $format->set('site_time_toggle', 1);
    $format->save();
  }
}

/**
 * Helper function to find all instances of our field type and add a column.
 *
 * @param string $field_type
 *   The type of field to look for.
 * @param array $specs
 *   An array of columns to add.
 */
function _smart_date_field_columns_add($field_type, array $specs, $update_definitions = TRUE) {
  // If there are no instances of the field, nothing to do.
  if (!$field_storage_configs = \Drupal::entityTypeManager()
    ->getStorage('field_storage_config')
    ->loadByProperties(['type' => $field_type])) {
    return;
  }

  $manager = \Drupal::entityDefinitionUpdateManager();

  // Iterate through each instance of FieldStorageConfig returned.
  foreach ($field_storage_configs as $field_storage) {
    // Extract the properties needed for other calls.
    $field_name = $field_storage->getName();
    $entity_type_id = $field_storage->getTargetEntityTypeId();
    // Now collect the objects we need.
    $field_storage_definition = $manager->getFieldStorageDefinition($field_name, $entity_type_id);
    $storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
    if (!($storage instanceof NodeStorage) && !($storage instanceof SqlContentEntityStorage)) {
      return;
    }

    $table_mapping = $storage->getTableMapping([
      $field_name => $field_storage_definition,
    ]);
    $table_names = $table_mapping->getDedicatedTableNames();

    foreach ($table_names as $table_name) {
      $schema = \Drupal::database()->schema();
      // If the table doesn't exist, no need to go any further.
      $table_exists = $schema->tableExists($table_name);
      if (!$table_exists) {
        continue;
      }
      // Step through the columns to add.
      foreach ($specs as $name => $spec) {
        // Only add the column if it isn't there already.
        $new_column = $field_name . '_' . $name;
        $field_exists = $schema->fieldExists($table_name, $new_column);

        if (!$field_exists) {
          $schema->addField($table_name, $new_column, $spec, [
            'fields' => [
              $new_column => $spec,
            ],
            'indexes' => [
              $new_column => [$new_column],
            ],
          ]);
        }
      }
    }
    if ($update_definitions) {
      $manager->updateFieldStorageDefinition($field_storage_definition);
    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc