Version 1
[yaffs-website] / web / core / modules / datetime / src / Plugin / views / filter / Date.php
diff --git a/web/core/modules/datetime/src/Plugin/views/filter/Date.php b/web/core/modules/datetime/src/Plugin/views/filter/Date.php
new file mode 100644 (file)
index 0000000..afd629a
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+
+namespace Drupal\datetime\Plugin\views\filter;
+
+use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
+use Drupal\views\FieldAPIHandlerTrait;
+use Drupal\views\Plugin\views\filter\Date as NumericDate;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+/**
+ * Date/time views filter.
+ *
+ * Even thought dates are stored as strings, the numeric filter is extended
+ * because it provides more sensible operators.
+ *
+ * @ingroup views_filter_handlers
+ *
+ * @ViewsFilter("datetime")
+ */
+class Date extends NumericDate implements ContainerFactoryPluginInterface {
+
+  use FieldAPIHandlerTrait;
+
+  /**
+   * The date formatter service.
+   *
+   * @var \Drupal\Core\Datetime\DateFormatterInterface
+   */
+  protected $dateFormatter;
+
+  /**
+   * Date format for SQL conversion.
+   *
+   * @var string
+   *
+   * @see \Drupal\views\Plugin\views\query\Sql::getDateFormat()
+   */
+  protected $dateFormat = DATETIME_DATETIME_STORAGE_FORMAT;
+
+  /**
+   * The request stack used to determin current time.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Constructs a new Date handler.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin ID for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
+   *   The date formatter service.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack used to determine the current time.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, DateFormatterInterface $date_formatter, RequestStack $request_stack) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->dateFormatter = $date_formatter;
+    $this->requestStack = $request_stack;
+
+    // Date format depends on field storage format.
+    $definition = $this->getFieldStorageDefinition();
+    if ($definition->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
+      $this->dateFormat = DATETIME_DATE_STORAGE_FORMAT;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('date.formatter'),
+      $container->get('request_stack')
+    );
+  }
+
+  /**
+   * Override parent method, which deals with dates as integers.
+   */
+  protected function opBetween($field) {
+    $origin = ($this->value['type'] == 'offset') ? $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME') : 0;
+    $a = intval(strtotime($this->value['min'], $origin));
+    $b = intval(strtotime($this->value['max'], $origin));
+
+    // Formatting will vary on date storage.
+
+
+    // Convert to ISO format and format for query. UTC timezone is used since
+    // dates are stored in UTC.
+    $a = $this->query->getDateFormat("'" . $this->dateFormatter->format($a, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE) . "'", $this->dateFormat, TRUE);
+    $b = $this->query->getDateFormat("'" . $this->dateFormatter->format($b, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE) . "'", $this->dateFormat, TRUE);
+
+    // This is safe because we are manually scrubbing the values.
+    $operator = strtoupper($this->operator);
+    $field = $this->query->getDateFormat($field, $this->dateFormat, TRUE);
+    $this->query->addWhereExpression($this->options['group'], "$field $operator $a AND $b");
+  }
+
+  /**
+   * Override parent method, which deals with dates as integers.
+   */
+  protected function opSimple($field) {
+    $origin = (!empty($this->value['type']) && $this->value['type'] == 'offset') ? $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME') : 0;
+    $value = intval(strtotime($this->value['value'], $origin));
+
+    // Convert to ISO. UTC is used since dates are stored in UTC.
+    $value = $this->query->getDateFormat("'" . $this->dateFormatter->format($value, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE) . "'", $this->dateFormat, TRUE);
+
+    // This is safe because we are manually scrubbing the value.
+    $field = $this->query->getDateFormat($field, $this->dateFormat, TRUE);
+    $this->query->addWhereExpression($this->options['group'], "$field $this->operator $value");
+  }
+
+}