ip_geoloc-2.0.0-alpha0/src/Plugin/views/style/IpGeoLocPluginStyleOpenLayers.php

src/Plugin/views/style/IpGeoLocPluginStyleOpenLayers.php
<?php

namespace Drupal\ip_geoloc\Plugin\views\style;

use Drupal\core\form\FormStateInterface;
use Drupal\views\Plugin\views\style\StylePluginBase;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\ip_geoloc\Services\IpGeoLocAPI;
use Drupal\ip_geoloc\Services\IpGeoLocGlobal;
use Drupal\ip_geoloc\Services\IpGeoLocSession;
use Drupal\ip_geoloc\Services\IpGeoLocViewsPluginStyle;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\StringTranslation\TranslationManager;
use Symfony\Component\HttpFoundation\RequestStack;



/**
 * Views Style plugin extension for OpenLayers (if enabled).
 *
 * @ingroup views_style_plugins
 *
 * @ViewsStyle(
 *   id = "ip_geoloc_plugin_style_openlayers",
 *   title = @Translation("Openlayers"),
 *   help = @Translation("Views Style plugin extension for OpenLayers (if enabled)."),
 *   theme = "ip_geoloc_openlayers",
 *   display_types = { "normal" }
 * )
 */
class IpGeoLocPluginStyleOpenLayers extends StylePluginBase implements ContainerFactoryPluginInterface {

  public $api;
  public $module_handler;
  public $ip_geoloc_global;
  public $string_translation;
  public $session;
  public $view_plugin_style;
  public $request_stack;

  /**
   * Constructs a PluginBase object. Adds dependency injection
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, IpGeoLocAPI $api, ModuleHandlerInterface $module_handler, IpGeoLocGlobal $ip_geoloc_global, TranslationManager $string_translation, IpGeoLocSession $ip_geoloc_session, IpGeoLocViewsPluginStyle $ip_geoloc_view_plugin_style, RequestStack $request_stack  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->api = $api;
    $this->module_handler = $module_handler;
    $this->ip_geoloc_global = $ip_geoloc_global;
    $this->string_translation = $string_translation;
    $this->session = $ip_geoloc_session;
    $this->view_plugin_style = $ip_geoloc_view_plugin_style;
    $this->request_stack = $request_stack;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('ip_geoloc.api'),
      $container->get('module_handler'),
      $container->get('ip_geoloc.global'),
      $container->get('string_translation'),
      $container->get('ip_geoloc.session'),
      $container->get('ip_geoloc.views_plugin_style'),
      $container->get('request_stack')
    );
  }

  /**
   * Set default Leaflet options.
   */
  protected function defineOptions() {
    $options = parent::defineOptions();

    $latitude = $this->module_handler->moduleExists('location') ? 'location_latitude' : 'ip_geoloc_latitude';
    // For field-based modules.
    $longitude = $this->module_handler->moduleExists('location') ? 'location_longitude' : ($latitude == 'ip_geoloc_latitude' ? 'ip_geoloc_longitude' : $latitude);
    $options['ip_geoloc_views_plugin_latitude'] = ['default' => $latitude];
    $options['ip_geoloc_views_plugin_longitude'] = ['default' => $longitude];

    $options['differentiator'] = [
      'contains' => [
        'differentiator_field' => ['default' => ''],
      ],
    ];
    $options['default_marker_color'] = ['default' => ''];
    $options['center_option'] = ['default' => IP_GEOLOC_MAP_CENTER_ON_FIRST_LOCATION];
    $options['argument'] = ['default' => ''];

    return $options;

  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    parent::buildOptionsForm($form, $form_state);

    $form['map'] = [
      '#type' => 'select',
      '#title' => t('Map'),
      '#description' => t('The OpenLayers map used to place the view locations on. You can configure map and markers <a href="/admin/structure/openlayers/maps">here</a>.'),
      '#options' => openlayers_map_options(),
      '#default_value' => isset($this->options['map']) ? $this->options['map'] : \Drupal::state()->get('openlayers_default_map', 'default'),
    ];

    $form_state->set('renderer', 'openlayers');

    $this->view_plugin_style->pluginStyleBulkOfForm($this, $form, $form_state);

    // OpenLayers has "Hide empty map for Views" for this.
    unset($form['empty_map_center']);

    $form['center_option']['#options'][IP_GEOLOC_MAP_CENTER_ON_LOCATION_FROM_ARGUMENT] = t('Use lat/lon coordinate arguments from a contextual filter');
    $argument_handlers = $this->view->display_handler->get_handlers('argument');
    if (!empty($argument_handlers)) {
      $argument_options = ['' => '<' . t('none') . '>'];
      foreach ($argument_handlers as $key => $handler) {
        $argument_options[$key] = $handler->definition['group'] . ': ' . $handler->definition['title'];
      }
      $form['argument'] = [
        '#type' => 'select',
        '#title' => t('Choose a contextual filter to pull data from'),
        '#options' => $argument_options,
        '#default_value' => $this->options['argument'],
        '#weight' => 100,
      ];
    }

  }

  /**
   * Validate the options form.
   */
  public function validateOptionsForm(&$form, FormStateInterface $form_state) {
    $this->view_plugin_style->pluginStyleBulkOfFormValidate($form, $form_state);
  }

