Comment filtrer une vue par plage de dates (début, fin)?


18

Dans Drupal 7 avec le module Vues une date activé, il était assez facile de filtrer une vue par date: l'interface utilisateur vous a simplement donné la possibilité de le faire.

Dans Drupal 8, cependant, le champ de date et les vues font partie du noyau, mais si vous choisissez un champ de plage de dates comme filtre dans les vues, il ne vous offre plus d'options spécifiques à la date, mais vous montre uniquement les options de filtrage pour les champs de texte:entrez la description de l'image ici

Cependant, les options spécifiques à la date sont disponibles pour les valeurs de date internes comme «Contenu: modifié» entrez la description de l'image ici

Comme je voudrais afficher uniquement des nœuds spécifiques, avec une date avant ou après la date réelle, où la date est spécifiée par un champ de plage de dates personnalisé, cela ne correspond pas à mes besoins.

Comment puis-je filtrer une vue dans Drupal 8 par un champ de date avec des opérations spécifiques à la date?


Les filtres de vues appropriés sont un problème en cours pour les plages de dates. Le correctif fonctionne, mais le chemin de mise à jour est incroyablement difficile.
mpdonadio

@mpdonadio Pourriez-vous m'aider avec un lien vers le patch, s'il vous plaît?
user5950

2
C'est drupal.org/node/2786577 , mais soyez averti que le chemin de mise à jour n'est pas entièrement testé. Utilisez ce patch à vos risques et périls.
mpdonadio

@ Pierre.Vriens ce n'est pas un doublon. Il s'agit d'un champ avec des dates de début et de fin et un filtrage sur celles-ci. Pas seulement un champ de valeur unique.
Neograph734

@ Neograph734 OK, ça permet de mieux comprendre les différences (vote rétracté). Mais OPer modifie mieux cette question pour l'inclure également dans la question réelle (pour éviter que d'autres ne la perçoivent comme un doublon) ... Bonne chance!
Pierre.Vriens

Réponses:


14

Étonnamment, ce n'est pas encore possible avec Drupal 8. Mais il y a une longue histoire d'essayer de le faire fonctionner: https://www.drupal.org/node/2786577 Le dernier patch , que vous trouverez dans cet article, semble fonctionner. Vous pouvez le télécharger et l'appliquer à l'aide des commandes suivantes:

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

Si gitn'est pas disponible sur votre serveur, essayez:

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

POUR appliquer les correctifs, vous devez d'abord accéder au coredossier. Et sachez que vous devez réappliquer ce correctif, après avoir validé une mise à jour principale. (Cela craint!) Alors espérons que les Dieux Drupal vont bientôt intégrer cela!


pouvez-vous me dire comment appliquer le patch, ça ne marche pas pour moi !! @ user5950
make-me-alive

patch -p1 <améliorez_les_vues_integration_for_daterange_fields-2786577-60.patch a fonctionné pour moi Merci @ user5950
make-me-alive

Assurez-vous d'appliquer les mises à jour de la base de données:drush updatedb --entity-updates
Filipe Miguel Fonseca

Si vous utilisez Composer pour appliquer des correctifs, ils s'appliqueront automatiquement lorsque vous mettrez à jour des modules. Cela dit, celui-ci sera inclus dans la version 8.6 - le patch a été validé il y a quelques jours!
mortona42

5
Juste à titre indicatif, cette fonctionnalité est maintenant au cœur à partir de 8.6.0
Matt Fletcher

0

J'ai dû filtrer un type de contenu contenant les dates des enchères en trois groupes (maintenant en ligne, à venir et prêts à s'inscrire). Comme cela impliquait plusieurs daterange, j'ai écrit un plugin basé sur cet article: https://www.webomelette.com/creating-custom-views-filter-drupal-8

Fondamentalement, cela fait trois choses: - Convertir les dates du champ en date et heure locales. - Le filtre a trois paramètres possibles «maintenant en ligne», «à venir» et «autre» - En fonction des paramètres, il ajoute les clauses where possibles à la requête

Il fonctionne et semble robuste aux futures mises à jour.

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

En utilisant le plug-in de filtre d'intervalle, vous pouvez choisir deux champs à utiliser respectivement comme date minimale et maximale, ce qui introduit le concept de plage. Vous pouvez ensuite filtrer les vues en spécifiant une date qui doit être contenue ou non dans la plage.

Jetez un œil à: https://github.com/barsan-ds/interval-filter pour des exemples


0

Actuellement, Views ne connaît pas très bien les plages de dates. Il peut filtrer la date de début ou de fin en tant que filtres séparés, mais pas la plage de dates dans son ensemble.

Pour activer le filtrage basé sur la plage de dates, j'ai créé le module Vues Filtres de plage de dates . Actuellement, il a 3 filtres supplémentaires pour les champs de plage de datetime:

Comprend

Filtre par plages de dates qui incluent la date fournie.

Chevauchements

Filtre par plages de dates qui chevauchent la plage de dates fournie.

Se termine par

Filtre par plages de dates se terminant par la date fournie. Équivalent à "Date de fin <= date fournie". Utile pour les filtres groupés lors de l'utilisation de "Date de début".


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.