Pour obtenir un affichage de date plus lisible que le format actuel "AAAA-MM-JJ HH:MM:SS", je viens de faire une fonction (probablement assez perfectible, c'est un premier jet). Commentaires bienvenus. --
OlivierPoncin
Les fichiers à modifier sont:
- wakka.php pour y placer la fonction, après la définition de la classe Wiki
- wakka.config.php pour ajouter un nouveau paramètre, déterminant le comportement de la fonction parmi trois modes:
- "date_format" => "0" pour conserver le format de date actuel de Wikini
- "date_format" => "1" pour utiliser un format "maison" que j'adore et que je vais décrire dans cette page
- "date_format" => "autre valeur" pour choisir directement le paramètre utilisé dans la fonction date() (voir la doc de php.net)
- action/footer.php pour appeler la fonction au moment de l'affichage de la date dans le pied de page
- handlers/page/revisions.php pour appeler la fonction lors de l'affichage de la liste des révisions d'une page
Le format de date "maison" dont je parlais précédemment se comporte différemment selon la date à afficher:
- Aujourd'hui à 21:42 si la page à été modifiée le même jour que l'on consulte la page
- Hier à 21:42 si la page à été modifiée la veille
- Mardi à 21:42 si la page à été modifiée dans les 6 jours précédents
- Le 28 mars à 21:42 si la page à été modifiée à une date plus lointaine
- Le 28 mars 2003 à 21h42 (on n'affiche l'année que si ce n'est pas la même année que l'année actuelle)
Dans ce format maison, j'ai choisi de ne pas afficher les secondes.
Description de la fonction nommée strtofrenchtime
string strtofrenchtime ( string sql_time, string config_format)
On appelle la fonction en lui donnant comme paramètres la date récupérée de la base mysql ainsi que la valeur du paramètre du fichier de configuration
date_format. La fonction renvoie la date formatée comme demandé.
Pas à pas pour utiliser cette nouvelle fonction
Dans le fichier
wakka.php, ajouter cette fonction après la définition de la classe
Wiki:
Dans le fichier
wakka.config.php, ajouter cette ligne:
- "date_format" => "1", (avec la valeur de votre choix comme expliqué en haut de page, ici j'ai choisi la valeur "1" pour utiliser le format de date spécial)
Dans le fichier
actions/footer.php, modifier comme indiqué:
Dans le fichier
handlers/page/revisions.php, on appelle la fonction et on peut aussi souhaiter de modifier l'alignement du texte dans la case du tableau contenant la date (meilleure lisibilité avec les formats de date n'ayant pas la même longueur selon la date)
Reste à faire
Profiter de cette fonction dans toutes les actions affichant des dates, pouvoir choisir uniquement l'affichage du jour ou de l'heure pour les actions séparant ces deux données (zut je n'avais pas pensé à ce dernier point avant)
Idées intéressantes... Pour ma part j'y avais pensé dans une forme moins évoluée mais plus portable : l'utilisation de la variable d'environnement TZ (voir
cet exemple). --
ProgFou
- Il serait effectivement pratique de pouvoir choisir sa time zone en tant qu'utilisateur. (Je ne connaissais pas cette variable d'environnement bien pratique!). Cependant dans notre cas, on affiche une date à partir de l'enregistrement en base de données et j'imagine que la variable d'environnement n'y changera rien quelle que soit sa valeur. Il faudrait qu'une time zone soit choisie à la fois par la personne configurant le wiki et par les utilisateurs. Cela permettrait de calculer la différence entre les deux zones et de prendre en compte cette différence lors de l'affichage de la date.
- Mon prochain objectif est surtout de prendre en compte tous les affichages de dates et pas seulement celui du pied de page et de l'historique des révisions.
- J'ai oublié de préciser que j'ai essayé cette fonction sur les versions 0.4.1rc et la dernière stable. Les modification à faire sont quasiment identique. -- OlivierPoncin
- Concernant le fait que l'utilisation de TZ ne change rien dans la situation actuelle, tu as tout à fait raison. Ceci parce que les dates sont effectivement directement affichées depuis le résultat des requêtes SQL, ce qui optimise un peu le code, mais au détriment des possibilités de le faire évoluer. Pire que ça : les dates sont aussi calculées via des requêtes SQL (comme l'appel à la fonction NOW()), or MySQL utilise la timezone locale au serveur, qui est sensible aux décallages horaires, plutôt que d'utiliser plus judicieusement la mesure de "temps universel" (UTC).
- Pour résoudre tous ces problèmes, on pourrait :
- ne pas utiliser les fonctions SQL pour générer les dates, mais plutôt les fonctions PHP time() et gmdate() ;
- ne pas afficher directement les dates depuis les résultats SQL, mais plutôt via une combinaison des fonctions PHP strtotime() et date() ;
- faire passer tous les affichages de dates par une fonction du coeur du Wiki (par exemple DisplayDate), que l'on pourrait ensuite ré-écrire à notre guise.
- Ma proposition pour obtenir une fonction DisplayDate qui soit utilisable partout est de la créer avec le comportement suivant:
- string DisplayDate ( string sql_time, string format_date, string format_time )
- Cette fonction pourrait gérer les trois cas désirés :
- Afficher la date et l'heure
- Afficher uniquement la date (lorsque le paramètre format_time est null)
- Afficher uniquement l'heure (lorsque le paramètre format_date est null)
- On pourrait éventuellement utiliser les même valeurs de paramètres que dans la fonction strtofrenchtime décrite en haut de page, c'est à dire:
- "0" pour n'effectuer aucun traitement du format, la fonction renvoie la date au format initial
- "1" pour afficher la date dans sa forme "Aujourd'hui", "Hier", "Lundi", "Le 21 mars", etc. (ce mode a la priorité la plus basse, mais si personne n'est contre... moi je l'aime! ;-))
- "autre" pour choisir le format en utilisant le paramètre de la fonction date() de php
- Voici une proposition de centralisation de l'affichage des date comme ProgFou le suggérait: (la fonction ne change rien à l'affichage dans son état actuel)
<?php
function DisplayDate ( $sql_time, $format_date, $format_time ) {
if( !is_null($format_date) && !is_null($format_time) ) {
// Si aucun des paramètres n'est null, on renvoie
// la date complète au format sql
$formatted_datetime = $sql_time;
} else {
// Sinon (l'un des paramètres est null), on sépare
// la date et l'heure et on ne renvoie que la partie voulue
list($day, $time) = explode(" ", $sql_time);
if( is_null($format_date)) {
$formatted_datetime = $time;
} else {
$formatted_datetime = $day;
}
}
return $formatted_datetime;
}
?>
- ...et il faut aussi que le futur choix de format soit réalisé dans le fichier config en y ajoutant deux paramètres, de sorte à n'avoir à modifier qu'une seule fois chaque fichier faisant appel à une date.
- "format_date" => "0",
- "format_time" => "0",
Je me suis inspiré de tes fonctions et de la technique de
PhpBB2 pour en créer une qui soit capable de gérer différents formats de date/heure:
- ISO
- affichage spécial de la date (avec aujourd'hui, hier etc.)
- affichage identique à la fonction date() de php, mais en Français
Elle supporte aussi la gestion des timezones: on peut lui spécifier le timezone d'origine (comme cette méthode est prévue pour wikini, par défaut elle prendra celui du serveur) et celui de destination (par défaut une variable de configuration)
Voici le code, documenté en plus ;-) (vous noterez la bizarerie avec la détection du timezone: chez moi [apache/1.3.29 - php/5.0.3 - win32] je ne suis pas parvenu à lire le timezone dans
$_ENV ou avec
getenv(), seule la troisième technique marchait, alors que j'ai lu à plusieurs endroits que les deux premières techniques étaient sensées marcher, notemment ci-dessus :-S)
<?php
/**
* Formattage des dates
* @param string $time La date à convertir, au format ISO ou tout autre format supporté par strtotime()
* Par défaut ce sera l'heure courante qui sera prise ('now')
* @param string $date_format Le format à donner à la date. Vous pouvez soit utiliser
* le formatage employé pour la fonction date(), soit la valeur 'special' pour un formatage
* plus convivial (utilisant des termes comme "Aujourd'hui", "hier", "Mardi" etc.), soit
* 'auto' pour utiliser la valeur de la configuration par défaut.
* @param string $time_format Le format à donner à l'heure. Vous pouvez utiliser le formatage
* employé pour la fonction date(), soit la valeur 'auto' pour utiliser le valeur de la configuration
* par défaut.
* @param float $totimezone Le décalage horaire en heures. NB.: vu qu'il s'agit d'un float, vous pouvez corriger
* un décalage en minutes et secondes. La valeur 'auto' permet d'utiliser la valeur de la configuration par défaut.
* @param float $fromtimezone Le décalage horaire dans lequel $time est supposé être actuellement. La valeur
* 'auto' fera en sorte que la méthode utilisera le timezone du serveur.
* @see date()
* @return La date $time à laquelle a été appliqué le décalage horaire $totimezone en supposant qu'elle était
* fournie avec un décalage horaire $fromtimezone, formattée selon $date_format et $time_format.
* Si $date_format et $time_format ne sont pas des chaines vides, ' à ' sera placé entre les deux. Si vous ne désirez pas placer
* ceci entre la date et l'heure, vous pouvez spécifier entièrement le format dans $date_format
* et placer une chaine vide dans $time_format. (vous ne pourrez alors cependant pas utiliser le formattage spécial)
* Si $date_format et $time_format sont des chaines vides, l'heure est retournée au format ISO.
* La date est retournée encodée en html.
**/
function StrToTime($time = 'now', $date_format = 'auto', $time_format = 'auto', $totimezone = 'auto', $fromtimezone = 'auto'){
if ($date_format === 'auto') {
$date_format = $this->GetConfigValue('date_format');
}
if ($time_format === 'auto') {
$time_format = $this->GetConfigValue('time_format');
}
if ($totimezone === 'auto') {
$totimezone = $this->GetConfigValue('default_timezone');
}
if ($fromtimezone === 'auto') {
$fromtimezone = isset($_ENV['TZ']) ? $_ENV['TZ'] : ($tz = getenv('TZ')) === false ? date('H') - gmdate('H') : $tz;
}
// Unix Timestamp correspondant à $time et $timezone
$pagestamp = strtotime($time) + (int) (3600 * ($totimezone - $fromtimezone));
// formatage date et heure
if (!$date_format && !$time_format) { // pas de formatage ? => Format ISO
return date('Y-m-d H:i:s', $pagestamp);
}
// autre formatage
include 'language/date_translation.php'; // pour l'utilisation de date() et strtr()
// formattage de l'heure
if ($time_format) {
$page_hour = date($time_format, $pagestamp);
} else $page_hour = '';
// formatage de la date et retour du résultat.
if($date_format === 'special'){
$page_year = date('Y', $pagestamp);
$diff_year = date('Y') - $page_year;
$diff_days = date('z') - date('z', $pagestamp) + 365 * $diff_year;
if (!$diff_days){
// Aujourd'hui
$formatted_date = 'Aujourd\'hui';
} elseif ($diff_days == 1) {
// Hier
$formatted_date = 'Hier';
} elseif ($diff_days < 7) {
// Au cours des 7 derniers jours
$formatted_date = strtr(date("l", $pagestamp), $translate);
} else {
// Reste des jours avec affichage optionnel de l'année
$page_day = date("j",$pagestamp);
if($page_day=='1'){$page_day='1er';}
$formatted_date = "Le $page_day " . strtr(date("F", $pagestamp), $translate)
. ($diff_year ? " $page_year":'');
}
return $formatted_date . ($page_hour ? " à $page_hour":'');
} else {
if ($date_format) {
return ;strtr(date($date_format, $pagestamp), $translate)
. ($page_hour ? " à $page_hour":'');
} else return $page_hour; // NB.: le cas où les deux sont des chaines vides a déjà été traité avant
}
}
?>
Ce serait à ajouter après la méthode IncludeBuffered pour qu'on s'y retrouve (dans le groupe des méthodes diverses)
Il faut aussi ajouter trois variables de configuration: le format par défaut de la date, celui de l'heure et le timezone du site (a priori celui-ci n'est pas forcément le même que celui du serveur):
- 'date_format' => 'special',
- 'time_format' => 'H:i:s',
- 'default_timezone' => 1
Il ne reste ensuite qu'à utiliser cette méthode, par exemple dans le footer:
- echo $this->GetPageTime?() ? "<a href=\.$this->href("revisions")."\" title=\"Cliquez pour voir les dernières modifications sur cette page.\">" . $this->StrToTime($this->GetPageTime()) . " ::\n" : ;
Et le tour est joué ;-) (ceci affichera la date de la page en se basant sur les valeurs par défaut de la configuration et le timezone du serveur)
--
LordFarquaad
Ailleurs
notes d'utilisateur
- L'affichage "perso" est bien meilleurs que le format actuel. Reste à inclure cette option dans le fichier de configuration lors de l'installation d'un nouveau WikiNi
- Je crois qu'un format d'heure "temps internet" serait le bienvenue (HeureWiki)
--
SloYvY
ProgFouASuivre