addtocalendar-8.x-3.x-dev/includes/addtocalendar.build.inc

includes/addtocalendar.build.inc
<?php

/**
 * @file
 * Contains preprocess helper function.
 */

use Drupal\Core\Entity\Entity\EntityViewDisplay;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Helper function to preprocess datetime field.
 */
function _addtocalendar_preprocess_field(&$variables) {
  $entity = $variables['element']['#object'];
  $view_mode = $variables['element']['#view_mode'];
  $field_name = $variables['element']['#field_name'];

  // Determine if the field is multivalued.
  $multivalued = count($variables['items']) > 1;

  // Get the field formatter settings...
  $entity_display = EntityViewDisplay::collectRenderDisplay($entity, $view_mode);
  $field_display = $entity_display->getComponent($field_name);

  if (!empty($field_display['third_party_settings']['addtocalendar'])) {
    $build['addtocalendar'] = [];
    $settings = $field_display['third_party_settings']['addtocalendar'];
    $style = [];
    if ($settings['addtocalendar_show']) {
      $token_service = \Drupal::token();
      $token_options = ['langcode' => $entity->language()->getId(), 'callback' => '', 'clear' => TRUE];
      $timeZone = (!empty($field_display['settings']['timezone_override'])) ? $field_display['settings']['timezone_override'] : date_default_timezone_get();
      $values = $entity->{$field_name}->getValue();
      $delta = !empty($settings['addtocalendar_settings']['delta']) ? $settings['addtocalendar_settings']['delta'] : 0;
      if (empty($values[$delta]['value'])) {
        return;
      }

      // Unsetting values other than delta if single value is selected.
      if ($multivalued && $settings['addtocalendar_settings']['multiple_value'] == 1) {
        $temp = $values[$delta];
        unset($values);
        $values = [$delta => $temp];
        unset($temp);
      }

      $display_text = new TranslatableMarkup($settings['addtocalendar_settings']['display_text']);
      $build['addtocalendar_button'] = [
        '#type' => 'html_tag',
        '#tag' => 'a',
        '#value' => $display_text->__toString(),
        '#attributes' => [
          'class' => 'atcb-link',
        ],
      ];

      /** @var \Drupal\Core\Render\RendererInterface $renderer */
      $renderer = \Drupal::service('renderer');
      foreach ($values as $index => $date_val) {
        $date = new DrupalDateTime(preg_replace('/T/', ' ', $values[$index]['value']), $timeZone);
        if (!empty($values[$index]['end_value']) && isset($values[$index]['end_value'])) {
          $end_date = new DrupalDateTime(preg_replace('/T/', ' ', $values[$index]['end_value']), $timeZone);
        }

        $build['addtocalendar'][$index]['atc_date_start'] = [
          '#type' => 'html_tag',
          '#tag' => 'var',
          '#value' => $date->format('Y-m-d H:i:s', ['timezone' => $timeZone]),
          '#attributes' => [
            'class' => 'atc_date_start',
          ],
        ];
        $info = [
          'atc_date_end',
          'atc_title',
          'atc_description',
          'atc_location',
          'atc_organizer',
          'atc_organizer_email',
        ];
        foreach ($info as $value) {
          switch ($settings['addtocalendar_settings'][$value]['field']) {
            case 'token':
              $class_value = $settings['addtocalendar_settings'][$value]['tokenized'];
              $class_value = $token_service->replace($class_value, ['node' => $entity], $token_options);
              break;

            case 'title':
              $class_value = $entity->getTitle();
              break;

            default:
              $field = $settings['addtocalendar_settings'][$value]['field'];
              if (strip_tags($entity->{$field}->getFieldDefinition()
                ->getType() ?? '') == 'daterange'
              ) {
                $class_value = strip_tags($entity->{$field}->end_value ?? '');
              }
              else {
                $view = $entity->get($field)->view(['label' => 'hidden']);
                $class_value = strip_tags($renderer->render($view) ?? '');
              }
              break;
          }
          $build['addtocalendar'][$index][$value] = [
            '#type' => 'html_tag',
            '#tag' => 'var',
            '#value' => $class_value,
            '#attributes' => [
              'class' => $value,
            ],
          ];
        }

        // Assign end date the value of start date if no end date is present and its not a daterange field.
        if (empty($end_date)) {
          $build['addtocalendar'][$index]['atc_date_end']['#value'] = (!empty($build['addtocalendar'][$index]['atc_date_end']['#value'])) ? $build['addtocalendar'][$index]['atc_date_start']['#value'] : $date;
          $build['addtocalendar'][$index]['atc_date_end']['#value'] = $date->format('Y-m-d H:i:s', ['timezone' => $timeZone]);
        }
        // Assign end date the value of end date if no end date is present and its a daterange field.
        else {
          $end_date_val = $end_date->__toString();
          $build['addtocalendar'][$index]['atc_date_end']['#value'] = (!empty($build['addtocalendar'][$index]['atc_date_end']['#value'])) ? $build['addtocalendar'][$index]['atc_date_end']['#value'] : $end_date_val;
          $build['addtocalendar'][$index]['atc_date_end']['#value'] = $end_date->format('Y-m-d H:i:s', ['timezone' => $timeZone]);
        }

        $build['addtocalendar'][$index]['atc_timezone'] = [
          '#type' => 'html_tag',
          '#tag' => 'var',
          '#value' => $timeZone,
          '#attributes' => [
            'class' => 'atc_timezone',
          ],
        ];

        $build['addtocalendar'][$index]['atc_privacy'] = [
          '#type' => 'html_tag',
          '#tag' => 'var',
          '#value' => $settings['addtocalendar_settings']['atc_privacy'],
          '#attributes' => [
            'class' => 'atc_privacy',
          ],
        ];

        $build['addtocalendar'][$index] = [
          '#type' => 'html_tag',
          '#tag' => 'span',
          '#value' => $renderer->render($build['addtocalendar_button']) . '<var class="atc_event">' . $renderer->render($build['addtocalendar'][$index]) . '</var>',
          '#attributes' => [
            'class' => [
              'addtocalendar',
            ],
          ],
        ];

        if ($settings['addtocalendar_settings']['data_calendars']) {
          $value = '';
          foreach ($settings['addtocalendar_settings']['data_calendars'] as $key => $set) {
            if ($set) {
              $value .= $key . ', ';
            }
          }
          if ($value) {
            $build['addtocalendar'][$index]['#attributes']['data-calendars'] = $value;
          }
        }

        $build['addtocalendar'][$index]['#attributes']['data-secure'] = $settings['addtocalendar_settings']['data_secure'];
        // Styling.
        switch ($settings['addtocalendar_settings']['style']) {
          case 'blue':
            $style['class'] = 'atc-style-blue';
            $style['library'] = 'addtocalendar/blue';
            break;

          case 'glow_orange':
            $style['class'] = 'atc-style-glow-orange';
            $style['library'] = 'addtocalendar/glow_orange';
            break;
        }
        if (!empty($style)) {
          $build['addtocalendar'][$index]['#attributes']['class'][] = $style['class'];
          $variables['#attached']['library'][] = $style['library'];
        }
      }

      // Setting #markup for all the date or daterange fields if multivalue is selected.
      if ($multivalued && $settings['addtocalendar_settings']['multiple_value'] == 2) {
        foreach ($variables['items'] as $k => $content) {
          if (isset($variables['items'][$k]['content']['#suffix'])) {
            $variables['items'][$k]['content']['#suffix'] .= $renderer->render($build['addtocalendar'][$k]);
          }
          else {
            $variables['items'][$k]['content']['#suffix'] = $renderer->render($build['addtocalendar'][$k]);
          }
          $variables['#attached']['library'][] = 'addtocalendar/base';
        }
      }
      // Setting #markup for all the date or daterange fields if single value is selected.
      else {
        if (isset($variables['items'][$delta]['content']['#suffix'])) {
          $variables['items'][$delta]['content']['#suffix'] .= $renderer->render($build['addtocalendar']);
        }
        else {
          $variables['items'][$delta]['content']['#suffix'] = $renderer->render($build['addtocalendar']);
        }
        $variables['#attached']['library'][] = 'addtocalendar/base';
      }
    }
  }
}

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

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