web-dev-qa-db-fra.com

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

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

Dans Drupal 8, cependant, le champ de date et les vues font partie du noyau, mais si vous choisissez une plage de dates champ en tant que filtre dans les vues, il ne vous propose plus d'options spécifiques à la date, mais vous montre uniquement les options de filtrage pour les champs de texte: enter image description here

Cependant, les options spécifiques à la date sont disponibles pour les valeurs de date internes telles que "Contenu: modifié" enter image description here

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?

19
user5950

Étonnamment, cela n'est pas possible avec Drupal 8 pour le moment. Mais il y a une longue histoire d'essayer de le faire fonctionner: https://www.drupal.org/node/2786577 Le dernier patch , que vous trouvez dans cet article, semble fonctionner. Vous pouvez le télécharger et l'appliquer, en utilisant les 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 git n'est pas disponible sur votre serveur, essayez:

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

POUR appliquer les correctifs, vous devez d'abord naviguer dans le dossier core. Et sachez que vous devez réappliquer ce correctif, après avoir validé une mise à jour principale. (Cela craint!) Alors espérons que les Drupal Dieux auront bientôt cela dans le noyau!

14
user5950

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 Affichage des filtres de plage de dates . Actuellement, il dispose de 3 filtres supplémentaires pour les champs de plage de dates:

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".

0
imclean

En utilisant le plugin de filtrage 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 contenue dans la plage.

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

0
barsan-md

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
Coert