  /**
   * Transform the View result in a list of markers and render these on a map.
   */
  public function render() {
    // This somewhat mimics function openlayers_render_map_data() and class
    // openlayers_views_style_map, function render()
    $map = openlayers_map_load(isset($this->options['map']) ? $this->options['map'] : \Drupal::state()->get('openlayers_default_map', 'default'));

    // Function openlayers_build_map() invokes:
    // - hook_openlayers_map_preprocess_alter(&$map), which introduces the names
    //   of the layers we'll use: IP_GEOLOC_MARKER_LAYER_1..3 and
    //   IP_GEOLOC_VISITOR_MARKER_LAYER
    // - hook_openlayers_layers(), which creates barebone layers for the above
    // - hook_openlayers_map_alter(&$map), for modules to make final changes to
    //   the map and its layers.
    $map = openlayers_build_map($map->data);

    // Return themed map if no errors found.
    if (empty($map['errors'])) {

      ip_geoloc_plugin_style_render_fields($this);
      $locations = ip_geoloc_plugin_style_extract_locations($this);

      $center_option = !isset($this->options['center_option']) ? IP_GEOLOC_MAP_CENTER_ON_FIRST_LOCATION : $this->options['center_option'];
      $visitor_location = $this->api->getVisitorLocation();
      if ($center_option == IP_GEOLOC_MAP_CENTER_ON_VISITOR && $center_set = isset($visitor_location['longitude'])) {
        $longitude = $visitor_location['longitude'];
        $latitude = $visitor_location['latitude'];
        $map['center']['initial']['centerpoint'] = "$longitude,$latitude";
      }
      elseif (($center_option == IP_GEOLOC_MAP_CENTER_OF_LOCATIONS || $center_option == IP_GEOLOC_MAP_CENTER_OF_LOCATIONS_WEIGHTED) && !empty($locations)) {
        list($latitude, $longitude) = ip_geoloc_center_of_locations($locations, $center_option == IP_GEOLOC_MAP_CENTER_OF_LOCATIONS_WEIGHTED);
        $map['center']['initial']['centerpoint'] = "$longitude,$latitude";
        $center_set = TRUE;
      }
      elseif ($center_option == IP_GEOLOC_MAP_CENTER_ON_LOCATION_FROM_ARGUMENT) {
        if ($handler = $this->view->display_handler->get_handler('argument', $this->options['argument'])) {
          $latitude = $handler->value['lat'];
          $longitude = $handler->value['lon'];
          $map['center']['initial']['centerpoint'] = "$longitude,$latitude";
          $center_set = TRUE;
        }
      }
      foreach ($locations as $location) {
        if (isset($location->lon)) {
          $lon = $location->lon;
          $lat = $location->lat;
        }
        elseif (isset($location->longitude)) {
          $lon = $location->longitude;
          $lat = $location->latitude;
        }
        else {
          continue;
        }
        if (empty($center_set) && $center_option == IP_GEOLOC_MAP_CENTER_ON_FIRST_LOCATION) {
          $map['center']['initial']['centerpoint'] = "$lon,$lat";
          $center_set = TRUE;
        }
        $feature = [
          // Only 'name' and 'description' are valid attribute names.
          // @see openlayers_behavior_popup.js
          'attributes' => ['description' => $location->balloon_text],
          'projection' => 'EPSG:4326',
          'wkt' => "POINT($lon $lat)",
        ];
        $layer = isset($location->marker_color) && is_numeric($location->marker_color) ? $location->marker_color : 1;
        $map['layers'][IP_GEOLOC_MARKER_LAYER . $layer]['features'][] = $feature;
      }

      // See admin/structure/openlayers/maps/<map-name>/edit...
      // If "Hide empty map for Views" is ticked, then if the map has no
      // features, it should not be displayed.
      if (!empty($map['hide_empty_map'])) {
        $num_location_marker_layers = \Drupal::state()->get('ip_geoloc_num_location_marker_layers', IP_GEOLOC_DEF_NUM_MARKER_LAYERS);
        for ($layer = 1; $layer <= $num_location_marker_layers; $layer++) {
          if (!empty($map['layers'][IP_GEOLOC_MARKER_LAYER . $layer]['features'])) {
            $some_location_layers = TRUE;
            break;
          }
        }
        if (empty($some_location_layers) && empty($map['layers'][IP_GEOLOC_VISITOR_MARKER_LAYER]['features'])) {
          // Nothing to show.
          return '';
        }
      }

      $js = ['openlayers' => ['maps' => [$map['id'] => $map]]];
      drupal_add_js($js, 'setting');

      // Unlike openlayers.theme.inc, theme_openlayers_map(), we use a template.
      //
      // To ensure that any controls are on the map correctly, we need to
      // wrap the map in a container, and take into account %-dimensions.
      $container_width = $map['width'];
      $container_height = $map['height'];
      $map['width'] = (strpos($map['width'], '%') > 0) ? '100%' : $map['width'];
      $map['height'] = (strpos($map['height'], '%') > 0) ? '100%' : $map['height'];

      // Uses ip-geoloc-openlayers.tpl.php.
      $output = theme(['ip_geoloc_openlayers'], [
        'view' => $this->view,
        // 'options' => $this->options,.
        'map' => $map,
        'container_width' => $container_width,
        'container_height' => $container_height,
      ]);
    }
    else {
      $output = implode('<br/>', $map['errors']);
    }
    return $output;
  }

}

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

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