Wikini

AffichageDeDatePersonnalise

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-35-173-47-43.compute-1.amazonaws.com
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:


Le format de date "maison" dont je parlais précédemment se comporte différemment selon la date à afficher:
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:
// Fonction strtofrenchtime
//      $str_time est la date de la page au format SQL
//      $pagestamp est le timestamp de la page
//      $formatted_date est la chaine qui sera renvoyée

function strtofrenchtime($str_time,$date_format){
    if(($date_format=="")||($date_format=="0")) {
        $formatted_date=$str_time;
    } else if($date_format=="1"){
        $pagestamp = strtotime($str_time);
        $page_hour = date("G:i",$pagestamp);
        $page_year = date("Y",$pagestamp);
        $str_month = array('janvier','février','mars','avril','mai',
                           'juin','juillet','août','septembre','octobre','novembre','décembre');
        $str_day = array('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi');
                
        $diff_year=date("Y")-$page_year;
        $diff_days=date("z")-date("z",$pagestamp)+365*$diff_year;
        
        if ($diff_days==0){
            // Ajd
            $formatted_date = "Aujourd'hui à $page_hour";
        } else if ($diff_days==1) {
            // Hier
            $formatted_date = "Hier à $page_hour";
        } else if ($diff_days<6) {
            // 7 jours
            $formatted_date = $str_day[date("w",$pagestamp)]." &agrave; $page_hour";
        } else {
            // Reste des jours avec affichage optionnel de l'année
            if ($diff_year==0) { $page_year=""; }
            $page_day = date("j",$pagestamp);
            if($page_day=='1'){$page_day='1er';}

            $formatted_date  = "Le $page_day ";
            $formatted_date .= $str_month[(date("n",$pagestamp))-1]." $page_year";
            $formatted_date .= " &agrave; ".$page_hour;
        }
    } else {
        $formatted_date=date($date_format,strtotime($str_time));
    }
    return $formatted_date;
}


Dans le fichier wakka.config.php, ajouter cette ligne:

Dans le fichier actions/footer.php, modifier comme indiqué:
l'ancienne ligne:
echo  $this->GetPageTime() ? "<a href=\"".$this->href("revisions")."\" title=\"Cliquez pour voir les derni&egrave;res modifications sur cette page.\">".$this->GetPageTime()."</a> ::\n" : "";

est à remplacer par:

echo  $this->GetPageTime() ? "<a href=\"".$this->href("revisions")."\" title=\"Cliquez pour voir les derni&egrave;res modifications sur cette page.\">".strtofrenchtime($this->GetPageTime(),$this->GetConfigValue("date_format"))."</a> ::\n" : "";


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)

$output .= "<td>&nbsp;<a href=\"".$this->href("show")."&amp;time=".urlencode($page["time"])."\">".$page["time"]."</a></td>";

est à remplacer par

$output .= "<td align=\"right\">&nbsp;<a href=\"".$this->href("show")."&amp;time=".urlencode($page["time"])."\">".strtofrenchtime($page["time"],$this->GetConfigValue("date_format"))."</a></td>";


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













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:
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 " &agrave; $page_hour":'');
        } else {
            if (
$date_format) {
                return ;
strtr(date($date_format$pagestamp), $translate)
                    . (
$page_hour " &agrave; $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):
Il ne reste ensuite qu'à utiliser cette méthode, par exemple dans le footer:
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

--SloYvY


ProgFouASuivre
Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]