Wie filtere ich eine Ansicht nach Datumsbereich (Anfang, Ende)?


18

In Drupal 7 mit Ansichten ein Datum Modul aktiviert ist , war es ziemlich einfach , eine Ansicht von Datum zu filtern: Die Benutzeroberfläche hat man nur die Möglichkeit , dies zu tun.

In Drupal 8 sind jedoch das Datumsfeld und Ansichten Teil des Kerns, aber wenn Sie ein Datum auswählen Bereich Feld als Filter in Aussicht ist es nicht bietet Ihnen bestimmten Termin Optionen mehr, sondern zeigt nur Optionen für Textfelder Filterung:Bildbeschreibung hier eingeben

Die datumsspezifischen Optionen stehen jedoch für interne Datumswerte wie ´Inhalt: Geändert´ zur Verfügung Bildbeschreibung hier eingeben

Da ich nur bestimmte Knoten mit einem Datum vor oder nach dem tatsächlichen Datum anzeigen möchte, bei denen das Datum in einem benutzerdefinierten Datumsbereichsfeld angegeben ist, entspricht dies nicht meinen Anforderungen.

Wie kann ich eine Ansicht in Drupal 8 nach einem Datumsfeld mit datumsspezifischen Operationen filtern?


Richtige Ansichtsfilter sind ein aktuelles Problem für Datumsbereiche. Der Patch funktioniert, aber der Update-Pfad ist wahnsinnig schwierig.
mpdonadio

@mpdonadio Könntest du mir bitte mit einem Link zum Patch helfen?
user5950

2
Es ist drupal.org/node/2786577 , aber seien Sie gewarnt, der Update-Pfad ist nicht vollständig getestet. Verwenden Sie diesen Patch auf eigenes Risiko.
mpdonadio

@ Pierre.Vriens es ist kein Duplikat. Hierbei handelt es sich um ein Feld mit Start- und Enddaten und Filtern nach diesen. Nicht nur ein einziges Wertefeld.
Neograph734

@ Neograph734 OK, das hilft, die Unterschiede besser zu verstehen (Abstimmung zurückgenommen). Aber OPer bearbeitet diese Frage besser, um sie auch in die eigentliche Frage aufzunehmen (um zu vermeiden, dass andere sie als Duplikat wahrnehmen) ... Viel Glück!
Pierre.Vriens

Antworten:


14

Überraschenderweise ist dies mit Drupal 8 noch nicht möglich. Aber es gibt eine lange Geschichte, in der versucht wurde, es zum Laufen zu bringen: https://www.drupal.org/node/2786577 Der letzte Patch , den Sie in diesem Beitrag finden, scheint zu funktionieren. Sie können es mit den folgenden Befehlen herunterladen und anwenden:

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

Wenn gitauf Ihrem Server nicht verfügbar, versuchen Sie Folgendes:

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

Um die Patches anzuwenden, müssen Sie corezuerst zu dem Ordner navigieren . Beachten Sie, dass Sie diesen Patch erneut anwenden müssen, nachdem Sie ein Core-Update durchgeführt haben. (Das ist zum Kotzen!) Hoffen wir also, dass die Drupal-Götter dies bald in den Kern bekommen werden!


Kannst du mir bitte sagen, wie ich den Patch anwenden soll? @ user5950
mach mich lebendig

patch -p1 <verbessere_die_sichten_integration_für_daterange_felder-2786577-60.patch hat bei mir funktioniert Danke @ user5950
mach-mich-lebendig

Stellen Sie sicher, dass Sie die Datenbankaktualisierungen anwenden:drush updatedb --entity-updates
Filipe Miguel Fonseca

Wenn Sie Composer zum Anwenden von Patches verwenden, werden diese automatisch angewendet, wenn Sie Module aktualisieren. Das heißt, dieser wird in 8.6 enthalten sein - der Patch wurde vor ein paar Tagen geschrieben!
Mortona42

5
Nur als Heads-up ist diese Funktionalität jetzt im Kern, beginnend mit 8.6.0
Matt Fletcher,

0

Ich musste einen Inhaltstyp mit den Auktionsterminen in drei Gruppen einteilen (jetzt online, in Kürze verfügbar und zur Registrierung bereit). Da es sich um mehrere Themen handelte, habe ich ein Plugin geschrieben, das auf diesem Artikel basiert: https://www.webomelette.com/creating-custom-views-filter-drupal-8

Grundsätzlich gilt Folgendes: - Konvertieren Sie die Daten im Feld in lokales Datum und Uhrzeit. - Der Filter verfügt über drei mögliche Einstellungen: "Jetzt online", "Bevorstehend" und "Andere". - Basierend auf den Einstellungen werden der Abfrage die möglichen Where-Klauseln hinzugefügt

Es funktioniert und scheint robust für zukünftige Updates.

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

Mit dem Intervallfilter-Plugin können Sie zwei Felder auswählen, die jeweils als Mindest- und Höchstdatum verwendet werden. Dies führt in das Konzept des Bereichs ein. Anschließend können Sie die Ansichten filtern, indem Sie ein Datum angeben, das im Bereich enthalten sein muss oder nicht.

Schauen Sie sich auf: https://github.com/barsan-ds/interval-filter für Beispiele


0

Derzeit sind Views die Datumsbereiche nicht sehr bewusst. Es kann nach Start- oder Enddatum als separate Filter gefiltert werden, jedoch nicht nach dem gesamten Datumsbereich.

Um die Filterung basierend auf dem Datumsbereich zu aktivieren, habe ich das Modul Ansichten Datumsbereichsfilter erstellt . Derzeit stehen 3 zusätzliche Filter für Datetime Range-Felder zur Verfügung:

Beinhaltet

Filtert nach Datumsbereichen, die das angegebene Datum enthalten.

Überlappungen

Filtert nach Datumsbereichen, die sich mit dem angegebenen Datumsbereich überschneiden.

Endet bei

Filtert nach Datumsbereichen, die nach dem angegebenen Datum enden. Entspricht "Enddatum <= Lieferdatum". Nützlich für gruppierte Filter bei Verwendung von "Startdatum".


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.