Как отфильтровать просмотр по диапазону дат (начало, конец)?


18

В Drupal 7 с включенным модулем Views и Date было довольно просто отфильтровать представление по дате: пользовательский интерфейс только что дал вам возможность сделать это.

В Drupal 8, однако, поле даты и представления являются частью ядра, но если вы выберете поле диапазона дат в качестве фильтра в представлениях, оно больше не будет предлагать вам параметры, специфичные для даты, но показывает только параметры фильтрации для текстовых полей:введите описание изображения здесь

Однако параметры для конкретной даты доступны для внутренних значений даты, таких как «Содержание: изменено». введите описание изображения здесь

Поскольку я хотел бы показывать только определенные узлы с датой до или после фактической даты, где дата указана в настраиваемом поле диапазона дат, это не соответствует моим потребностям.

Как я могу отфильтровать представление в Drupal 8 по полю даты с конкретными операциями по дате?


Правильные фильтры представлений находятся в процессе выпуска для диапазонов дат. Патч работает, но путь обновления безумно сложен.
mpdonadio

@mpdonadio Не могли бы вы помочь мне со ссылкой на патч, пожалуйста?
user5950

2
Это drupal.org/node/2786577 , но имейте в виду , что путь обновления не полностью протестирован. Используйте этот патч на свой страх и риск.
mpdonadio

@ Pierre.Vriens это не дубликат. Это поле с датами начала и окончания и фильтрацией по ним. Не только одно поле значения.
Neograph734

@ Neograph734 Хорошо, это помогает лучше понять различия (голосование отменено). Но OPer лучше редактирует этот вопрос, чтобы включить его и в реальный вопрос (чтобы другие не восприняли его как дубликат) ... Удачи!
Pierre.Vriens

Ответы:


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 <Improve_the_views_integration_for_daterange_fields-2786577-60.patch работал для меня Спасибо @ user5950
сделай меня живым

Убедитесь, что вы применили обновления базы данных:drush updatedb --entity-updates
Филипе Мигель Фонсека

Если вы используете composer для применения исправлений, они будут автоматически применяться при обновлении модулей. Тем не менее, этот будет включен в 8.6 - патч был совершен несколько дней назад!
mortona42

5
Эта функциональность теперь является основной, начиная с 8.6.0
Мэтт Флетчер,

0

Мне пришлось отфильтровать тип контента, содержащий даты аукционов, на три группы (сейчас онлайн, готовятся к регистрации и готовы зарегистрироваться). Поскольку это включало несколько диапазонов дат, я написал плагин на основе этой статьи: https://www.webomelette.com/creating-custom-views-filter-drupal-8

В основном это делает три вещи: - Преобразование даты в поле в местную дату и время. - Фильтр имеет три возможных параметра «сейчас в сети», «предстоящий» и «прочее». - В зависимости от настроек он добавляет возможные предложения where в запрос

Это работает и кажется надежным для будущих обновлений.

    <?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 Range Range Filters . В настоящее время он имеет 3 дополнительных фильтра для полей Datetime Range:

Включает

Фильтры по диапазонам дат, которые включают предоставленную дату.

Перекрытия

Фильтры по диапазонам дат, которые перекрываются с указанным диапазоном дат.

Заканчивается

Фильтры по диапазонам дат, которые заканчиваются указанными датами. Эквивалент «Дата окончания <= дата поставки». Полезно для сгруппированных фильтров при использовании «Дата начала».


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.