View source
<?php
namespace Drupal\smart_date\Commands;
use Drush\Commands\DrushCommands;
class SmartDateDrushCommands extends DrushCommands {
public function migrate($bundle, $dest, $source_start, $source_end = NULL, $source_all_day = NULL, $options = [
'clear' => FALSE,
'entity' => 'node',
'default_duration' => 0,
'langcode' => NULL,
]) {
$entity = $options['entity'];
$dest_table = $entity . '__' . $dest;
$def_duration = (int) $options['default_duration'];
$connection = \Drupal::service('database');
if ($options['clear']) {
$this
->output()
->writeln('Clearing existing values.');
$connection
->truncate($dest_table)
->execute();
}
$this
->output()
->writeln('Starting date migration.');
$events = \Drupal::entityTypeManager()
->getStorage($entity)
->loadByProperties([
'type' => $bundle,
]);
$utc = new \DateTimeZone('UTC');
foreach ($events as $event) {
$dates = $event
->get($source_start)
->getValue();
$all_day_set = [];
if ($source_all_day) {
$all_day_set = $event
->get($source_all_day)
->getValue();
}
$end_dates_set = [];
if ($source_end && $source_start != $source_end) {
$end_dates_set = $event
->get($source_end)
->getValue();
}
$fallback_langcode = $event
->get($source_start)
->getLangcode();
if (empty($fallback_langcode)) {
$fallback_langcode = 'und';
}
$langcode = $options['langcode'] ?? $fallback_langcode;
foreach ($dates as $delta => $date) {
$start_date = $date['value'];
if ($all_day_set) {
$all_day = $all_day_set[$delta]['value'];
}
else {
$all_day = FALSE;
}
if (!empty($all_day)) {
$date = new \DateTime(substr($start_date, 0, -8) . '00:00:00', $utc);
$date = $date
->format('U');
$start_date = $date;
$end_date = $date + 86340;
$duration = 1439;
}
else {
$start_date = new \DateTime($start_date, $utc);
$start_date = $start_date
->format('U');
$start_date -= $start_date % 60;
$end_date = NULL;
if ($end_dates_set && isset($end_dates_set[$delta]['value'])) {
$end_date = $end_dates_set[$delta]['value'];
}
else {
if (!empty($date['end_value'])) {
$end_date = $date['end_value'];
}
}
if (!empty($end_date)) {
$end_date = new \DateTime($end_date, $utc);
$end_date = $end_date
->format('U');
$end_date -= $end_date % 60;
if ($start_date < $end_date) {
$duration = round(($end_date - $start_date) / 60);
}
else {
$end_date = NULL;
}
}
if (!$end_date) {
$end_date = $start_date + $def_duration * 60;
$duration = $def_duration;
}
$result = $connection
->insert($dest_table)
->fields([
'bundle' => $bundle,
'deleted' => 0,
'entity_id' => $event
->id(),
'revision_id' => $event
->getRevisionId(),
'langcode' => $langcode,
'delta' => $delta,
$dest . '_value' => $start_date,
$dest . '_end_value' => $end_date,
$dest . '_duration' => $duration,
$dest . '_rrule' => NULL,
$dest . '_rrule_index' => NULL,
$dest . '_timezone' => '',
])
->execute();
}
}
}
$this
->output()
->writeln('Finished date migration, flushing caches.');
drupal_flush_all_caches();
}
}