View source
<?php
namespace Drupal\views_ical;
use Drupal\Core\Entity\ContentEntityInterface;
use Eluceo\iCal\Component\Event;
use Drupal\views\ResultRow;
final class ViewsIcalHelper implements ViewsIcalHelperInterface {
private $view;
public function setView($view) {
$this->view = $view;
}
protected function createDefaultEvent(ContentEntityInterface $entity, array $field_mapping) : Event {
if (isset($field_mapping['uid_field']) && ($field_mapping['uid_field'] == 'nid' || $field_mapping['uid_field'] == 'nothing')) {
$uid = $entity
->id();
if (isset($this->view->field[$field_mapping['uid_field']]->options['alter']['alter_text']) && $this->view->field[$field_mapping['uid_field']]->options['alter']['alter_text']) {
$alter_text = $this->view->field[$field_mapping['uid_field']]->options['alter']['text'];
$fields = array_keys($this->view->field);
foreach ($fields as $field) {
if ($entity
->hasField($field)) {
if ($entity
->get($field)
->getDataDefinition()
->getType() == 'created') {
$settings = $this->view->field['created']->options['settings'];
[
'custom_date_format',
];
if ($settings['date_format'] == 'custom') {
$field_value = \Drupal::service('date.formatter')
->format($entity
->get($field)
->getString(), 'custom', $settings['custom_date_format']);
}
else {
$field_value = \Drupal::service('date.formatter')
->format($entity
->get($field)
->getString(), $settings['date_format']);
}
}
else {
$field_value = $entity
->get($field)
->getString();
}
$alter_text = str_replace("{{ {$field} }}", $field_value, $alter_text);
}
}
$uid = $alter_text;
}
}
else {
if (isset($field_mapping['uid_field']) && $field_mapping['uid_field'] != 'none' && $entity
->hasField($field_mapping['uid_field']) && !$entity
->get($field_mapping['uid_field'])
->isEmpty()) {
$uid = $entity
->get($field_mapping['uid_field'])
->getString();
}
else {
$uid = null;
}
}
$event = new Event($uid);
if (isset($field_mapping['summary_field']) && $entity
->hasField($field_mapping['summary_field'])) {
if ($field_mapping['summary_field'] == 'body' && !$entity
->get('body')
->isEmpty()) {
$summary = $entity
->get('body')
->getValue()[0]['value'];
}
else {
$summary = $entity
->get($field_mapping['summary_field'])
->getString();
}
if ($summary) {
$event
->setSummary($summary);
}
}
if (isset($field_mapping['rrule_field']) && $entity
->hasField($field_mapping['rrule_field'])) {
$rrule = $entity
->get($field_mapping['rrule_field'])
->getString();
if ($rrule) {
$event
->setRrule($rrule);
}
}
if (isset($field_mapping['location_field']) && $entity
->hasField($field_mapping['location_field'])) {
if ($field_mapping['location_field'] == 'body' && !$entity
->get('body')
->isEmpty()) {
$location = $entity
->get('body')
->getValue()[0]['value'];
$event
->setLocation($location);
}
else {
$location = $entity->{$field_mapping['location_field']}
->first();
$event
->setLocation($location
->getValue()['value']);
}
}
if (isset($field_mapping['url_field']) && $entity
->hasField($field_mapping['url_field'])) {
if ($field_mapping['url_field'] == 'body' && !$entity
->get('body')
->isEmpty()) {
$url = $entity
->get('body')
->getValue()[0]['value'];
$event
->setUrl($url);
}
else {
$url = $entity->{$field_mapping['url_field']}
->first();
$event
->setUrl($url
->getValue()['value']);
}
}
if (isset($field_mapping['description_field']) && $entity
->hasField($field_mapping['description_field'])) {
if ($field_mapping['location_field'] == 'body') {
$description = $entity->{$field_mapping['description_field']}
->getValue()[0]['value'];
$event
->setDescription($description);
}
else {
$description = $entity->{$field_mapping['description_field']}
->first();
$event
->setDescription(\strip_tags($description
->getValue()['value']));
}
}
$event
->setUseTimezone(TRUE);
return $event;
}
public function addDateRangeEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
$entity = $row->_entity;
$utc_timezone = new \DateTimeZone('UTC');
$datefield_values = $entity
->get($field_mapping['date_field'])
->getValue();
foreach ($entity
->get($field_mapping['date_field'])
->getValue() as $date_entry) {
$event = $this
->createDefaultEvent($entity, $field_mapping);
$start_datetime = new \DateTime($date_entry['value'], $utc_timezone);
$start_datetime
->setTimezone($timezone);
$event
->setDtStart($start_datetime);
if (!empty($date_entry['end_value'])) {
$end_datetime = new \DateTime($date_entry['end_value'], $utc_timezone);
$end_datetime
->setTimezone($timezone);
$event
->setDtEnd($end_datetime);
if ($date_all_day = false) {
}
else {
if (isset($field_mapping['no_time_field']) && $field_mapping['no_time_field'] != 'none') {
$all_day = $entity
->get($field_mapping['no_time_field'])
->getValue();
if ($all_day && isset($all_day[0]['value']) && $all_day[0]['value']) {
$event
->setNoTime(true);
}
}
}
}
$events[] = $event;
}
}
public function addDateTimeEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
$entity = $row->_entity;
$utc_timezone = new \DateTimeZone('UTC');
$datefield_values = $entity
->get($field_mapping['date_field'])
->getValue();
if (isset($field_mapping['end_date_field']) && $field_mapping['end_date_field'] != 'none') {
$event = $this
->createDefaultEvent($entity, $field_mapping);
$date_entry = $datefield_values[0];
$start_datetime = new \DateTime($date_entry['value'], $utc_timezone);
$start_datetime
->setTimezone($timezone);
$event
->setDtStart($start_datetime);
$end_date_field_values = $entity
->get($field_mapping['end_date_field'])
->getValue();
$end_date_entry = $end_date_field_values[0];
$end_datetime = new \DateTime($end_date_entry['value'], $utc_timezone);
$end_datetime
->setTimezone($timezone);
$event
->setDtEnd($end_datetime);
if (isset($field_mapping['no_time_field']) && $field_mapping['no_time_field'] != 'none') {
$all_day = $entity
->get($field_mapping['no_time_field'])
->getValue();
if ($all_day && isset($all_day[0]['value']) && $all_day[0]['value']) {
$event
->setNoTime(TRUE);
}
}
$events[] = $event;
}
}
public function addEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
}
public function addDateRecurEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
$entity = $row->_entity;
$field_items = $entity->{$field_mapping['date_field']};
foreach ($field_items as $index => $item) {
$occurrences = $item
->getHelper()
->getOccurrences();
foreach ($occurrences as $occurrence) {
$event = $this
->createDefaultEvent($entity, $field_mapping);
$start_datetime = $occurrence
->getStart();
$start_datetime
->setTimezone($timezone);
$event
->setDtStart($start_datetime);
$end_datetime = $occurrence
->getEnd();
$end_datetime
->setTimezone($timezone);
$event
->setDtEnd($end_datetime);
$events[] = $event;
}
}
}
public function replaceTokens($value, $entity = NULL) {
$token_service = \Drupal::token();
$email_auth = $token_service
->replace($value, array(
'node' => $entity,
));
return $value;
}
}