如何按日期范围(开始,结束)筛选视图?


18

在启用了“ 查看日期”模块的 Drupal 7中,按日期过滤视图非常简单:UI仅为您提供了这样做的选项。

但是,在Drupal 8中,日期字段和视图是核心的一部分,但是如果您选择日期范围字段作为视图中的过滤器,它将不再为您提供日期特定的选项,而仅显示文本字段的过滤选项:在此处输入图片说明

但是,日期特定选项可用于内部日期值,例如“内容:已更改” 在此处输入图片说明

由于我只想显示特定日期在实际日期之前或之后的特定节点,而该日期由自定义日期范围字段指定,因此这不适合我的需求。

如何通过具有日期特定操作的日期字段过滤Drupal 8中的视图?


正确的视图过滤器是日期范围的处理中问题。该补丁程序可以运行,但是更新路径异常困难。
mpdonadio

@mpdonadio您能帮我提供补丁的链接吗?
user5950

2
它是drupal.org/node/2786577,但请注意,更新路径尚未完全测试。使用此修补程序需要您自担风险。
mpdonadio

@ Pierre.Vriens不是重复的。这是关于一个具有开始日期和结束日期并对其进行过滤的字段。不只是单个值字段。
Neograph734 '17

@ Neograph734好的,这有助于更好地理解差异(收回投票)。但是OPer最好将这个问题编辑为也包含在实际问题中(以避免其他人将其视为重复的问题)...祝您好运!
Pierre.Vriens

Answers:


14

令人惊讶的是,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众神很快就会将其纳入核心!


你能告诉我如何应用补丁对我不起作用吗!@ user5950
让我

补丁-p1 <Improvement_the_views_integration_for_daterange_fields-2786577-60.patch为我工作感谢@ user5950
make-me-alive

确保您应用数据库更新:drush updatedb --entity-updates
Filipe Miguel Fonseca

如果您使用composer来应用补丁,则它们将在您更新模块时自动应用。也就是说,该版本将包含在8.6中-该补丁是几天前提交的!
mortona42 '18

5
与单挑一样,此功能从8.6.0开始处于核心地位
Matt Fletcher

0

我必须将包含拍卖日期的内容类型过滤为三组(现在在线,即将上市并准备注册)。由于涉及多个日期范围,因此我根据本文编写了一个插件: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;
            }
        }
    }

0

使用间隔过滤器插件,您可以选择两个字段分别用作最小日期和最大日期,这引入了范围的概念。然后,您可以通过指定范围中必须包含或不包含的日期来过滤视图。

看看:https//github.com/barsan-ds/interval-filter的例子


0

当前,Views不太了解日期范围。它可以按开始日期或结束日期作为单独的过滤器进行过滤,但不能对整个日期范围进行过滤。

为了启用基于日期范围的过滤,我创建了模块Views Date Range Filters。目前,它为日期时间范围字段提供了3个其他过滤器:

包括

按日期范围过滤,包括提供的日期。

重叠

按与提供的日期范围重叠的日期范围进行过滤。

结束于

按日期范围过滤,该日期范围以提供的日期结尾。等效于“结束日期<=提供日期”。使用“开始日期”时,对于分组过滤器很有用。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.