degov-8.x-2.0/modules/degov_search_content/src/Plugin/facets/query_type/DegovDateRange.php

modules/degov_search_content/src/Plugin/facets/query_type/DegovDateRange.php
<?php

namespace Drupal\degov_search_content\Plugin\facets\query_type;

use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\facets\Plugin\facets\query_type\SearchApiDate;

/**
 *
 * @FacetsQueryType(
 *   id = "search_api_degov_date_range",
 *   label = @Translation("Date Range"),
 * )
 */
class DegovDateRange extends SearchApiDate {

  /**
   * {@inheritdoc}
   */
  public function execute() {
    $query = $this->query;

    // Alter the query here.
    if (!empty($query)) {
      $options = &$query->getOptions();

      $operator = $this->facet->getQueryOperator();
      $field_identifier = $this->facet->getFieldIdentifier();
      $exclude = $this->facet->getExclude();
      $options['search_api_facets'][$field_identifier] = [
        'field' => $field_identifier,
        'limit' => $this->facet->getHardLimit(),
        'operator' => $this->facet->getQueryOperator(),
        'min_count' => $this->facet->getMinCount(),
        'missing' => FALSE,
      ];

      // Add the filter to the query if there are active values.
      $active_items = $this->facet->getActiveItems();
      $filter = $query->createConditionGroup($operator, ['facet:' . $field_identifier]);
      if (count($active_items)) {
        foreach ($active_items as $value) {
          $range = $this->calculateRange($value);

          $item_filter = $query->createConditionGroup('AND', ['facet:' . $field_identifier]);
          if ($range['start']) {
            $item_filter->addCondition($this->facet->getFieldIdentifier(), $range['start'], $exclude ? '<' : '>=');
          }
          if ($range['stop']) {
            $item_filter->addCondition($this->facet->getFieldIdentifier(), $range['stop'], $exclude ? '>' : '<=');
          }
          if ($range['start'] || $range['stop']) {
            $filter->addConditionGroup($item_filter);
          }
        }
        if (!empty($filter->getConditions())) {
          $query->addConditionGroup($filter);
        }
      }
    }
  }

  /**
   * Returns a start and end date based on a unix timestamp.
   *
   * This method returns a start and end date with an absolute interval, based
   * on the granularity set in the widget.
   *
   * @param int $value
   *   Unix timestamp.
   *
   * @return array
   *   An array with a start and end date as unix timestamps.
   *
   * @throws \Exception
   *   Thrown when creating a date fails.
   */
  protected function calculateRangeAbsolute($value) {
    $dateTime = new DrupalDateTime();

    $value = trim($value, '[]');
    $value = explode(' TO ', $value);
    if (empty($value) || count($value) != 2) {
      return;
    }
    // Check if the date in query string is valid.
    $isValidStartDate = strtotime($value[0]);
    $isValidEndDate = strtotime($value[1]);

    if ($isValidStartDate) {
      switch ($this->getGranularity()) {
        case static::FACETAPI_DATE_YEAR:
          $value[0] = date('Y', $isValidStartDate);
          break;
        case static::FACETAPI_DATE_MONTH:
          $value[0] = date('Y-m', $isValidStartDate);
          break;
        case static::FACETAPI_DATE_DAY:
          $value[0] = date('Y-m-d', $isValidStartDate);
          break;
        case static::FACETAPI_DATE_HOUR:
          $value[0] = date('Y-m-d\TH:', $isValidStartDate);
          break;
        case static::FACETAPI_DATE_MINUTE:
          $value[0] = date('Y-m-d\TH:i:', $isValidStartDate);
          break;
        case static::FACETAPI_DATE_SECOND:
          $value[0] = date('Y-m-d\TH:i:s', $isValidStartDate);
          break;
      }
    }

    if ($isValidEndDate) {
      switch ($this->getGranularity()) {
        case static::FACETAPI_DATE_YEAR:
          $value[1] = date('Y', $isValidEndDate);
          break;
        case static::FACETAPI_DATE_MONTH:
          $value[1] = date('Y-m', $isValidEndDate);
          break;
        case static::FACETAPI_DATE_DAY:
          $value[1] = date('Y-m-d', $isValidEndDate);
          break;
        case static::FACETAPI_DATE_HOUR:
          $value[1] = date('Y-m-d\TH:', $isValidEndDate);
          break;
        case static::FACETAPI_DATE_MINUTE:
          $value[1] = date('Y-m-d\TH:i:', $isValidEndDate);
          break;
        case static::FACETAPI_DATE_SECOND:
          $value[1] = date('Y-m-d\TH:i:s', $isValidEndDate);
          break;
      }
    }

    switch ($this->getGranularity()) {
      case static::FACETAPI_DATE_YEAR:
        if ($isValidStartDate) {
          $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[0] . '-01-01T00:00:00');
        }
        if ($isValidEndDate) {
          $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[1] . '-12-31T23:59:59');
        }
        break;

      case static::FACETAPI_DATE_MONTH:
        if ($isValidStartDate) {
          $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[0] . '-01T00:00:00');
        }
        if ($isValidEndDate && isset($startDate)) {
          $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[1] . '-' . $startDate->format('t') . 'T23:59:59');
        }
        break;

      case static::FACETAPI_DATE_DAY:
        if ($isValidStartDate) {
          $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[0] . 'T00:00:00');
        }
        if ($isValidEndDate) {
          $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[1] . 'T23:59:59');
        }
        break;

      case static::FACETAPI_DATE_HOUR:
        if ($isValidStartDate) {
          $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[0] . '00:00');
        }
        if ($isValidEndDate) {
          $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[1] . '59:59');
        }
        break;

      case static::FACETAPI_DATE_MINUTE:
        if ($isValidStartDate) {
          $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[0] . ':00');
        }
        if ($isValidEndDate) {
          $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[1] . ':59');
        }
        break;

      case static::FACETAPI_DATE_SECOND:
        if ($isValidStartDate) {
          $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[0]);
        }
        if ($isValidEndDate) {
          $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value[1]);
        }
        break;

    }

    return [
      'start' => isset($startDate) ? $startDate->format('U') : FALSE,
      'stop' => isset($stopDate) ? $stopDate->format('U') : FALSE,
    ];
  }

}

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

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