Skip to content
Snippets Groups Projects

UTC

Merged sleitner requested to merge issue/date_pager-3108938:3108938-paging-seems-to into 2.1.x
Files
6
@@ -35,7 +35,7 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
*
* @var string[]
*/
protected $supportedDateTypes = [
protected static $supportedDateTypes = [
'changed',
'created',
'datetime',
@@ -43,6 +43,17 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
'smartdate',
];
/**
* Unixtimestamp field types.
*
* @var string[]
*/
protected static $unixtimestampTypes = [
'changed',
'created',
'smartdate',
];
/**
* View's base entity.
*
@@ -173,6 +184,7 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
if ($field_storage) {
$this->dateFieldType = $field_storage->getType();
$this->startDateColumn = $columns['value'];
$this->endDateColumn = $columns['value'];
if (isset($columns['end_value'])) {
$this->endDateColumn = $columns['end_value'];
}
@@ -283,7 +295,7 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
$storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($base_entity_type_id);
// List all possible fields.
foreach ($this->supportedDateTypes as $field_type) {
foreach (self::$supportedDateTypes as $field_type) {
$field_map = $this->entityFieldManager->getFieldMapByFieldType($field_type);
if (isset($field_map[$base_entity_type_id])) {
foreach ($field_map[$base_entity_type_id] as $field_name => $field) {
@@ -330,18 +342,16 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
*/
public function query() {
$table_alias = $this->fieldTable;
$value_column = $this->startDateColumn;
$this->view->query->addField($table_alias, $value_column, $value_column);
if (!is_null($this->endDateColumn)) {
$end_column = $this->endDateColumn;
$this->view->query->addField($table_alias, $end_column, $end_column);
$this->view->query->addField($table_alias, $this->startDateColumn, $this->startDateColumn);
if ($this->endDateColumn !== $this->startDateColumn) {
$this->view->query->addField($table_alias, $this->endDateColumn, $this->endDateColumn);
}
// Checks if the date field is used, e.g. in a contextual filter.
$found = FALSE;
if (isset($this->view->query->where[0]['conditions'])) {
foreach ($this->view->query->where[0]['conditions'] as &$condition) {
if ($condition['field'] == $value_column) {
if ($condition['field'] == $this->startDateColumn) {
$condition['value'] = $this->activeDate . '%';
$condition['operator'] = 'LIKE';
$found = TRUE;
@@ -351,52 +361,16 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
// If the date field is not already used, add a new where query.
if (!$found) {
if ($this->dateFieldType === 'datetime') {
$this->view->query->addWhere(1, $value_column, $this->activeDate . '%', 'LIKE');
}
// If we have a (smart) date range field where start and end
// overlaps selected date.
else {
$timestamp = $this->activeDate->format('U');
switch ($this->options['granularity']) {
case 0:
$start_date = date('Y-01-01 00:00:00', $timestamp);
$end_date = date('Y-12-31 23:59:59', $timestamp);
break;
case 1:
$start_date = date('Y-m-01 00:00:00', $timestamp);
$end_date = date('Y-m-t 23:59:59', $timestamp);
break;
case 2:
$start_date = date('Y-m-d 00:00:00', $timestamp);
$end_date = date('Y-m-d 23:59:59', $timestamp);
break;
case 3:
$start_date = date('Y-m-d H:00:00', $timestamp);
$end_date = date('Y-m-d H:59:59', $timestamp);
break;
default:
$start_date = date('Y-m-d H:i:00', $timestamp);
$end_date = date('Y-m-d H:i:59', $timestamp);
break;
}
// With smartdate timestamps need to be converted to datetime.
if (in_array($this->dateFieldType, ['created', 'changed', 'smartdate'])) {
$start_date = strtotime($start_date);
$end_date = strtotime($end_date);
}
$this->view->query->addWhere(1, $value_column, $end_date, '<=');
if (in_array($this->dateFieldType, ['created', 'changed'])) {
$this->view->query->addWhere(1, $value_column, $start_date, '>=');
}
else {
$this->view->query->addWhere(1, $end_column, $start_date, '>=');
}
$localdate = clone $this->activeDate;
$start_date = $localdate->setTimezone(new \DateTimeZone('UTC'))->startDate($this->options['granularity']);
$end_date = $localdate->endDate($this->options['granularity']);
if (in_array($this->dateFieldType, self::$unixtimestampTypes)) {
$start_date = strtotime($start_date);
$end_date = strtotime($end_date);
}
$this->view->query->addWhere(1, $this->startDateColumn, $end_date, '<');
$this->view->query->addWhere(1, $this->endDateColumn, $start_date, '>=');
}
}
@@ -442,7 +416,7 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
$max_date = $this->dateRange['max'];
// With smartdate timestamps need to be converted to datetime.
if (in_array($this->dateFieldType, ['smartdate', 'created', 'changed'])) {
if (in_array($this->dateFieldType, self::$unixtimestampTypes)) {
$min_date = date($this->dateFormatString, $this->dateRange['min']);
$max_date = date($this->dateFormatString, $this->dateRange['max']);
}
@@ -453,7 +427,7 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
// Try to get activeDate from URL Parameter.
$date_parameter = $this->view->getRequest()->query->get('date');
if (isset($date_parameter) && preg_match("/^\d{4}(-[0-1][0-9](-[0-3][0-9](T[0-2][0-9](:[0-6][0-9])?)?)?)?$/", $date_parameter)) {
$this->activeDate = new PagerDate($date_parameter);
$this->activeDate = new PagerDate($date_parameter, NULL, TRUE);
}
else {
switch ($this->options['default_page']) {
@@ -467,7 +441,7 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
default:
$time = date($this->dateFormatString);
$time = new PagerDate($time, $this->dateFormatString);
$time = new PagerDate($time, $this->dateFormatString, TRUE);
break;
}
$this->activeDate = $time;
@@ -546,4 +520,60 @@ class DatePager extends PagerPluginBase implements CacheableDependencyInterface
];
}
/**
* Helper function to build rendered date links.
*
* @param array $dateitem
* Date item render array.
* @param Drupal\date_pager\PagerDate $start
* Start pager date.
* @param Drupal\date_pager\PagerDate $stop
* Stop pager date.
* @param string $subitemname
* Date sub item name.
* @param array $subitem
* Date sub item render array.
* @param string $pre
* Text before.
* @param string $post
* Text after.
* @param string $current
* Current pager date.
* @param string $checkdate
* Date to check.
* @param string $route_name
* Route name.
* @param string $active_date
* Active pager date.
* @param string $date_min
* Min pager date.
* @param string $date_max
* Max pager date.
* @param string $variables
* Variables.
*
* @return array
* Date item render array.
*/
public static function createGranularityDate($dateitem, $start, $stop, $subitemname, $subitem, $pre, $post, $current, $checkdate, $route_name, $active_date, $date_min, $date_max, $variables) {
for ($dateiterator = $start; $dateiterator < $stop; $dateiterator++) {
if (is_array($checkdate) && !checkdate($checkdate['month'], $dateiterator, $checkdate['year'])) {
continue;
}
$padded_date = str_pad($dateiterator, 2, '0', STR_PAD_LEFT);
$date = $pre . "{$padded_date}" . $post;
$pagerdate = new PagerDate($date, NULL, TRUE);
if ($pagerdate->between($date_min, $date_max)) {
$dateitem['items'][$padded_date] = $pagerdate->toLink($route_name, $active_date);
if ($padded_date == $current && isset($subitem)) {
$dateitem['items'][$padded_date][$subitemname] = $subitem;
}
}
}
if ($variables['options']['date_sort']) {
$dateitem['items'] = array_reverse($dateitem['items'], TRUE);
}
return $dateitem;
}
}
Loading