geolocation-8.x-3.x-dev/src/Plugin/geolocation/DataLayerProvider/GeolocationViewsDataLayer.php

src/Plugin/geolocation/DataLayerProvider/GeolocationViewsDataLayer.php
<?php

namespace Drupal\geolocation\Plugin\geolocation\DataLayerProvider;

use Drupal\geolocation\Attribute\DataLayerProvider;
use Drupal\geolocation\DataLayerProviderBase;
use Drupal\geolocation\DataLayerProviderInterface;
use Drupal\views\ViewExecutable;
use Drupal\views\Views;

/**
 * Provides default layer.
 */
#[DataLayerProvider(id: 'geolocation_views_data_layer',
  name: new \Drupal\Core\StringTranslation\TranslatableMarkup('Geolocation Views Data Layer'),
  description: new \Drupal\Core\StringTranslation\TranslatableMarkup('Views with Geolocation Data Layer Display. Cannot inherit filters.'))]
class GeolocationViewsDataLayer extends DataLayerProviderBase implements DataLayerProviderInterface {

  /**
   * View.
   *
   * @var \Drupal\views\ViewExecutable|null
   */
  protected ViewExecutable|null $view;

  /**
   * {@inheritdoc}
   */
  public function getLabel(string $data_layer_option_id, array $settings = [], ?array $context = NULL): string {
    if (isset($this->view)) {
      return $this->view->getTitle();
    }

    return $this->t('Views Data Layer');
  }

  /**
   * {@inheritdoc}
   */
  public function getLayerOptions(?array $context = NULL): array {
    $options = [];

    /** @var \Drupal\views\Entity\View[] $views */
    $views = \Drupal::entityTypeManager()
      ->getStorage('view')
      ->loadByProperties([
        'status' => TRUE,
        "display.*.display_plugin" => 'geolocation_data_layer',
      ]);

    foreach ($views as $view_id => $view) {
      foreach ($view->get('display') as $display_id => $display) {
        if ($display['display_plugin'] != "geolocation_data_layer") {
          continue;
        }

        $options[$view_id . '|' . $display_id] = [
          'name' => $view->label() . ' - ' . $display['display_title'],
          'description' => $this->getPluginDefinition()['description'],
        ];
      }
    }

    return $options;
  }

  /**
   * {@inheritdoc}
   */
  protected function getLayerId(string $data_layer_option_id = 'default'): string {
    [, $id_by_views] = explode('|', $data_layer_option_id);
    return $id_by_views;
  }

  /**
   * {@inheritdoc}
   */
  public function alterMap(array $render_array, string $data_layer_option_id = 'default', array $settings = [], array $context = []): array {
    [$view_id] = explode('|', $data_layer_option_id);

    $view = Views::getView($view_id);

    if (!$view) {
      return $render_array;
    }

    $this->view = $view;

    return parent::alterMap($render_array, $data_layer_option_id, $settings, $context);
  }

  /**
   * {@inheritdoc}
   */
  public function getLayerRenderData(string $data_layer_option_id = 'default', array $settings = [], ?array $context = NULL): array {
    [, $display_id] = explode('|', $data_layer_option_id);

    if (!$this->view->setDisplay($display_id)) {
      return [];
    }

    if (!$this->view->executed) {
      if (!$this->view->execute($display_id)) {
        return [];
      }
    }

    return $this->view->display_handler->buildRenderable();
  }

}

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

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