Browse Source

Affichage des evenements avec timezone dans les squelettes : on revoit completement la copie pour alleger les ecritures

- #DATE_DEBUT et #DATE_FIN deviennent des balises calculees qui prennent automatiquement en compte la timezone de l'evenement si il y en a une et si la config est activee pour le plugin
- #DATE_DEBUT* et #DATE_FIN* permettent d'avoir les valeur brutes en base (donc dans le fuseau horaire par defaut du site)
- #TIMEZONE est une balise permettant d'afficher la timezone de l'evenement (ou rien si il y en a pas), selon different format :
  #TIMEZONE{gmt} #TIMEZONE{abbr}
- #TIMEZONE{#HORAIRE,abbr} permet d'afficher la timezone si il y a un horaire a l'evenement (sinon c'est pas tres utile), et au format abbr dans ce cas

Pour le reste les affichages de date ne changent pas, et sans modif de squelette les horaires des evenements restent bon a l'affichage, il manque juste la precision de la timezone
On a donc aucune degradation de l'existant si un admin active l'option et l'utilise dans l'admin sans modifier les squelettes, ce qui est plus robuste et facilite la transition
pull/7/head
Cerdic 1 year ago
parent
commit
bd3d47f40f
10 changed files with 62 additions and 72 deletions
  1. +19
    -63
      inc/agenda_timezone.php
  2. +1
    -1
      notifications/inc-evenement.html
  3. +1
    -1
      paquet.xml
  4. +1
    -1
      prive/listes/corbeille_evenements.html
  5. +1
    -1
      prive/objets/contenu/evenement.html
  6. +1
    -1
      prive/objets/liste/evenements.html
  7. +1
    -1
      prive/squelettes/contenu/agenda_inscriptions.html
  8. +34
    -0
      public/agenda.php
  9. +2
    -2
      squelettes/inc-rss-item-evenement.html
  10. +1
    -1
      squelettes/inclure/resume/evenement.html

+ 19
- 63
inc/agenda_timezone.php View File

