function FormatDate::transform

Same name in other branches
  1. 9 core/modules/migrate/src/Plugin/migrate/process/FormatDate.php \Drupal\migrate\Plugin\migrate\process\FormatDate::transform()
  2. 10 core/modules/migrate/src/Plugin/migrate/process/FormatDate.php \Drupal\migrate\Plugin\migrate\process\FormatDate::transform()
  3. 11.x core/modules/migrate/src/Plugin/migrate/process/FormatDate.php \Drupal\migrate\Plugin\migrate\process\FormatDate::transform()

Overrides ProcessPluginBase::transform

File

core/modules/migrate/src/Plugin/migrate/process/FormatDate.php, line 102

Class

FormatDate
Converts date/datetime from one format to another.

Namespace

Drupal\migrate\Plugin\migrate\process

Code

public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    if (empty($value) && $value !== '0' && $value !== 0) {
        return '';
    }
    // Validate the configuration.
    if (empty($this->configuration['from_format'])) {
        throw new MigrateException('Format date plugin is missing from_format configuration.');
    }
    if (empty($this->configuration['to_format'])) {
        throw new MigrateException('Format date plugin is missing to_format configuration.');
    }
    $fromFormat = $this->configuration['from_format'];
    $toFormat = $this->configuration['to_format'];
    if (isset($this->configuration['timezone'])) {
        @trigger_error('Configuration key "timezone" is deprecated in 8.4.x and will be removed before Drupal 9.0.0, use "from_timezone" and "to_timezone" instead. See https://www.drupal.org/node/2885746', E_USER_DEPRECATED);
        $from_timezone = $this->configuration['timezone'];
        $to_timezone = isset($this->configuration['to_timezone']) ? $this->configuration['to_timezone'] : NULL;
    }
    else {
        $system_timezone = date_default_timezone_get();
        $default_timezone = !empty($system_timezone) ? $system_timezone : 'UTC';
        $from_timezone = isset($this->configuration['from_timezone']) ? $this->configuration['from_timezone'] : $default_timezone;
        $to_timezone = isset($this->configuration['to_timezone']) ? $this->configuration['to_timezone'] : $default_timezone;
    }
    $settings = isset($this->configuration['settings']) ? $this->configuration['settings'] : [];
    // Older versions of Drupal where omitting certain granularities (also known
    // as "collected date attributes") resulted in invalid timestamps getting
    // stored.
    if ($fromFormat === 'Y-m-d\\TH:i:s') {
        $value = str_replace([
            '-00-00T',
            '-00T',
        ], [
            '-01-01T',
            '-01T',
        ], $value);
    }
    // Attempts to transform the supplied date using the defined input format.
    // DateTimePlus::createFromFormat can throw exceptions, so we need to
    // explicitly check for problems.
    try {
        $transformed = DateTimePlus::createFromFormat($fromFormat, $value, $from_timezone, $settings)->format($toFormat, [
            'timezone' => $to_timezone,
        ]);
    } catch (\InvalidArgumentException $e) {
        throw new MigrateException(sprintf("Format date plugin could not transform '%s' using the format '%s' for destination '%s'. Error: %s", $value, $fromFormat, $destination_property, $e->getMessage()), $e->getCode(), $e);
    } catch (\UnexpectedValueException $e) {
        throw new MigrateException(sprintf("Format date plugin could not transform '%s' using the format '%s' for destination '%s'. Error: %s", $value, $fromFormat, $destination_property, $e->getMessage()), $e->getCode(), $e);
    }
    return $transformed;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.