Filtre durée : attitude différente sur 2 sites

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 ! :slight_smile:

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

Bonjour,
c’est plus simple de reconstruire ta fonction avec les exemples donnés :
https://www.php.net/manual/fr/class.dateinterval.php

Ensuite SPIP affiche la balise #DATE ou #GET{ma_date_reconstruite_format_sql} au format mysql, teste dans la boucle article, sinon ce sera la #DATE de l’environnement.
Puis ajouter le/les filtres qui te conviennent pour afficher l’heure/minute etc

pas trop le temps de t’écrire le code, sorry

Cadeau :slight_smile:

// Définir le fuseau horaire par défaut à utiliser.
# date_default_timezone_set('UTC');
/**
 * 
 * Calculer les durées écoulées entre deux dates au format Y-m-d H:i:s
 * @param date $date_debut
 * @param date|string $date_fin
 * Sans le parametre $date_fin == today
 *
 * @param string $type_affichage
 * par defaut court, sinon affichage des durées année/mois/jours/heures …
 *
 * @example dans un squelette
 	#SET{date_debut_brut_sql,2006-05-03 18:30:00}
 	#SET{date_fin_brut_sql,2022-06-23 17:29:56}

 	<h3>Durées écoulées</h3>
 	Entre son arrivée le [(#GET{date_debut_brut_sql})] et aujourd'hui<br>
 	<span style="color:red">[(#GET{date_debut_brut_sql}|duree)]</span><br>
 	Ou bien avec la date de fin [(#GET{date_fin_brut_sql})] <br>
 	<span style="color:green">[(#GET{date_debut_brut_sql}|duree{#GET{date_fin_brut_sql}})]</span>
 *
 * @return string
 * par defaut le nombre de jours
 * sinon année/mois/jours/heures
 *
**/
function duree($date_debut,$date_fin = '',$type_affichage = 'court') {
	
	if(!$date_fin) {
		$date_fin = date("Y-m-d H:i:s"); 
	}
	
	$origin = new DateTimeImmutable($date_debut);
	$target = new DateTimeImmutable($date_fin);
	$interval = $origin->diff($target);
	
	if($type_affichage == 'court' ) {
		$duree_affichage = $interval->format('%R%a jours'); //nb_jours
	} else {
		$duree_affichage = $interval->format("%Y". ' ans '. "%m".' mois '."%H".'h'."%I" .'min'.":%S (Total de jours: %a)");
	}
	
	return $duree_affichage;

}

Merci Touti.
Désolé pour mon temps de réponse.
Ce n’est pas parfait mais j’ai trouvé un code.
Malheureusement il m’impose de coder mes squelettes avec une réponse « si le champs n’est pas null »…
Mais ça marche, tant pis.
Le code :

<?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>=1) {		// entre 1 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 1 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>=1) {		// entre 1 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 1 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 estimé.";
	return $str;
}
?>

Erational n’est à l’origine que de ma base de modification.
Je suis le seul à blâmer pour l’usage que j’ai fait de son code.

Si quelqu’un peu inclure à ce code :
Si la date de départ est « 000 », afficher CECI.
Merci.

Bonjour @toto1074
tu as essayé la fonction que je t’ai proposé avec les exemples inclus ?
c’est quand même plus court et adaptable que le galimatias que tu utilises :slight_smile:
et il me semble que c’est facilement compréhensible vu que c’est une fonction PHP

Bonjour touti, kwanti,

Désolé (encore !) pour mon délai de réponse. :slight_smile:
Merci pour ta participation.
Oui, j’ai jeté un oeil à cette fonction et aux exemples mais ne connaissant pas le php (rien d’insurmontable), je n’ai pas le temps de m’y consacrer pour le moment : réécriture de mes squelettes.
De plus, il me faudrait décliner le retour de ta fonction pour répondre aux différents cas de figure : en fonction de l’âge de l’animal, j’attends un formatage de date différent.
La fonction d’erational.org (modifiée) remplit ce rôle :

Moins d’une semaine :

  • 5 jours

Moins de 1 mois :

  • 1 semaine et 5 jours
  • 4 semaines et 1 jour

Moins de 5 mois :

  • 1 mois et 2 semaines
  • 2 mois
  • 4 mois et 1 semaine

Moins de 1 an :

  • 5 mois

Moins de 3 ans :

  • 1 an
  • 1 an et 2 mois
  • 2 ans et 1 mois

3 ans et plus :

  • 3 ans
  • 9 ans

Ainsi, avec mes champs (champs-extras) :

  • #DATE_NAISSANCE
  • #DATE_ACCUEIL
  • #SITUATION_DATE

J’obtiens le retour sur ces modèles précédents avec les codes suivants :

