Jak filtrować widok według zakresu dat (początek, koniec)?


18

W Drupal 7 z włączonym modułem Views an Date , filtrowanie widoku według daty było dość łatwe: interfejs użytkownika po prostu dał ci taką możliwość.

Jednak w Drupal 8 pole daty i widoki są częścią rdzenia, ale jeśli wybierzesz pole zakresu dat jako filtr w widokach, nie będziesz już mieć opcji specyficznych dla daty, ale pokaże tylko opcje filtrowania dla pól tekstowych:wprowadź opis zdjęcia tutaj

Opcje specyficzne dla daty są jednak dostępne dla wewnętrznych wartości dat, takich jak „Treść: Zmieniona” wprowadź opis zdjęcia tutaj

Ponieważ chciałbym wyświetlać tylko określone węzły, z datą przed lub po rzeczywistej dacie, gdzie data jest określona w niestandardowym polu zakresu dat, nie odpowiada to moim potrzebom.

Jak mogę filtrować widok w Drupal 8 według pola daty z operacjami specyficznymi dla daty?


Odpowiednie filtry widoków stanowią problem w procesie dla zakresów dat. Łatka działa, ale ścieżka aktualizacji jest niesamowicie trudna.
mpdonadio

@mpdonadio Czy mógłbyś mi pomóc z linkiem do łatki?
user5950

2
Jest to drupal.org/node/2786577 , ale ostrzegamy, że ścieżka aktualizacji nie jest w pełni przetestowana. Użyj tej łatki na własne ryzyko.
mpdonadio

@ Pierre.Vriens to nie jest duplikat. Chodzi o pole z datą początkową i końcową oraz ich filtrowanie. Nie tylko jedno pole wartości.
Neograph734

@ Neograph734 OK, to pomaga lepiej zrozumieć różnice (wycofano głosowanie). Ale OPer lepiej edytuje to pytanie, aby uwzględnić je również w rzeczywistym pytaniu (aby inni nie postrzegali go jako duplikat) ... Powodzenia!
Pierre.Vriens

Odpowiedzi:


14

Zaskakująco nie jest to jeszcze możliwe w przypadku Drupala 8. Ale istnieje długa historia prób jej uruchomienia: https://www.drupal.org/node/2786577 Wydaje się , że ostatnia łatka , którą znajdziesz w tym poście, działa. Możesz go pobrać i zastosować, używając następujących poleceń:

wget https://www.drupal.org/files/issues/improve_the_views-2786577-76-core.patch
git apply improve_the_views-2786577-76-core.patch

Jeśli gitnie jest dostępny na twoim serwerze, spróbuj:

patch -p1 < improve_the_views-2786577-76-core.patch

Aby zastosować łaty, musisz najpierw przejść do corefolderu. I pamiętaj, że musisz ponownie zainstalować tę poprawkę po dokonaniu podstawowej aktualizacji. (To do bani!) Miejmy więc nadzieję, że bogowie Drupal wkrótce wprowadzą to do rdzenia!


czy możesz mi powiedzieć, jak zastosować łatkę, to nie działa dla mnie !! @ user5950
make-me-alive

łatka -p1 <Improv_the_views_integration_for_daterange_fields-2786577-60.patch zadziałała dla mnie Dzięki @ user5950
make-me-alive

Upewnij się, że zastosujesz aktualizacje bazy danych:drush updatedb --entity-updates
Filipe Miguel Fonseca

Jeśli używasz kompozytora do stosowania poprawek, będą one automatycznie stosowane podczas aktualizacji modułów. To powiedziawszy, ten zostanie uwzględniony w wersji 8.6 - łatka została wprowadzona kilka dni temu!
mortona42

5
Podobnie jak w heads-upie, ta funkcjonalność jest teraz podstawowa, począwszy od wersji 8.6.0
Matt Fletcher

0

Musiałem przefiltrować typ zawartości zawierający daty aukcji na trzy grupy (teraz online, nadchodzące i gotowe do rejestracji). Ponieważ dotyczyło to wielu zmian, napisałem wtyczkę na podstawie tego artykułu: https://www.webomelette.com/creating-custom-views-filter-drupal-8

Zasadniczo robi trzy rzeczy: - Konwertuj daty w polu na lokalną datę i godzinę. - Filtr ma trzy możliwe ustawienia „teraz online”, „nadchodzące” i „inne” - Na podstawie ustawień dodaje do zapytania możliwe klauzule where

Działa i wydaje się być odporny na przyszłe aktualizacje.

    <?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

Za pomocą wtyczki filtra interwałowego możesz wybrać dwa pola, które będą używane odpowiednio jako data minimalna i maksymalna, wprowadza to pojęcie zakresu. Następnie możesz filtrować widoki, określając datę, która musi być zawarta lub nie zawierać się w zakresie.

Przykłady : https://github.com/barsan-ds/interval-filter


0

Obecnie Widoki nie są bardzo świadome zakresów dat. Może filtrować według daty rozpoczęcia lub zakończenia jako osobne filtry, ale nie jako zakres dat jako całość.

Aby włączyć filtrowanie na podstawie zakresu dat, utworzyłem moduł Widoki Filtry zakresu dat . Obecnie ma 3 dodatkowe filtry dla pól Zakres Datetime:

Obejmuje

Filtruje według zakresów dat, które obejmują dostarczoną datę.

Pokrywają się

Filtruje według zakresów dat, które pokrywają się z podanym zakresem dat.

Kończy się przez

Filtruje według zakresów dat, które kończą się podaną datą. Odpowiednik „Data końcowa <= dostarczona data”. Przydatne w przypadku zgrupowanych filtrów podczas korzystania z „Data rozpoczęcia”.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.