Browse Source

Certains calendrier, comme les flux ical de google, mettent pour les

evenements qui durent toutes la journée un DTSTART un jour trop tot. On
ajoute une option lors de la config d'un almanach pour gérer cela.
master
Maïeul 3 months ago
parent
commit
598d136c83
  1. 3
      action/synchro_almanach.php
  2. 5
      base/import_ics.php
  3. 4
      formulaires/editer_almanach.html
  4. 1
      genie/import_ics_synchro.php
  5. 3
      import_ics_administrations.php
  6. 17
      inc/import_ics.php
  7. 2
      lang/almanach_fr.php
  8. 2
      paquet.xml
  9. 7
      prive/objets/contenu/almanach.html

3
action/synchro_almanach.php

@ -35,9 +35,10 @@ $arg = $securiser_action();
'ete' => $result["decalage_ete"],
'hiver' => $result["decalage_hiver"]
),
$result['dtstart_exclu'],
$result['dtend_inclus']
);
spip_log ("Fin de l'import manuel de l'almanach $id_almanach","import_ics"._LOG_INFO);
}
?>
?>

5
base/import_ics.php

@ -47,6 +47,7 @@ function import_ics_declarer_tables_objets_sql($tables) {
"id_article" => "bigint(21) NOT NULL DEFAULT 0",
"decalage_ete" => "tinyint NOT NULL DEFAULT 0",
"decalage_hiver" => "tinyint NOT NULL DEFAULT 0",
"dtstart_exclu" => "varchar(10) DEFAULT '0' NOT NULL",
"dtend_inclus" => "varchar(10) DEFAULT '0' NOT NULL",
"date" => "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'",
"statut" => "varchar(20) DEFAULT '0' NOT NULL",
@ -60,8 +61,8 @@ function import_ics_declarer_tables_objets_sql($tables) {
),
'titre' => "titre AS titre, '' AS lang",
'date' => "date",
'champs_editables' => array('titre', 'url', 'id_article',"decalage_ete","decalage_hiver",'dtend_inclus'),
'champs_versionnes' => array('titre', 'url', 'id_article',"decalage_ete","decalage_hiver",'dtend_inclus'),
'champs_editables' => array('titre', 'url', 'id_article',"decalage_ete","decalage_hiver",'dtstart_exclu', 'dtend_inclus'),
'champs_versionnes' => array('titre', 'url', 'id_article',"decalage_ete","decalage_hiver",'dtstart_exclu', 'dtend_inclus'),
'rechercher_champs' => array(),
'tables_jointures' => array('spip_almanachs_liens'),
'statut_textes_instituer' => array(

4
formulaires/editer_almanach.html

@ -36,6 +36,10 @@
cacher_option_intro='on',
data=#ENV{tableau_decalage}
})]
[(#SAISIE{case,dtstart_exclu,
label=<:almanach:dtstart_exclu:>,
explication=<:almanach:dtstart_exclu_explication:>,
})]
[(#SAISIE{case,dtend_inclus,
label=<:almanach:dtend_inclus:>,
explication=<:almanach:dtend_inclus_explication:>,

1
genie/import_ics_synchro.php

@ -56,6 +56,7 @@ function genie_import_ics_synchro_dist($t){
'ete' => $resultat['decalage_ete'],
'hiver' => $resultat['decalage_hiver']
),
$resultat['dtstart_exclu'],
$resultat['dtend_inclus']
);
spip_log ("Fin de l'import via génie de l'almanach $id_almanach",'import_ics'._LOG_INFO);

3
import_ics_administrations.php

@ -74,6 +74,9 @@ function import_ics_upgrade($nom_meta_base_version, $version_cible) {
$maj["1.0.11"] = array(
array('sql_alter',"TABLE spip_almanachs ADD dtend_inclus varchar(10) DEFAULT '0' NOT NULL"),
);
$maj["1.0.13"] = array(
array('sql_alter',"TABLE spip_almanachs ADD dtstart_exclu varchar(10) DEFAULT '0' NOT NULL"),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}

17
inc/import_ics.php

@ -33,7 +33,7 @@ function trouver_evenements_almanach($id_almanach,$champs='uid,id_evenement',$to
return $liens;
}
function importer_almanach($id_almanach,$url,$id_article,$decalage,$dtend_inclus=false){
function importer_almanach($id_almanach,$url,$id_article,$decalage,$dtstart_exclu=false,$dtend_inclus=false){
// Début de la récupération des évènements
//configuration nécessaire à la récupération
$config = array('unique_id'=>'','url'=>$url);
@ -81,7 +81,7 @@ function importer_almanach($id_almanach,$url,$id_article,$decalage,$dtend_inclus
$sequence_local = $test_variation['sequence'];
$id_evenement = $test_variation['id_evenement'];
if ($last_modified_local!=$last_modified_distant or $sequence_local!=$sequence_distant){
$champs_sql = evenement_ical_to_sql($comp,$decalage, $dtend_inclus);
$champs_sql = evenement_ical_to_sql($comp,$decalage,$dtstart_exclu,$dtend_inclus);
autoriser_exception('evenement','modifier',$id_evenement);
objet_modifier('evenement',$id_evenement,$champs_sql);
autoriser_exception('evenement','modifier',$id_evenement,false);
@ -89,7 +89,7 @@ function importer_almanach($id_almanach,$url,$id_article,$decalage,$dtend_inclus
}
}
else {
importer_evenement($comp,$id_almanach,$id_article,$decalage,$statut,$mots,$dtend_inclus);
importer_evenement($comp,$id_almanach,$id_article,$decalage,$statut,$mots, $dtstart_exclu, $dtend_inclus);
};//l'evenement n'est pas dans la bdd, on va l'y mettre
}
if (_IMPORT_ICS_DEPUBLIER_ANCIENS_EVTS == 'on' or lire_config('import_ics/depublier_anciens_evts') == 'on'){
@ -120,9 +120,9 @@ function depublier_ancients_evts($les_uid_local,$les_uid_distant,$id_article){
/**
* Importation d'un événement dans la base
**/
function importer_evenement($objet_evenement,$id_almanach,$id_article,$decalage,$statut,$mots,$dtend_inclus=false){
function importer_evenement($objet_evenement, $id_almanach, $id_article, $decalage, $statut, $mots, $dtstart_exclu, $dtend_inclus=false){
$champs_sql = array_merge(
evenement_ical_to_sql($objet_evenement,$decalage,$dtend_inclus),
evenement_ical_to_sql($objet_evenement,$decalage, $dtstart_exclu, $dtend_inclus),
array(
"id_article"=>$id_article,
"date_creation"=>date('Y-m-d H:i:s')
@ -155,10 +155,11 @@ function importer_evenement($objet_evenement,$id_almanach,$id_article,$decalage,
* Récupérer les propriétés d'un evenements de sorte qu'on puisse en faire la requete sql
* @param \vevent $objet_evenement un objet de classe vevent
* @param array $decalage un tableau decrivant les éventuels décalage horaire à appliquer
* @param bool $dtstart_exclu pour signaler si la date de fin est excluse (normalement, si la norme est respectée, non)
* @param bool $dtend_inclus pour signaler si la date de fin est incluse (normalement, si la norme est respectée, non)
* @return array un tableau des champs sql à insérer/modifier, après passage dans le pipeline evenement_ical_to_sql
**/
function evenement_ical_to_sql($objet_evenement, $decalage, $dtend_inclus = false){
function evenement_ical_to_sql($objet_evenement, $decalage, $dtstart_exclu=false, $dtend_inclus = false){
//on recupere les infos de l'evenement dans des variables
$uid_distant = $objet_evenement->getProperty('UID');#uid de l'evenement
@ -215,6 +216,9 @@ function evenement_ical_to_sql($objet_evenement, $decalage, $dtend_inclus = fals
if (!$dtend_inclus) {
$date_fin = import_ics_date_sql_shift($date_fin, '-1 DAY');;// Si un évènement dure toute la journée du premie août, le flux ICAL indique pour DTEND le 2 août (cf http://www.faqs.org/rfcs/rfc2445.html). Par contre le plugin agenda lui dit simplement "evenement du 1er aout au 1er aout, sans horaire". D'où le fait qu'on décale $date_fin par rapport aux flux originel.
}
if ($dtstart_exclu) {
$date_debut = import_ics_date_sql_shift($date_debut, '+1 DAY');;// Si un évènement dure toute la journée du premie août, le flux ICAL indique pour DTSTARRT le 1 août (cf http://www.faqs.org/rfcs/rfc2445.html). Certains flux ICAL (par ex. de google) sont erronnées.
}
}
else{
$horaire = 'oui';
@ -262,6 +266,7 @@ function evenement_ical_to_sql($objet_evenement, $decalage, $dtend_inclus = fals
'args' => array(
'objet_evenement' => $objet_evenement,
'decalage' => $decalage,
'dtstart_exclu' => $dtstart_exclu,
'dtend_inclus' => $dtend_inclus,
'xprops' => $xprops, // On le passe car c'est pénible à parcourir, on qu'on a avancer l'itérateur de toute facon
'champs_x' => $champs_x // idem

2
lang/almanach_fr.php

@ -28,6 +28,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'decalage_ete_explication' => 'Vous pouvez tenter un décalage global des horaires s’ils n’apparaissent pas à la bonne heure, pour des raisons de fuseaux horaires. La valeur choisie correspond au nombre d’heures à ajouter à l’horaire fournie par le site distant. Ce champ concerne les évènements ayant lieu lorsque l’heure d’été est en vigueur.',
'decalage_hiver' => 'Décalage pour l’heure d’hiver',
'decalage_hiver_explication' => 'Vous pouvez tenter un décalage global des horaires s’ils n’apparaissent pas à la bonne heure, pour des raisons de fuseaux horaires. La valeur choisie correspond au nombre d’heures à ajouter à l’horaire fournie par le site distant. Ce champ concerne les évènements ayant lieu lorsque l’heure d’hiver est en vigueur.',
'dtstart_exclu' => 'Le flux ICAL considère que la date de début est exclue de l’évènement',
'dtstart_exclu_explication' => 'La norme ICAL implique normalement que la date de début (DSTART) est incluse dans l’évènement. Certains flux ne respectent pas cette norme. Cocher cette case si la date de début des évènements importés est décalée d’un jour.',
'dtend_inclus' => 'Le flux ICAL considère que la date de fin est incluse dans l’évènement',
'dtend_inclus_explication' => 'La norme ICAL implique normalement que la date de fin (DTEND) ne soit pas incluse dans l’évènement. Certains flux ne respectent pas cette norme. Cocher cette case si la date de fin des évènements importés est décalée d’un jour.',

2
paquet.xml

@ -6,7 +6,7 @@
compatibilite="[4.0.0;4.1.*]"
logo="prive/themes/spip/images/import_ics-xx.svg"
documentation="https://contrib.spip.net/4816"
schema="1.0.11"
schema="1.0.13"
>
<nom>Import_ics</nom>

7
prive/objets/contenu/almanach.html

@ -31,7 +31,12 @@
<span dir='#LANG_DIR' class='#EDIT{decalage_hiver} decalage'>[ [(#DECALAGE_HIVER|>={0}|?{+})](#DECALAGE_HIVER|singulier_ou_pluriel{almanach:heure,almanach:heures})][(#DECALAGE_HIVER|=={0}|?{<:almanach:pas_de_decalage:>})]</span>
</div>
[<div class="champ contenu_dtend_inclus[ (#URL*|strlen|?{'',vide})]">
[<div class="champ contenu_dtstart_exclu">
<label><strong><:almanach:dtstart_exclu:> : </strong></label>
<span dir='#LANG_DIR' class='#EDIT{dtstart_exclu} url'>(#DTSTART_EXCLU)</span>
</div>]
[<div class="champ contenu_dtend_inclus">
<label><strong><:almanach:dtend_inclus:> : </strong></label>
<span dir='#LANG_DIR' class='#EDIT{dtend_inclus} url'>(#DTEND_INCLUS)</span>
</div>]

Loading…
Cancel
Save