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:
Cependant, les options spécifiques à la date sont disponibles pour les valeurs de date internes telles que "Contenu: modifié"
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?
É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!
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".
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
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;
}
}
}