Bonjour,
J’utilise sur le site de sauvetage et adoption d’animaux abandonnés de notre association (https://saraa.fr/) le filtre durée publié sur CONTRIB (Filtre durée - SPIP-Contrib).
Pour nos besoins, j’ai quelques peu modifié le code afin d’avoir un formatage de durées personnalisé :
- inclusion du calcul des durées en mois (approximatif puisque basé sur des mois de 30 jours) et retour du résultat en fonction de l’âge,
- inclusion d’un retour spécifique en cas de date vide.
Pour ne pas rendre inopérents les formatages déjà prévus, j’ai doublé l’intitulé des variables (francisé les noms) et utilisées celles-ci dans ces formatages personnalisés (CASE « saraa » et « delai »).
(Il n’y a pour l’instant qu’un seul formatage doublé avec 2 noms différents pour l’appel dans mes squelettes en fonction de son usage.)
MON PROBLÈME
Cette fonction modifiée restitue ce que j’en attends sur mon site en local MAIS PAS sur mon site publié. Elle renvoie systématiquement une durée de 23 ans pour chaque champs non renseigné. (Tiens, ça nous donne l’année 2000…)
Est-ce quelqu’un saurait ce qui peut en être la cause ?
(Vous ne le verrez pas sur notre site ayant contourné le problème par une boucle qui sélectionne d’abord les dates vides.)
Mon code modifié
(il n’est peut-être pas très esthétique et approximatif… Si une bonne âme se sent de me le perfectionner !
<?php
/*
/* +----------------------------------+
* Nom du Filtre : duree
* +----------------------------------+
* date : 2008.01.10
* auteur : erational - http://www.erational.org
* version: 0.25
* licence: GPL
* +-------------------------------------+
*
* retourne la duree entre 2 dates
*
* parametres type_affichage
* - court : 5 jours (par defaut)
* - etendu : 4 semaines 3 jours 23 heures 2 minutes
* - horaire : 4h39
* - minute : 124 (minutes cumulees)
* - iso8601 : P18Y9W4DT11H9M8S ref. http://fr.wikipedia.org/wiki/ISO_8601#Dur.C3.A9e
* - ical : P18Y9W4DT11H9M8S ref. http://tools.ietf.org/html/rfc2445#page-37 (mm chose que iso)
*
* pour sortir une valeur uniquement (i18n)
* - Y : (an)
* - W : (semaine)
* - D : (jour)
* - H : (heure)
* - M : (minute)
* - S : (s)
*
*/
function duree($date_debut,$date_fin,$type_affichage='court') {
$d_debut = mktime(
substr($date_debut,11,2),
substr($date_debut,14,2),
substr($date_debut,17,2),
substr($date_debut,5,2),
substr($date_debut,8,2),
substr($date_debut,0,4));
$d_fin = mktime(
substr($date_fin,11,2),
substr($date_fin,14,2),
substr($date_fin,17,2),
substr($date_fin,5,2),
substr($date_fin,8,2),
substr($date_fin,0,4));
$diff_secondes = $d_fin - $d_debut; // noms francisés pour usage spécifique case "saraa". Permet de garder la fonctionnalité des autres "case" sans l'utilisation de "mois" non prévu
if ($diff_secondes<0) return "";
$diff_annees = floor($diff_secondes/31536000);
$diff_secondes -= $diff_annees * 31536000;
$diff_mois = floor($diff_secondes/2629800);
$diff_secondes -= $diff_mois * 2629800;
$diff_semaines = floor($diff_secondes/604800);
$diff_secondes -= $diff_semaines * 604800;
$diff_jours = floor($diff_secondes/86400);
$diff_secondes -= $diff_jours * 86400;
$diff_heures = floor($diff_secondes/3600);
$diff_secondes -= $diff_heures * 3600;
$diff_mins = floor($diff_secondes/60);
$diff_secondes -= $diff_mins * 60;
$str = "";
$diff_seconds = $d_fin - $d_debut;
if ($diff_seconds<0) return "";
$diff_years = floor($diff_seconds/31536000);
$diff_seconds -= $diff_years * 31536000;
$diff_weeks = floor($diff_seconds/604800);
$diff_seconds -= $diff_weeks * 604800;
$diff_days = floor($diff_seconds/86400);
$diff_seconds -= $diff_days * 86400;
$diff_hours = floor($diff_seconds/3600);
$diff_seconds -= $diff_hours * 3600;
$diff_minutes = floor($diff_seconds/60);
$diff_seconds -= $diff_minutes * 60;
$str = "";
switch ($type_affichage) {
case "court" : if ($diff_years>1) $str = "$diff_years ans";
else if ($diff_years>0) $str = "$diff_years an";
else if ($diff_weeks>1) $str = "$diff_weeks semaines";
else if ($diff_weeks>0) $str = "$diff_weeks semaine";
else if ($diff_days>1) $str = "$diff_days jours";
else if ($diff_days>0) $str = "$diff_days jour";
else if ($diff_hours>1) $str = "$diff_hours heures";
else if ($diff_hours>0) $str = "$diff_hours heure";
else if ($diff_minutes>1) $str = "$diff_minutes minutes";
else if ($diff_minutes>0) $str = "$diff_hours minute";
break;
// identique saraa : celui à modifier au besoin pour le calcul de duree entre 2 dates hors "aujourd'hui". Evite le renommage dans les squelettes
case "delai" : if ($diff_annees>=3) $str .= "$diff_annees ans";
else if ($diff_annees>=1) { // 1 ou 2 ans
if ($diff_annees==1) $str .= "$diff_annees an";
else $str .= "$diff_annees ans ";
if ($diff_mois!= 0) $str .= " et $diff_mois mois";
}
else if ($diff_mois>=5) // 0 ans
$str .= "$diff_mois mois";
else if ($diff_mois>=2) { // entre 2 et 5 mois
if ($diff_semaines == 0) $str .= "$diff_mois mois";
else if ($diff_semaines == 1) $str .= "$diff_mois mois et $diff_semaines semaine";
else $str.="$diff_mois mois et $diff_semaines semaines";
}
else // moins de 2 mois on met le nombre de semaines et de jours
if ($diff_semaines >= 2) {
if ($diff_jours == 0) $str .= "$diff_semaines semaines";
else if ($diff_jours == 1) $str .= "$diff_semaines semaines et $diff_jours jour";
else $str .= "$diff_semaines semaines et $diff_jours jours";
}
else if ($diff_semaines == 1) {
if ($diff_jours == 0) $str .= "$diff_semaines semaine";
else if ($diff_jours == 1) $str .= "$diff_semaines semaine et $diff_jours jour";
else $str .= "$diff_semaines semaine et $diff_jours jours";
}
else
$str ="$diff_jours jours";
break;
case "etendu" : if ($diff_years>1) $str .= "$diff_years ans ";
else if ($diff_years>0) $str .= "$diff_years an ";
if ($diff_weeks>1) $str .= "$diff_weeks semaines ";
else if ($diff_weeks>0) $str .= "$diff_weeks semaine ";
if ($diff_days>1) $str .= "$diff_days jours ";
else if ($diff_days>0) $str .= "$diff_days jour ";
if ($diff_hours>1) $str .= "$diff_hours heures ";
else if ($diff_hours>0) $str .= "$diff_hours heure ";
if ($diff_minutes>1) $str .= "$diff_minutes minutes ";
else if ($diff_minutes>0) $str .= "$diff_hours minute ";
if ($diff_seconds>1) $str .= "$diff_seconds secondes";
else if ($diff_seconds>0) $str .= "$diff_seconds secondes";
break;
case "saraa" : if ($diff_annees>=3) $str .= "$diff_annees ans";
else if ($diff_annees>=1) { // 1 ou 2 ans
if ($diff_annees==1) $str .= "$diff_annees an";
else $str .= "$diff_annees ans ";
if ($diff_mois!= 0) $str .= " et $diff_mois mois";
}
else if ($diff_mois>=5) // 0 ans
$str .= "$diff_mois mois";
else if ($diff_mois>=2) { // entre 2 et 5 mois
if ($diff_semaines == 0) $str .= "$diff_mois mois";
else if ($diff_semaines == 1) $str .= "$diff_mois mois et $diff_semaines semaine";
else $str.="$diff_mois mois et $diff_semaines semaines";
}
else // moins de 2 mois on met le nombre de semaines et de jours
if ($diff_semaines >= 2) {
if ($diff_jours == 0) $str .= "$diff_semaines semaines";
else if ($diff_jours == 1) $str .= "$diff_semaines semaines et $diff_jours jour";
else $str .= "$diff_semaines semaines et $diff_jours jours";
}
else if ($diff_semaines == 1) {
if ($diff_jours == 0) $str .= "$diff_semaines semaine";
else if ($diff_jours == 1) $str .= "$diff_semaines semaine et $diff_jours jour";
else $str .= "$diff_semaines semaine et $diff_jours jours";
}
else
$str ="$diff_jours jours";
break;
case "horaire": $str = ($diff_hours+($diff_days*24)+($diff_weeks*24*7)+($diff_year*24*7*365))."h";
if ($diff_minutes<10) $str .= "0";
$str .= $diff_minutes;
break;
case "minute": $str = $diff_minutes+($diff_hours*60)+($diff_days*60*24)+($diff_weeks*60*24*52)+($diff_year*60*24*365);
break;
case "iso8601": $str = "P${diff_years}Y${diff_weeks}W${diff_days}DT${diff_hours}H${diff_minutes}M${diff_seconds}S";
break;
case "ical": $str = "P${diff_years}Y${diff_weeks}W${diff_days}DT${diff_hours}H${diff_minutes}M${diff_seconds}S"; // mm chose que iso
break;
case "Y": $str = $diff_years;
break;
case "W": $str = $diff_weeks;
break;
case "D": $str = $diff_days;
break;
case "H": $str = $diff_hours;
break;
case "M": $str = $diff_minutes;
break;
case "Y": $str = $diff_years;
break;
case "S": $str = $diff_secondes;
break;
default: break;
}
if ($date_debut <= 0) $str = "Âge pas encore estimé.";
return $str;
}
?>