eventbrite_one_way_sync-1.0.0/modules/eventbrite_one_way_sync_node/src/FieldMapper/FieldMapper.php

modules/eventbrite_one_way_sync_node/src/FieldMapper/FieldMapper.php
<?php

namespace Drupal\eventbrite_one_way_sync_node\FieldMapper;

use Drupal\Core\Entity\EntityInterface;
use Drupal\eventbrite_one_way_sync_node\Utilities\DependencyInjection;
use Drupal\node\NodeInterface;

/**
 * Maps field on node save.
 */
class FieldMapper implements FieldMapperInterface {

  use DependencyInjection;

  /**
   * {@inheritdoc}
   */
  public function hookEntityPresave(EntityInterface $entity) {
    try {
      $struct = [];
      $eventbrite_account_label = '';

      if ($node = $this->nodeFactory()->entityToNodeAndStruct($entity, $struct, $eventbrite_account_label)) {
        // At this point the node is a valid node, we can now do our mapping.
        $this->mapTitle($node, $struct, $eventbrite_account_label);
        $this->mapDates($node, $struct, $eventbrite_account_label);
      }
    }
    catch (\Throwable $t) {
      // In case of any exception, do not completely break the workflow.
      $this->errorLogger()->logThrowable($t);
    }
  }

  /**
   * Map the title.
   *
   * @param \Drupal\node\NodeInterface $node
   *   A node.
   * @param array $struct
   *   An eventbrite struct.
   * @param string $eventbrite_account_label
   *   The Eventbrite account label.
   */
  public function mapTitle(NodeInterface $node, array $struct, string $eventbrite_account_label) {
    $first = array_shift($struct);
    if (!empty($first['name']['text']) && is_string($first['name']['text'])) {
      $node->setTitle($first['name']['text']);
    }
  }

  /**
   * Map the dates.
   *
   * @param \Drupal\node\NodeInterface $node
   *   A node.
   * @param array $struct
   *   An eventbrite struct.
   * @param string $eventbrite_account_label
   *   The Eventbrite account label.
   */
  public function mapDates(NodeInterface $node, array $struct, string $eventbrite_account_label) {
    $date_field = $this->nodeConfig()->dateField($eventbrite_account_label);

    foreach ($struct as $eventbrite_event) {
      $this->addDateFromEventbriteEvent($eventbrite_event, $node, $date_field);
    }
  }

  /**
   * Map a single date.
   *
   * @param array $eventbrite_event
   *   An eventbrite event.
   * @param \Drupal\node\NodeInterface $node
   *   A node.
   * @param string $date_field
   *   A date field to use.
   */
  public function addDateFromEventbriteEvent(array $eventbrite_event, NodeInterface $node, string $date_field) {
    // We store our dates in UTC.
    $start = $eventbrite_event['start']['utc'] ?? '';
    $end = $eventbrite_event['end']['utc'] ?? '';

    if (!$start || !$end) {
      return;
    }

    // Remove the timezone indicator.
    $start = str_replace('Z', '', $start);
    $end = str_replace('Z', '', $end);

    // Perhaps this event exists in the dates already.
    if ($this->exists($node, $start, $end, $date_field)) {
      return;
    }

    $field_val = $node->get($date_field)->getValue();
    $field_val = array_merge($field_val, [$this->toDrupalFormat($start, $end)]);

    $node->{$date_field} = $field_val;
  }

  /**
   * A date in Drupal format.
   *
   * @param string $start
   *   Start date.
   * @param string $end
   *   End date.
   *
   * @return array
   *   Suitable for Drupal field.
   */
  public function toDrupalFormat(string $start, string $end) : array {
    return [
      'value' => $start,
      'end_value' => $end,
    ];
  }

  /**
   * Does a date already exist in the node.
   *
   * @param \Drupal\node\NodeInterface $node
   *   Node.
   * @param string $start
   *   Start date.
   * @param string $end
   *   End date.
   * @param string $date_field
   *   A date field.
   *
   * @return bool
   *   TRUE if exists.
   */
  public function exists(NodeInterface $node, string $start, string $end, string $date_field) : bool {
    $field_val = $node->get($date_field)->getValue();

    foreach ($field_val as $single_field_val) {
      if ($start == $single_field_val['value'] && $end == $single_field_val['end_value']) {
        return TRUE;
      }
    }

    return FALSE;
  }

}

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

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