Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / modules / migrate / src / Plugin / migrate / process / FormatDate.php
index b197f17f60f6c7dc8a6bb737211726bfed61a618..9448ca2fff269dd7badaf11db7e9d91fad26d775 100644 (file)
@@ -15,13 +15,32 @@ use Drupal\migrate\Row;
  * - from_format: The source format string as accepted by
  *   @link http://php.net/manual/datetime.createfromformat.php \DateTime::createFromFormat. @endlink
  * - to_format: The destination format.
- * - timezone: String identifying the required time zone, see
+ * - timezone: (deprecated) String identifying the required time zone, see
+ *   DateTimePlus::__construct(). The timezone configuration key is deprecated
+ *   in Drupal 8.4.x and will be removed before Drupal 9.0.0, use from_timezone
+ *   and to_timezone instead.
+ * - from_timezone: String identifying the required source time zone, see
+ *   DateTimePlus::__construct().
+ * - to_timezone: String identifying the required destination time zone, see
  *   DateTimePlus::__construct().
  * - settings: keyed array of settings, see DateTimePlus::__construct().
  *
+ * Configuration keys from_timezone and to_timezone are both optional. Possible
+ * input variants:
+ * - Both from_timezone and to_timezone are empty. Date will not be converted
+ *   and be treated as date in default timezone.
+ * - Only from_timezone is set. Date will be converted from timezone specified
+ *   in from_timezone key to the default timezone.
+ * - Only to_timezone is set. Date will be converted from the default timezone
+ *   to the timezone specified in to_timezone key.
+ * - Both from_timezone and to_timezone are set. Date will be converted from
+ *   timezone specified in from_timezone key to the timezone specified in
+ *   to_timezone key.
+ *
  * Examples:
  *
- * Example usage for date only fields (DATETIME_DATE_STORAGE_FORMAT):
+ * Example usage for date only fields
+ * (DateTimeItemInterface::DATE_STORAGE_FORMAT):
  * @code
  * process:
  *   field_date:
@@ -34,7 +53,8 @@ use Drupal\migrate\Row;
  * If the source value was '01/05/1955' the transformed value would be
  * 1955-01-05.
  *
- * Example usage for datetime fields (DATETIME_DATETIME_STORAGE_FORMAT):
+ * Example usage for datetime fields
+ * (DateTimeItemInterface::DATETIME_STORAGE_FORMAT):
  * @code
  * process:
  *   field_time:
@@ -54,7 +74,8 @@ use Drupal\migrate\Row;
  *     plugin: format_date
  *     from_format: 'Y-m-d\TH:i:sO'
  *     to_format: 'Y-m-d\TH:i:s'
- *     timezone: 'America/Managua'
+ *     from_timezone: 'America/Managua'
+ *     to_timezone: 'UTC'
  *     settings:
  *       validate_format: false
  *     source: event_time
@@ -65,6 +86,7 @@ use Drupal\migrate\Row;
  *
  * @see \DateTime::createFromFormat()
  * @see \Drupal\Component\Datetime\DateTimePlus::__construct()
+ * @see \Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface
  * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
@@ -91,14 +113,24 @@ class FormatDate extends ProcessPluginBase {
 
     $fromFormat = $this->configuration['from_format'];
     $toFormat = $this->configuration['to_format'];
-    $timezone = isset($this->configuration['timezone']) ? $this->configuration['timezone'] : NULL;
+    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'] : [];
 
     // 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, $timezone, $settings)->format($toFormat);
+      $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". Error: %s', $value, $fromFormat, $e->getMessage()), $e->getCode(), $e);