You are here

public function GeolocationGoogleMapFormatter::viewElements in Geolocation Field 8

Builds a renderable array for a field value.

Parameters

\Drupal\Core\Field\FieldItemListInterface $items: The field values to be rendered.

string $langcode: The language that should be used to render the field.

Return value

array A renderable array for $items, as an array of child elements keyed by consecutive numeric indexes starting from 0.

Overrides FormatterInterface::viewElements

File

src/Plugin/Field/FieldFormatter/GeolocationGoogleMapFormatter.php, line 151

Class

GeolocationGoogleMapFormatter
Plugin implementation of the 'geolocation_googlemap' formatter.

Namespace

Drupal\geolocation\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  if ($items
    ->count() == 0) {
    return [];
  }
  $settings = $this
    ->getSettings();
  $map_settings = $this
    ->getGoogleMapsSettings($this
    ->getSettings());
  if ($settings['use_overridden_map_settings'] && !empty($items
    ->get(0)
    ->getValue()['data']['google_map_settings']) && is_array($items
    ->get(0)
    ->getValue()['data']['google_map_settings'])) {
    $map_settings = $this
      ->getGoogleMapsSettings($items
      ->get(0)
      ->getValue()['data']);
  }
  $render_array = [
    '#theme' => 'geolocation_map_formatter',
    '#attached' => [
      'library' => [
        'geolocation/geolocation.formatter.googlemap',
      ],
      'drupalSettings' => [
        'geolocation' => [
          'google_map_url' => $this
            ->getGoogleMapsApiUrl(),
        ],
      ],
    ],
  ];
  if (empty($settings['set_marker'])) {
    $single_map = $render_array;
    $unique_id = uniqid("map-canvas-");
    if ($single_center = $items
      ->get(0)) {
      $single_map['#latitude'] = $items
        ->get(0)
        ->getValue()['lat'];
      $single_map['#longitude'] = $items
        ->get(0)
        ->getValue()['lng'];
    }
    $single_map['#uniqueid'] = $unique_id;
    $single_map['#attached']['drupalSettings']['geolocation']['maps'][$unique_id] = [
      'settings' => $map_settings,
    ];
    return $single_map;
  }
  $elements = [];
  $token_context = [
    $this->fieldDefinition
      ->getTargetEntityTypeId() => $items
      ->getEntity(),
  ];
  $locations = [];
  foreach ($items as $delta => $item) {
    $token_context['geolocation_current_item'] = $item;
    $title = \Drupal::token()
      ->replace($settings['title'], $token_context, [
      'callback' => [
        $this,
        'geolocationItemTokens',
      ],
      'clear' => TRUE,
    ]);
    $title = PlainTextOutput::renderFromHtml($title);
    if (empty($title)) {
      $title = $item->lat . ', ' . $item->lng;
    }
    $content = \Drupal::token()
      ->replace($settings['info_text'], $token_context, [
      'callback' => [
        $this,
        'geolocationItemTokens',
      ],
      'clear' => TRUE,
    ]);
    $content = PlainTextOutput::renderFromHtml($content);
    $location = [
      '#theme' => 'geolocation_common_map_location',
      '#content' => $content,
      '#title' => $title,
      '#position' => [
        'lat' => $item->lat,
        'lng' => $item->lng,
      ],
    ];
    if (!empty($settings['common_map'])) {
      $locations[] = $location;
    }
    else {
      $unique_id = uniqid("map-canvas-");
      $elements[$delta] = $render_array;
      $elements[$delta]['#locations'] = [
        $location,
      ];
      $elements[$delta]['#uniqueid'] = $unique_id;
      $elements[$delta]['#attached']['drupalSettings']['geolocation']['maps'][$unique_id] = [
        'settings' => $map_settings,
      ];
    }
  }
  if (!empty($settings['common_map'])) {
    $unique_id = uniqid("map-canvas-");
    $elements = $render_array;
    $elements['#locations'] = $locations;
    $elements['#uniqueid'] = $unique_id;
    $elements['#attached']['drupalSettings']['geolocation']['maps'][$unique_id] = [
      'settings' => $map_settings,
    ];
  }
  return $elements;
}