@ -12,75 +12,29 @@ if (!defined('_ECRIRE_INC_VERSION')) {
}
/**
* Affichage de la date d'un evenement en precisant le fuseau *si* config active et il y a une timezone sur l'evenement
* @param string $date_debut
* @param string $date_fin
* @param string $horaire
* Afficher la timezone
* @param string $date
* date consideree, necessaire si on veut afficher en GMT+2 pour prendre en compte le daylight saving
* @param string $timezone
* timezone
* @param string $format
* peux prendre plusieurs formats separes par des espaces dans la chaine, dont
* ceux supportes par affdate_debut_fin
* + ceux supportes par agenda_tz_to_string
* @return string
*/
function affdate_debut_fin_timezone($date_debut, $date_fin, $horaire='oui', $timezone='', $format='') {
static $config_timezone;
if (is_null($config_timezone)) {
include_spip('inc/config');
$config_timezone = lire_config('agenda/fuseaux_horaires',0);
}
$tz_string = '';
$h = ($horaire === 'oui' or $horaire === true);
if ($timezone and $config_timezone) {
$date_debut = agenda_tz_date_local_to_tz($date_debut, $timezone);
$date_fin = agenda_tz_date_local_to_tz($date_fin, $timezone);
if ($h) {
$tz_string = agenda_tz_to_string($date_debut, $timezone, $format);
if ($tz_string) {
$tz_string = " <i class='date-tz'>$tz_string</i>";
}
}
function afftimezone($date, $timezone, $format) {
$tz_string = agenda_tz_to_string($date, $timezone, $format);
if ($tz_string) {
$tz_string = " <i class='date-tz'>$tz_string</i>";
}
$aff = affdate_debut_fin($date_debut, $date_fin, $horaire, $format) . $tz_string;
return $aff;
return $tz_string;
}
/**
* Afficher la date dans la TimeZone indiquee selon le format choisi
* @param $date
* @param $timezone
* @param $format
* peux prendre plusieurs formats separes par des espaces dans la chaine, dont
* ceux supportes par affdate
* + ceux supportes par agenda_tz_to_string
* + tzonly pour n'afficher que la timezone
* @param $tzformat
* Convertir une date de la timezone par defaut (en base) vers la timezone cible
* *si* la config est activee et *si* il y a une timezone fournie
* @param string $date
* @param string $timezone
* @return string
*/
function affdate_timezone($date, $timezone, $format = 'entier', $tzformat='tznone') {
static $config_timezone;
if (is_null($config_timezone)) {
include_spip('inc/config');
$config_timezone = lire_config('agenda/fuseaux_horaires',0);
}
$tz_string = '';
if ($timezone and $config_timezone){
$date = agenda_tz_date_local_to_tz($date, $timezone);
$tz_string = agenda_tz_to_string($date, $timezone, "$format $tzformat");
}
if (stripos("$format $tzformat",'tzonly')!==false) {
return $tz_string;
}
if ($tz_string) {
$tz_string = " <i class='date-tz'>$tz_string</i>";
}
$aff = affdate($date, $format) . $tz_string;
return $aff;
}
function date_to_timezone($date, $timezone) {
static $config_timezone;
if (is_null($config_timezone)) {
@ -106,6 +60,11 @@ function date_to_timezone($date, $timezone) {
* @return string
*/
function agenda_tz_to_string($date, $timezone, $format) {
// Rien a faire ?
if (stripos($format,'non')!==false) {
return '';
}
$timezone = agenda_tz_valide_timezone($timezone);
try {
@ -119,12 +78,9 @@ function agenda_tz_to_string($date, $timezone, $format) {
if (stripos($format,'gmt')!==false) {
return "GMT" . $dt->format('P');
}
if (stripos($format,'tzshort')!==false) {
if (stripos($format,'short')!==false or stripos($format,'abbr')!==false) {
return $dt->format('T');
}
if (stripos($format,'tznone')!==false) {
return '';
}
return $dt->format('e');
}


+ 1
- 1
notifications/inc-evenement.html View File

@ -1,7 +1,7 @@
<BOUCLE_event(EVENEMENTS){id_evenement}{statut?}{tout}>
<div class="cartouche">
<h2 class="titre">[(#LOGO_EVENEMENT|image_reduire{40,*}) ]#TITRE</h2>
[<p class="date">(#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE,#TIMEZONE_AFFICHE,'hcal tzshort'})</p>]
[<p class="date">(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE,hcal})[ (#TIMEZONE{#HORAIRE,abbr})]</p>]
</div>
[<div class="texte">(#DESCRIPTIF|image_reduire{500,*})</div>]


+ 1
- 1
paquet.xml View File

@ -1,7 +1,7 @@
<paquet
prefix="agenda"
categorie="date"
version="4.0.6"
version="4.1.0"
etat="test"
compatibilite="[3.2.0;3.3.*]"
logo="prive/themes/spip/images/evenement-32.png"


+ 1
- 1
prive/listes/corbeille_evenements.html View File

@ -8,7 +8,7 @@
<label for='formulaire-#ID_EVENEMENT'><:corbeille:selectionner:></label>
<input type='checkbox' name='elements[]' id="evenement-#ID_EVENEMENT" value='#ID_EVENEMENT'[ (#ID_EVENEMENT|in_any{#ENV{elements}}|oui)checked='checked']/>
<h4>[##ID_EVENEMENT - (#TITRE|sinon{<:info_sans_titre:>})]</h4>
<small>[(#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE,#TIMEZONE_AFFICHE,'tzshort'})]</small>
<small>[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE})[ (#TIMEZONE{#HORAIRE,abbr})]]</small>
<p class='actions'><a href='#URL_ECRIRE{evenement,id_evenement=#ID_EVENEMENT}'><:corbeille:voir_detail:></a></p>
</li>
</BOUCLE_evenements>


+ 1
- 1
prive/objets/contenu/evenement.html View File

@ -5,7 +5,7 @@
</div>
<div class="champ contenu_dates">
<div class='label'><:agenda:info_dates:></div>
<div dir='#LANG_DIR' class='dates'>[(#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE,#TIMEZONE_AFFICHE,'tzshort annee'})]</div>
<div dir='#LANG_DIR' class='dates'>[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE,annee})[ (#TIMEZONE{#HORAIRE,abbr})]]</div>
</div>
<B_repetitions>
<div class="champ contenu_repetitions info information">


+ 1
- 1
prive/objets/liste/evenements.html View File

@ -28,7 +28,7 @@
<td class='date[ (#DATE_DEBUT|affdate{'Y-m-d'}|unique{liste_evt}|?{first-of,same-as})]'>[(#DATE_DEBUT|affdate_jourcourt)]</td>
<td class='article secondaire'>[<a (#ID_ARTICLE|oui) href="[(#ID_ARTICLE|generer_url_entite{article})]" title="[(#INFO_TITRE{article,#ID_ARTICLE}|attribut_html)]">[(#CHEMIN_IMAGE{article-16.png}|balise_img{#INFO_TITRE{article,#ID_ARTICLE}})]</a>]</td>
<td class='titre principale'><a href="[(#ID_EVENEMENT|generer_url_entite{evenement})]" title="<:info_numero_abbreviation|attribut_html:> #ID_EVENEMENT">[(#RANG). ]#TITRE</a>
<p class="date">[(#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE,#TIMEZONE_AFFICHE,'tzshort'})]</p>
<p class="date">[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE})[ (#TIMEZONE{#HORAIRE,abbr})]]</p>
</td>
<td class='lieu secondaire'>#LIEU</td>
<td class='place secondaire'>[(#INSCRIPTION|oui)[(#PLACES|moins{#NB_INSCRITS})] / #PLACES#SET{has_places,1}]</td>


+ 1
- 1
prive/squelettes/contenu/agenda_inscriptions.html View File

@ -2,7 +2,7 @@
<BOUCLE_evt(EVENEMENTS){id_evenement}{tout}>
<h1 class="grostitre"><:agenda:liste_inscrits:></h1>
<h2 class="#EDIT{titre}">#TITRE</h2>
<div dir='#LANG_DIR' class='dates'>[(#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE,#TIMEZONE_AFFICHE,'tzshort'})]</div>
<div dir='#LANG_DIR' class='dates'>[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE})[ (#TIMEZONE{#HORAIRE,abbr})]]</div>
[<div class='descriptif secondaire #EDIT{descriptif}'><:agenda:evenement_descriptif:> : (#DESCRIPTIF|PtoBR)</div>]
[<div class='lieu secondaire #EDIT{lieu}'><:agenda:evenement_lieu:> : (#LIEU)</div>]
<INCLURE{fond=prive/objets/liste/evenement_participants,id_evenement=#ENV{id_evenement},tri_inscrits=#ENV{tri_inscrits}}>


+ 34
- 0
public/agenda.php View File

@ -48,6 +48,40 @@ function balise_DATE_FIN_dist($p) {
return $p;
}
/**
* Affichage en clair de la timezone selon le format demande
* #TIMEZONE -> Europe/Paris
* #TIMEZONE{gmt} -> GMT+01:00
* #TIMEZONE{abbr} -> EDT
* #TIMEZONE{non} -> n'affiche rien
*
* #TIMEZONE{#HORAIRE} -> n'affiche pas la timezone si horaire=non
* #TIMEZONE{#HORAIRE,gmt} -> affiche pas la timezone en gmt si horaire!=non
*
* @param $p
* @return mixed
*/
function balise_TIMEZONE_dist($p) {
$_timezone = champ_sql('timezone_affiche', $p);
$p->code = $_timezone;
if (!$p->etoile){
$_format1 = interprete_argument_balise(1, $p);
if (!$_format1) {
$_format1 = "''";
}
$_format2 = interprete_argument_balise(2, $p);
if (!$_format2) {
$_format2 = "''";
}
$_date_debut = champ_sql('date_debut', $p);
$p->code = "afftimezone($_date_debut, $_timezone, $_format1 . ' ' . $_format2)";
}
return $p;
}
/**
* #URL_EVENEMENT envoie sur la page de l'evenement
* ou sur la page de l'article avec un &id_evenement=xxx


+ 2
- 2
squelettes/inc-rss-item-evenement.html View File

@ -11,7 +11,7 @@
#SET{intro,''}<BOUCLE_art(ARTICLES){id_article}>#SET{intro,#INTRODUCTION{#ENV{coupe,300}}</BOUCLE_art>
[(#REM) Le bloc qui suit diffuse l'evenement a la mode RSS ]
<description>
[(#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE,#TIMEZONE_AFFICHE,'tzshort'}|texte_backend)][ - (#LIEU|PtoBR|texte_backend)]
[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE}|texte_backend)[ (#TIMEZONE{#HORAIRE,abbr}|texte_backend)]][ - (#LIEU|PtoBR|texte_backend)]
[(#DESCRIPTIF|sinon{#GET{intro}}|texte_backend)]
</description>
@ -21,7 +21,7 @@
[(#CONFIG{syndication_integrale}|=={oui}|?{' ',''})<content:encoded>
[(#LOGO_ARTICLE{right}|image_reduire{150,150}|texte_backend)]
&lt;div class='rss_texte'&gt;
[(#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE,#TIMEZONE_AFFICHE,'tzshort'}|texte_backend)][ - (#LIEU|PtoBR|texte_backend)]
[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE}|texte_backend)[ (#TIMEZONE{#HORAIRE,abbr}|texte_backend)]][ - (#LIEU|PtoBR|texte_backend)]
[(#DESCRIPTIF|sinon{#GET{intro}}|texte_backend)]
&lt;/div&gt;
</content:encoded>]


+ 1
- 1
squelettes/inclure/resume/evenement.html View File

@ -6,7 +6,7 @@
class="lire-la-suite hide"><i class="icon-chevron-right" title="<:zpip:lire_la_suite|attribut_html:><:zpip:lire_la_suite_de|attribut_html:>&laquo;[(#TITRE|attribut_html)]&raquo;"></i></span></a></strong>
<meta itemprop="startDate" content="[(#DATE_DEBUT|affdate{Y-m-d})]T[(#DATE_DEBUT|affdate{H:i:sO})]" />
<meta itemprop="endDate" content="[(#DATE_FIN|affdate{Y-m-d})]T[(#DATE_FIN|affdate{H:i:sO})]" />
[<p class="info-publi"><time><i class="icon-calendar"></i> (#DATE_DEBUT|affdate_debut_fin_timezone{#DATE_FIN,#HORAIRE*,#TIMEZONE_AFFICHE,'hcal tzshort'})</time></p>]
[<p class="info-publi"><time><i class="icon-calendar"></i> (#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE*,hcal})[ (#TIMEZONE{#HORAIRE,abbr})]</time></p>]
#SET{intro,''}<BOUCLE_art(ARTICLES){si #ENV{sinon_intro_article,oui}|=={non}|ou{#ENV{intro}|=={non}}|non}{id_article}>#SET{intro,#INTRODUCTION{#ENV{coupe,300}}</BOUCLE_art>
[(#ENV{intro,oui}|=={non}|non|et{#DESCRIPTIF}|oui)[(#SET{intro,[<div class="introduction #EDIT{descriptif}" itemprop="description">(#DESCRIPTIF|sinon{#GET{intro}})</div>]})]]
[(#GET{intro}|ou{#LIEU}|ou{#ADRESSE}|oui)


Loading…
Cancel
Save