openlayers-8.x-4.x-dev/modules/openlayers_geofield/src/Plugin/Field/FieldFormatter/OpenlayersGeofieldFormatter.php

modules/openlayers_geofield/src/Plugin/Field/FieldFormatter/OpenlayersGeofieldFormatter.php
<?php

namespace Drupal\openlayers_geofield\Plugin\Field\FieldFormatter;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\openlayers\Plugin\Field\FieldFormatter\OpenlayersFormatterBase;
use Drupal\openlayers\Openlayers;
use Drupal\openlayers\Map;

use Drupal\openlayers\Plugin\Source\Vector\Vector;

/**
 * Plugin implementation for an Openlayers Geofield field formatter.
 *
 * @FieldFormatter(
 *   id = "openlayers_geofield_formatter",
 *   label = @Translation("Openlayers Map"),
 *   description = @Translation("Provides an Openlayers field formatter."),
 *   field_types = {
 *     "geofield"
 *   }
 * )
 */
class OpenlayersGeofieldFormatter extends OpenlayersFormatterBase {

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {

    $element = [];

    foreach ($items as $delta => $item) {
      $settings = $this->getSettings();
      $map_name = $settings['map'];
      $map = Openlayers::load('Map', $map_name);
      $map->build();
      $entity = $items->getEntity();

      if ($entity->hasTranslation($langcode)) {
        $entity = $entity->getTranslation($langcode);
      }

      $entity_type = $entity->getEntityTypeId();
      $entity_id = $entity->id();

      $features = [];

      //  Set features.
      $feature = array(
        'wkt' => $item->value,
        'projection' => 'EPSG:4326',
      );
      $features[] = $feature;
      $layer_name = 'ol_geofield';

        if ($layer = $map->getCollection()->getObjectById(['layer'], $layer_name)) {
          if ($layer->getSource() instanceof Vector) {
            $layer->getSource()->setOption('features', $features);
          }
        }

//////////////////////////////

      // Render each map element as markup.

      // Add a specific map id.
      $map_id = 'openlayers-map' . '-' . $delta;
      
      //  Set height of map
      $height = $settings['height'] . $settings['height_unit'];

      $js_settings = [
        'maps' => [
  //        $map_id => $map
        ]
      ];


////////////////////////    TEMP LINES
      $js_settings['maps'][$map_id]['map']['opt'] =  [
        'width' => 'auto',
        'height' => '300px',
        'view' => [
          'center' => [
            'lat' => 0,
            'lon' => 0,
          ],
          'rotation' => 0,
          'zoom' => 2,
        ],
      ];
      
      $js_settings['maps'][$map_id]['layer'][0]['opt'] =  [
        'source' => 'openlayers_source_osm',
        'style' =>  'openlayers_style_default',
        'opacity' => 1,
        'name' => 'OpenStreetMap',
        'type' => 'base',
      ];  
////////////////////////////////////////////////////////

      $map->attach_js_settings($map_id);
      $element[$delta] = $map->renderMap($map_id, $height);
    }

    return $element;
  }

}
/*
  $element = array();

  // First check to see if we have any value and remove any unset deltas.
  foreach ($items as $delta => $item) {
    if (empty($item['geom'])) {
      unset($items[$delta]);
    }
  }

  // If there are no items, stop here. We won't show anything.
  if (empty($items)) {
    return $element;
  }

  // Ensure geophp is available.
  geophp_load();

  // Transform into centroid or bounding if needed.
  if ($display['settings']['data'] != 'full') {
    if ($display['settings']['data'] == 'centroid') {
      foreach ($items as $delta => $item) {
        $centroid_wkt = 'POINT(' . $item['lon'] . ' ' . $item['lat'] . ')';
        $centroid = geoPHP::load($centroid_wkt);
        $items[$delta] = geofield_get_values_from_geometry($centroid);
      }
    }
    if ($display['settings']['data'] == 'bounding') {
      foreach ($items as $delta => $item) {
        $envelope_wkt = 'POLYGON ((' . $item['left'] . ' ' . $item['top'] . ', ' . $item['right'] . ' ' . $item['top'] . ', ' . $item['right'] . ' ' . $item['bottom'] . ', ' . $item['left'] . ' ' . $item['bottom'] . ', ' . $item['left'] . ' ' . $item['top'] . '))';
        $envelope = geoPHP::load($envelope_wkt);
        $items[$delta] = geofield_get_values_from_geometry($envelope);
      }
    }
  }

  // If we are a lat, lon, or latlon, and we are using degrees-minutes-seconds
  // (instead of decimal degrees), then do a transformation.
  if (isset($display['settings']['format'])) {
    if ($display['settings']['format'] == 'degrees_minutes_seconds') {
      foreach ($items as $delta => $item) {
        $items[$delta]['lat'] = geofield_latlon_DECtoDMS($item['lat'], 'lat');
        $items[$delta]['lon'] = geofield_latlon_DECtoDMS($item['lon'], 'lon');
      }
    }
    if ($display['settings']['format'] == 'ccs') {
      foreach ($items as $delta => $item) {
        $items[$delta]['lat'] = geofield_latlon_DECtoCCS($item['lat'], 'lat');
        $items[$delta]['lon'] = geofield_latlon_DECtoCCS($item['lon'], 'lon');
      }
    }
  }

  // Create array of $features.
  $features = array();
  foreach ($items as $delta) {
    if (array_key_exists('geom', $delta)) {
      $geometry = geoPHP::load($delta['geom']);
    }
    else {
      $geometry = geoPHP::load($delta);
    }
    $features[] = array(
      'wkt' => $geometry->out('wkt'),
      'projection' => 'EPSG:4326',
    );
  }

  // Load map and set features.
  list($map_name, $layer_name) = explode(':', $display['settings']['map_layer_preset'], 2);

  if (count($items) && (($map = Openlayers::load('Map', $map_name)) == TRUE)) {
dpm($map);
    if ($layer = $map->getCollection()->getObjectById('layer', $layer_name)) {
      if ($layer->getSource() instanceof Vector) {
        $layer->getSource()->setOption('features', $features);
      }
    }

    // Build map.
    $element[0] = array(
      '#type' => 'openlayers',
      '#map' => $map,
    );
  }
*/

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

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