geolocation-8.x-3.x-dev/src/Hook/Tokens.php

src/Hook/Tokens.php
<?php

namespace Drupal\geolocation\Hook;

use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Hook\Attribute\Hook;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\Utility\Error;

/**
 * Hook implementations for geolocation module token functionality.
 */
class Tokens {

  /**
   * Implements hook_token_info().
   */
  #[Hook('token_info')]
  public function tokenInfo(): array {
    if (!\Drupal::hasService('token.entity_mapper')) {
      return [];
    }

    $types = [];
    $tokens = [];

    foreach (\Drupal::entityTypeManager()->getDefinitions() as $entity_type_id => $entity_type) {
      if (!$entity_type->entityClassImplements(ContentEntityInterface::class)) {
        continue;
      }
      $token_type = \Drupal::service('token.entity_mapper')->getTokenTypeForEntityType($entity_type_id);
      if (empty($token_type)) {
        continue;
      }

      /** @var \Drupal\Core\Field\FieldStorageDefinitionInterface[] $fields */
      $fields = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions($entity_type_id);
      foreach ($fields as $field_name => $field) {
        if ($field->getType() != 'geolocation') {
          continue;
        }

        $tokens[$token_type . '-' . $field_name]['lat_sex'] = [
          'name' => t("Latitude in sexagesimal notation"),
          'description' => NULL,
          'module' => 'geolocation',
        ];
        $tokens[$token_type . '-' . $field_name]['lng_sex'] = [
          'name' => t("Longitude in sexagesimal notation"),
          'description' => NULL,
          'module' => 'geolocation',
        ];

        $tokens[$token_type . '-' . $field_name]['data'] = [
          'name' => t("Data"),
          'description' => NULL,
          'module' => 'geolocation',
        ];
      }
    }

    return [
      'types' => $types,
      'tokens' => $tokens,
    ];
  }

  /**
   * Implements hook_tokens().
   */
  #[Hook('tokens')]
  public function tokensReplacement(string $type, array $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata): array {
    $replacements = [];

    if (!empty($data['field_property'])) {
      foreach ($tokens as $token => $original) {
        $delta = 0;
        $parts = explode(':', $token);
        if (is_numeric($parts[0])) {
          if (count($parts) > 1) {
            $delta = $parts[0];
            $property_name = $parts[1];
          }
          else {
            continue;
          }
        }
        else {
          $property_name = $parts[0];
        }
        if (!isset($data[$data['field_name']][$delta])) {
          continue;
        }

        /** @var \Drupal\geolocation\Plugin\Field\FieldType\GeolocationItem $item */
        $item = $data[$data['field_name']][$delta];

        switch ($property_name) {

          case 'lng_sex':
            $replacements[$original] = $item::decimalToSexagesimal($item->get('lng')->getValue());
            break;

          case 'lat_sex':
            $replacements[$original] = $item::decimalToSexagesimal($item->get('lat')->getValue());
            break;

          case 'data':
            // Handle data tokens.
            $metadata = $item->get('data')->getValue();
            if (is_array($metadata) || ($metadata instanceof \Traversable)) {
              foreach ($metadata as $key => $value) {
                try {
                  // Maybe there is values inside the values.
                  if (is_array($value) || ($value instanceof \Traversable)) {
                    foreach ($value as $deepkey => $deepvalue) {
                      if (is_string($deepvalue)) {
                        $replacements[$token . ':' . $key . ':' . $deepkey . ']'] = $deepvalue;
                      }
                    }
                  }
                  else {
                    $replacements[$token . ':' . $key . ']'] = (string) $value;
                  }
                }
                catch (\Exception $e) {
                  $logger = \Drupal::logger('geolocation');
                  Error::logException($logger, $e);
                }
              }
            }
            break;

        }
      }
    }

    return $replacements;
  }

}

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

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