You are here

function openlayers_field_field_formatter_view in Openlayers 7.3

Implements hook_field_formatter_view().

File

modules/openlayers_field/openlayers_field.module, line 254
Openlayers field module.

Code

function openlayers_field_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();
  $settings = $display['settings'];
  switch ($display['type']) {

    // Render a simple map.
    case 'openlayers_map_formatter':
      foreach ($items as $delta => $item) {
        $element[$delta] = array(
          '#type' => 'openlayers',
          '#map' => $item['value'],
        );
      }
      break;

    // Render an addressfield or a textield.
    case 'openlayers_addressfield_textfield_formatter':
      $fields = array();
      foreach ($items as $delta => $item) {

        // If item is an array without a 'value' key (ex: addressfield),
        // we convert it to string, else we take the 'safe_value' of the field.
        if (is_array($item) && !isset($item['value'])) {
          $item = implode(' ', $item);
        }
        else {
          $item = $item['safe_value'];
        }
        $fields[] = array(
          'address' => $item,
          'title' => entity_label($entity_type, $entity),
          'description' => $item,
        );
      }
      list($map, $layer) = explode(':', $settings['map_layer'], 2);

      /** @var \Drupal\openlayers\Types\MapInterface $map */
      $map = \Drupal\openlayers\Openlayers::load('map', $map);

      /** @var \Drupal\openlayers\Types\LayerInterface $layer */
      if ($layer = $map
        ->getCollection()
        ->getObjectById('layer', $layer)) {
        if ($source = $layer
          ->getSource()) {
          $source
            ->setOption('geocoder_handler', $settings['geocoder_handler']);
          $source
            ->setOption('geocoder_cache', $settings['geocoder_cache']);
          $source
            ->setOption('fields', $fields);
        }
      }
      $element[0] = array(
        '#type' => 'openlayers',
        '#map' => $map,
      );
      break;

    // Render a geo file (gpx, kml, etc etc...) on a map.
    case 'openlayers_geofile_formatter':
      list($map, $layer) = explode(':', $settings['map_layer'], 2);
      foreach ($items as $delta => $item) {

        /** @var \Drupal\openlayers\Types\MapInterface $map */
        $map = \Drupal\openlayers\Openlayers::load('map', $map);

        /** @var \Drupal\openlayers\Types\LayerInterface $layer */
        if ($layer = $map
          ->getCollection()
          ->getObjectById('layer', $layer)) {
          if ($source = $layer
            ->getSource()) {
            $source
              ->setOption('url', file_create_url($item['uri']));
          }
        }
        $element[$delta] = array(
          '#type' => 'openlayers',
          '#map' => $map,
        );
      }
      break;
  }
  return $element;
}