在启用了“ 查看日期”模块的 Drupal 7中,按日期过滤视图非常简单:UI仅为您提供了这样做的选项。
但是,在Drupal 8中,日期字段和视图是核心的一部分,但是如果您选择日期范围字段作为视图中的过滤器,它将不再为您提供日期特定的选项,而仅显示文本字段的过滤选项:
由于我只想显示特定日期在实际日期之前或之后的特定节点,而该日期由自定义日期范围字段指定,因此这不适合我的需求。
如何通过具有日期特定操作的日期字段过滤Drupal 8中的视图?
在启用了“ 查看日期”模块的 Drupal 7中,按日期过滤视图非常简单:UI仅为您提供了这样做的选项。
但是,在Drupal 8中,日期字段和视图是核心的一部分,但是如果您选择日期范围字段作为视图中的过滤器,它将不再为您提供日期特定的选项,而仅显示文本字段的过滤选项:
由于我只想显示特定日期在实际日期之前或之后的特定节点,而该日期由自定义日期范围字段指定,因此这不适合我的需求。
如何通过具有日期特定操作的日期字段过滤Drupal 8中的视图?
Answers:
令人惊讶的是,Drupal 8尚无法做到这一点。但是尝试使它起作用已有很长的历史了:https : //www.drupal.org/node/2786577在本文中找到 的最后一个补丁似乎有效。您可以使用以下命令下载并应用它:
wget https://www.drupal.org/files/issues/improve_the_views-2786577-76-core.patch
git apply improve_the_views-2786577-76-core.patch
如果git
服务器上不可用,请尝试:
patch -p1 < improve_the_views-2786577-76-core.patch
要应用补丁,您必须先导航到该core
文件夹。并且请注意,在提交核心更新后,您必须重新应用此补丁。(太糟了!)所以让我们希望,Drupal众神很快就会将其纳入核心!
drush updatedb --entity-updates
我必须将包含拍卖日期的内容类型过滤为三组(现在在线,即将上市并准备注册)。由于涉及多个日期范围,因此我根据本文编写了一个插件:https ://www.webomelette.com/creating-custom-views-filter-drupal-8
基本上是做三件事:-将字段中的日期转换为本地日期和时间。-过滤器具有“现在在线”,“即将到来”和“其他”三个可能的设置-基于这些设置,它向查询添加了可能的子句
它可以工作,并且对于将来的更新似乎很可靠。
<?php
/**
* @file
* Definition of Drupal\d8views\Plugin\views\filter\NodeTitles.
*/
namespace Drupal\d8views\Plugin\views\filter;
use Drupal\views\Plugin\views\filter\FilterPluginBase;
use Drupal\views\Plugin\views\filter\InOperator;
use Drupal\views\Plugin\views\filter\ManyToOne;
use Drupal\views\ViewExecutable;
use Drupal\views\Views;
/**
* Filters by given list of node title options.
*
* @ingroup views_filter_handlers
*
* @ViewsFilter("d8views_node_titles")
*/
class NodeTitles extends FilterPluginBase {
// exposed filter options
protected $alwaysMultiple = TRUE;
/**
* Provide simple equality operator
*/
public function operatorOptions() {
return [
'nu_online' => $this->t('Nu online'),
'binnenkort' => $this->t('Binnenkort'),
'anders' => $this->t('Anders'),
];
}
public function query() {
//Get the current domain.
//$domain = domain_get_domain();
$nu_in_utc = new \DateTime('now', new \DateTimezone('UTC'));
$nu_in_utc_in_iso = $nu_in_utc->format('Y-m-d\TH:i:s');
$nu_date = $nu_in_utc->format('Y-m-d');
/*
* Voeg relatie met datum veiling toe
*/
$configuration = [
'table' => 'node__field_datum_veiling',
'left_table' => 'node_field_data',
'left_field' => 'nid',
'field' => 'entity_id',
'type' => 'LEFT',
'extra_operator' => 'AND',
];
$join = Views::pluginManager('join')->createInstance('standard', $configuration);
$this->query->addRelationship('node__field_datum_veiling', $join, 'node_field_data');
/*
* Voeg relatie met online datum van de veiling
*/
$configuration = [
'table' => 'node__field_datum_online',
'left_table' => 'node_field_data',
'left_field' => 'nid',
'field' => 'entity_id',
'type' => 'LEFT',
'extra_operator' => 'AND',
];
$join = Views::pluginManager('join')->createInstance('standard', $configuration);
$this->query->addRelationship('node__field_datum_online', $join, 'node_field_data');
switch($this->operator) {
case 'nu_online':
/*
* Condities voor 'Nu online'
*/
//dpm('Nu online');
$this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
$this->query->addWhere('AND', 'node__field_datum_online.field_datum_online_value', $nu_date, '<=');
break;
case 'binnenkort':
/*
* Condities voor 'Binnenkort'
*/
//dpm('Binnenkort');
$this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
$this->query->addWhere('AND', 'node__field_datum_online.field_datum_online_value', $nu_date, '>');
break;
case 'anders':
/*
* Condities voor 'Anders' (dwz online, binnenkort, maar nog niet geweest)
*/
$this->query->addWhere('AND', 'node__field_datum_veiling.field_datum_veiling_end_value', $nu_in_utc_in_iso, '>');
break;
}
}
}
使用间隔过滤器插件,您可以选择两个字段分别用作最小日期和最大日期,这引入了范围的概念。然后,您可以通过指定范围中必须包含或不包含的日期来过滤视图。
当前,Views不太了解日期范围。它可以按开始日期或结束日期作为单独的过滤器进行过滤,但不能对整个日期范围进行过滤。
为了启用基于日期范围的过滤,我创建了模块Views Date Range Filters。目前,它为日期时间范围字段提供了3个其他过滤器:
包括
按日期范围过滤,包括提供的日期。
重叠
按与提供的日期范围重叠的日期范围进行过滤。
结束于
按日期范围过滤,该日期范围以提供的日期结尾。等效于“结束日期<=提供日期”。使用“开始日期”时,对于分组过滤器很有用。