Message d'avertissement

The subscription service is currently unavailable. Please try again later.

CCK date et CCK facets

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Juste histoire de partager : on a eu une grosse galère avec les dates et le module de recherche à facettes faceted_search (que je recommande).

Visiblement, la gestion des dates et heures locales est complexe et le sous-module cck_facets mettait le bazar dans la recherche à facettes. Concrètement, certains articles n'étaient pas correctement répertoriés, en particulier ceux du mois de janvier qui se retrouvaient dans l'année d'avant. Problème aussi avec l'année 1970.

Bref, les modifs suivantes de date_facets.module v 1.10 2009/05/01 semblent régler les problèmes, les lignes d'origine sont commentées:

vers la ligne 220 :

// <<<<< ajout: aller chercher la timezone
    $tz = variable_get('date_default_timezone', 0);
// >>>>>
// <<<<< modif : ajouter la timezone à $timestamp, sinon valeur zéro en 1970 et affichage vide à la place
    if (isset($this->_value['day'])) {
      // Format date with YYYY-MM-DD.
//    $timestamp =       gmmktime(0, 0, 0, (int)$this->_value['month'], (int)$this->_value['day'], (int)$this->_value['year']);
      $timestamp = $tz + gmmktime(0, 0, 0, (int)$this->_value['month'], (int)$this->_value['day'], (int)$this->_value['year']);
      $format = variable_get('date_facets_format_ymd', 'm/d/Y');
    }
    elseif (isset($this->_value['month'])) {
      // Format date with YYYY-MM.
//    $timestamp =       mmktime(0, 0, 0, (int)$this->_value['month'], 1, (int)$this->_value['year']);
      $timestamp = $tz + gmmktime(0, 0, 0, (int)$this->_value['month'], 1, (int)$this->_value['year']);
      $format = variable_get('date_facets_format_ym', 'm/Y');
    }
    elseif (isset($this->_value['year'])) {
      // Format date with YYYY.
//    $timestamp =       gmmktime(0, 0, 0, 1, 1, (int)$this->_value['year']);
      $timestamp = $tz + gmmktime(0, 0, 0, 1, 1, (int)$this->_value['year']);
      $format = variable_get('date_facets_format_y', 'Y');
    }
// >>>>>

vers la ligne 280 :

// <<<<< ajout : ne pas descendre au jour si la date en référence n'a pas de jour
    if (isset($this->_value['month'])) {
      if (!in_array('day', $this->_field['granularity'])) {
        return FALSE; // No subcategories.
      }
    }
// >>>>>
// <<<<< ajout: aller chercher la timezone
    $tz = variable_get('date_default_timezone', 0) / 3600; // secondes en heures
// >>>>>
// <<<<< modif : corriger avec la timezone pour éviter le décalage autour du 1er janvier (classé dans l'année précédente)
    $db_info = _cck_facets_db_info($this->_field);
    $main_column = array_shift($db_info['columns']);
    $query->add_table($db_info['table'], 'vid', 'n', 'vid');
    if (isset($this->_value['month'])) {
      $from = sprintf("'%04d-%02d-01 00:00:00'", $this->_value['year'], $this->_value['month']);
      $query->add_field(NULL, "YEAR(${db_info['table']}.${main_column['column']})", $this->_field['field_name'] .'_year');
      $query->add_field(NULL, "MONTH(${db_info['table']}.${main_column['column']})", $this->_field['field_name'] .'_month');
      $query->add_field(NULL, "DAY(${db_info['table']}.${main_column['column']})", $this->_field['field_name'] .'_day');
//    $query->add_where("(${db_info['table']}.${main_column['column']} >= $from)");
      $query->add_where("(${db_info['table']}.${main_column['column']} >= $from  - INTERVAL $tz HOUR)");
//    $query->add_where("(${db_info['table']}.${main_column['column']} < $from + INTERVAL 1 MONTH)");
      $query->add_where("(${db_info['table']}.${main_column['column']} < $from + INTERVAL 1 MONTH - INTERVAL $tz HOUR)");
      $query->add_groupby($this->_field['field_name'] .'_day');
      return TRUE;
    }
    elseif (isset($this->_value['year'])) {
      $from = sprintf("'%04d-01-01 00:00:00'", $this->_value['year']);
      $query->add_field(NULL, "YEAR(${db_info['table']}.${main_column['column']})", $this->_field['field_name'] .'_year');
      $query->add_field(NULL, "MONTH(${db_info['table']}.${main_column['column']})", $this->_field['field_name'] .'_month');
//    $query->add_where("(${db_info['table']}.${main_column['column']} >= $from)");
      $query->add_where("(${db_info['table']}.${main_column['column']} >= $from - INTERVAL $tz HOUR)");
//    $query->add_where("(${db_info['table']}.${main_column['column']} < $from + INTERVAL 1 YEAR)");
      $query->add_where("(${db_info['table']}.${main_column['column']} < $from + INTERVAL $tz YEAR - INTERVAL 1 HOUR)");
      $query->add_groupby($this->_field['field_name'] .'_month');
      return TRUE;
    }
// >>>>>

et pour finir vers la ligne 330 :

// <<<<< ajout: aller chercher la timezone
    $tz = variable_get('date_default_timezone', 0) / 3600; // secondes en heures
// >>>>>
// <<<<< modif : corriger avec la timezone
    $db_info = _cck_facets_db_info($this->_field);
    $main_column = array_shift($db_info['columns']);
    // Since the same table might be joined multiple times in the query, we use
    // the field's name as the table alias to create a unique table reference.
    $table = $query->add_table($db_info['table'], 'vid', 'n', 'vid', $this->_field['field_name']);
    if (isset($this->_value['day'])) {
      $from = sprintf("'%04d-%02d-%02d 00:00:00'", $this->_value['year'], $this->_value['month'], $this->_value['day']);
//    $query->add_where("($table.${main_column['column']} >= $from)");
      $query->add_where("($table.${main_column['column']} >= $from - INTERVAL $tz HOUR)");
//    $query->add_where("($table.${main_column['column']} < $from + INTERVAL 1 DAY)");
      $query->add_where("($table.${main_column['column']} < $from + INTERVAL 1 DAY - INTERVAL $tz HOUR)");
    }
    elseif (isset($this->_value['month'])) {
      $from = sprintf("'%04d-%02d-01 00:00:00'", $this->_value['year'], $this->_value['month']);
//    $query->add_where("($table.${main_column['column']} >= $from)");
      $query->add_where("($table.${main_column['column']} >= $from - INTERVAL $tz HOUR)");
//    $query->add_where("($table.${main_column['column']} < $from + INTERVAL 1 MONTH)");
      $query->add_where("($table.${main_column['column']} < $from + INTERVAL 1 MONTH - INTERVAL $tz HOUR)");
    }
    elseif (isset($this->_value['year'])) {
      $from = sprintf("'%04d-01-01 00:00:00'", $this->_value['year']);
//    $query->add_where("($table.${main_column['column']} >= $from)");
      $query->add_where("($table.${main_column['column']} >= $from - INTERVAL $tz HOUR)");
//    $query->add_where("($table.${main_column['column']} < $from + INTERVAL 1 YEAR)");
      $query->add_where("($table.${main_column['column']} < $from + INTERVAL 1 YEAR - INTERVAL $tz HOUR)");
    }
// >>>>>

En espérant que ça puisse servir à qqu'un.
Brn

Fichier attachéTaille
Icône texte brut date_facets.module21.54 Ko
Forum : 
Version de Drupal : 
Tags :