Durée de l’accueil :
[(#DATE_ACCUEIL|duree{#SITUATION_DATE,delai})]

Âge à l’adoption :
[(#DATE_NAISSANCE|duree{#SITUATION_DATE,delai})]

Et pas des moindres, l’âge actuel, avec le filtre |intval, qui permet d’afficher un texte alternatif à 0000 si la date n’est pas renseignée (sans boucle supplémentaire ! Mais je ne sais pas si ça réglera mon problème à l’origine de ce post… Je vous le dirai lorsque mes squelettes seront en ligne.)

Âge :
[(#DATE_NAISSANCE|intval|oui|?{[(#DATE_NAISSANCE|duree{#ENV{date},saraa})], Âge pas encore estimé.})]

Tout cela avec le case "delai" (ou "saraa", identique) ajouté à fonction filtre_duree :

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>=1) {		// entre 1 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 1 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;

Désolée, je ne comprends pas ce que tu veux faire ni quelle aide t’apporter !
Pour t"aider, il faudrait que tu sois plus explicite, essaye de penser ton code avec juste des phrases en français qui racontent de quelles données tu pars et ce à quoi tu veux aboutir.

Quelques pistes pour les néophytes SPIP/PHP
SPIP peut utiliser des filtres sur ses #BALISE, qui sont des fonctions PHP natives ou pas, ce qui laisse un grand choix.
Dans une fonction en php, quand il y a des paramètres comme dans function ma_fonction(param1,param2,param3){ return 'toto'; } appliquée sur une #BALISE SPIP c’est toujours #BALISE le paramètre 1, il faut donc penser que ce sera écrit dans ton squelette [(#PATATE|ma_fonction{param2,param3})]

Et tu peux chainer des filtres [(#DATE_ARRIVEE|ma_fonction{param2,param3}|une_autrefonction)]
et ainsi utiliser par exemple tous les filtres de date comme ici

Les filtres |annee, |mois, |jour, |heures, |minutes, |secondes, mais aussi |affdate, |date_relative, |nom_mois, |nom_jour, |saison

et encore plus de possibilités pour les dates si tu regardes les filtres de dates disponibles dans le plugin Agenda.

Pour en revenir à PHP, si un paramètres vaut 0, tu peux poser une condition et sortir facilement de ta fonction par un return


function ma_fonction($param1,$param2,$param3){ 
if($param2 == 0){ 
//on sort
 return "le paramètre N°2 n'existe pas";
}
return 'toto';
}

J’espère que cela t’aidera :slight_smile:

Bonjour touti,

Merci pour ton intérêt et ton temps.

Pour rappel, le problème que je rencontrais à l’origine de mon message était que la fonction que j’utilise avait 2 retours différents :

  • sur mon site local de développement : le retour était conforme à mes attentes.
  • sur mon site en ligne, une date vide renvoyait systématiquement un calcul : 23 ans (comme si la date déclarée était l’année 2000 ?).

J’ai contourné le problème avec une boucle vide qui sélectionne d’abord les dates à « 0000 ». Mais c’est une rustine. C’est là-dessus que je demandais votre avis, une idée de la cause et une solution. :slight_smile:

J’en ai effectivement profité pour demander si quelqu’un avait le temps et l’envie de réécrire ma portion de fonction basée sur celle de errational.

Ta réponse s’est axée sur ce second point et nous n’avons plus évoqué que celui-ci. :slight_smile:

J’utilise encore actuellement sur mon site cette solution.

Je réécris actuellement mes squelettes et ai découvert le filtre |intval pour les dates vides. Cela fonctionne très bien en local… Mais ça fonctionnait également en local avant sans ma rustine. Je verrai lorsque je remplacerai mes squelettes si l’erreur se reproduit.

Pour l’instant, j’en suis là.

Je n’ai pour l’instant pas le temps d’assimiler les notions de php pour écrire ma fonction spécifique.

Mais puisque la fonction de errational avec mon rajout case "delai" et les multiples if, else et else if marche très bien, je vais garder cette fonction pour l’instant.

Dans ma précédente réponse, je republiais cette portion de code rajoutée que j’utilise pour obtenir les différents « masques de retour » en fonction des âges calculés (les exemples en liste). (Pour le cas où ça servirait à quelqu’un ! :slight_smile: )

Je n’ai donc pas besoin d’autre aide sur le sujet pour l’instant mais n’hésiterai pas à saisir la communauté dans le cas contraire ! :slight_smile:

Il me manque les notions de base en php et sql (et autres) pour bien assimiler les fonctions et boucles de SPIP mais grâce à vous, je me débrouille.

Je garde sous le coude tes explications et exemples et l’aide de SPIP.
Un grand merci.