Avatar billede nemlig Professor
09. maj 2024 - 17:49 Der er 10 kommentarer og
1 løsning

iCal-feed og import til google kalender driller

Hejsa.
Jeg har et bookingsystem, hvor det er muligt at hente alle kalenderaftaler via et iCal-feed.
iCal-feed’et er skrevet i PHP og kan hentes via en URL med parameter, der fx hedder https://domain/calendar.php?id=93fn2mtKxX6KDU0XY
Parameteren er sat af sikkerhedsgrunde.
Skrives denne URL direkte i browserens adressefelt, så downloades en iCal-fil, der hedder calender.ics. Når denne ics-fil importeres til Google Calender, så spiller alt perfekt.
Men hvis jeg i stedet anvender PHP-filen's URL ovenfor incl. parametre som URL i Google Calendars import funktion, så står alle aftaler i Google Calender som ”Optaget” og der kan ikke vises nogen detaljer.
I min PHP-fil har jeg sat denne header:[div] $filename = "calendar.ics";
header("Content-type:text/calendar");
header("Content-Disposition: attachment; filename=$filename");[/DIV]

Nogen der kan gennemskue problemet og som har forslag til løsning.
Avatar billede nemlig Professor
09. maj 2024 - 17:51 #1
Hov, jeg fik ikke skrevet indholdet i "div" korrekt:  Kommer her:
$filename = "calendar.ics";
header("Content-type:text/calendar");
header("Content-Disposition: attachment; filename=$filename");
Avatar billede erikjacobsen Ekspert
09. maj 2024 - 22:34 #2
Jeg gætter:  Google-kalenderen har vel ikke brug for et filnavn til download. Gør det nogen forskel hvis du udelader linjen med  header("Content-Disposition: attachment; filename=$filename")  ?
Avatar billede nemlig Professor
10. maj 2024 - 10:42 #3
#2 Tak for forslaget, som jeg nu har prøvet. Det ændrer desværre ikke noget. Aftalerne står som "Optagede" og når aftalerne åbnes i Google Calendar, er status = "Privat".

Jeg har prøvet at eksportere filen via linket ovenfor incl. parametre. Her dannes en korrekt fil. Uploader jeg denne ics.fil til min server, og importerer filen i Google Calendar ved at angive URL'en, så spiller det godt nok.
https://domain/calendar.ics
Men jeg har brug for løsningen med PHP-filen, da den jo henter de aktuelle bookinger.
Avatar billede erikjacobsen Ekspert
10. maj 2024 - 11:30 #4
Jamen, det er da en anelse mystisk. Det er en meget lille ting, men principielt betyder store/små bogstaver noget, så prøv med:

Content-Type: text/calendar

(Stort T i Type) - den browser vil skrive det når leverer den rå .ics fil. Jeg mindes ikke at have set problemet før. Den anden lille ting er om der skal angives et character-set:

header('Content-Type: text/calendar; charset=utf-8');
Avatar billede erikjacobsen Ekspert
10. maj 2024 - 12:39 #5
Og så er der noget med for lange linjer, og at linjer skal slutte med CRLF - begge ifølge en lille online validator:  https://icalendar.org/validator.html 

Hvis det ikke virker når validatoren siger OK, så må vi kigge på det igen.
Avatar billede nemlig Professor
10. maj 2024 - 12:42 #6
Jeg har nu prøvet, som du foreslår, men med samme resultat.
Jeg har googlet lidt, og kan se, at andre også har haft problemet, men jeg kan ikke finde løsninger.
Avatar billede nemlig Professor
10. maj 2024 - 12:57 #7
#5 Præcis denne validator har jeg benyttet, og alt er OK.
Og det er jo også OK, når jeg eksporterer i ICS- filen og uploader til Google Calendar eller den hentes via URL 
Problemet er alene PHP-filen, når der linkes til den i URL-opsætningen på Google Calendar.
Jeg har også prøvet med PHP-filen uden parametre - det giver samme problem med at alle kalenderaftaler står som optaget og privat.
Avatar billede erikjacobsen Ekspert
10. maj 2024 - 15:28 #8
Jeg legede lidt - det er jo fredag. Og jeg fik lavet en PHP-fil, der gav denne indgang i Google Calender:

    Abraham Lincoln
    Sunday, May 12⋅14:00 – 15:00
    Hodgenville, Kentucky
    Born February 12, 1809
    Sixteenth President

    10 minutes before

    http://somefunnydomain/somedirectory/xxx.php
    Free

Den snakker så engelsk. Men er det ikke tæt på det du vil?  PHP-filen med CRLF:

<?php
header('Content-Type: text/calendar; charset=utf-8');
//header('Content-Disposition: attachment; filename="my-file.ics"');
?>
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ZContent.net//Zap Calendar 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
SUMMARY:Abraham Lincoln
UID:c7614cff-3549-4a00-9152-d25cc1fe077d
SEQUENCE:0
STATUS:CONFIRMED
TRANSP:TRANSPARENT
DTSTART:20240512T120000
DTEND:20240512T130000
DTSTAMP:20150421T141403
CATEGORIES:U.S. Presidents,Civil War People
LOCATION:Hodgenville\, Kentucky
GEO:37.5739497;-85.7399606
DESCRIPTION:Born February 12\, 1809\nSixteenth President
URL:http://americanhistorycalendar.com/peoplecalendar/1,328-abraham-lincoln
END:VEVENT
END:VCALENDAR
Avatar billede nemlig Professor
10. maj 2024 - 15:51 #9
Spændende og super fedt, at du bruger tid på at hjælpe mig. Det sætter jeg stor pris på :):).
Jeg har stort set de samme parametre, men der er nogle forskelle. Fx. benytter jeg ikke UID.
Jeg benytter også /n.
Så nu skal jeg i gang med at teste din løsning, der virker, og så prøver jeg mig frem, til jeg rammer løsningen med de data, jeg gerne vil have med.

Her er koden, der danner den første del af ics-filen:
$ics_data = "BEGIN:VCALENDAR\n";
    $ics_data .= "VERSION:2.0\n";
    $ics_data .= "PRODID:PHP Kalendersystem\n";
    $ics_data .= "METHOD:PUBLISH\n";
    $ics_data .= "CALSCALE:GREGORIAN\n";
    $ics_data .= "X-WR-CALNAME:".$kundenavn."\n";
    $ics_data .= "X-WR-TIMEZONE:Europe/Copenhagen\n";

Uddrag af min kode pr. begivenhed kode:
$ics_data .= "BEGIN:VEVENT\n";
$ics_data .= "DTSTART:".$start_date."T".$start_time."Z\n";
$ics_data .= "DTEND:" . $end_date . "T" . $end_time . "Z\n";
$ics_data .= "DTSTAMP:" . date('Ymd') . "T" . date('His') . "Z\n";
$ics_data .= "CREATED:20220123T165223Z\n";
$ics_data .= "LAST-MODIFIED:20220123T165244Z\n";
$ics_data .= "TRANSP:TRANSPARENT\n";
$ics_data .= "LOCATION:" . $location . "\n";
$ics_data .= "DESCRIPTION:" . $description . "\n";
$ics_data .= "SUMMARY:" . $name . "\n";
$ics_data .= "CLASS:PUBLIC\n";
$ics_data .= "SEQUENCE:0\n";
$ics_data .= "STATUS:CONFIRMED\n";
$ics_data .= "END:VEVENT\n";

Og her er den sidste del:
$filename = "event_calendar.ics";
header('Content-Type: text/calendar; charset=utf-8');
//    header("Content-Disposition: attachment; Filename=".$filename);
echo $ics_data;
exit;
Avatar billede nemlig Professor
10. maj 2024 - 20:30 #10
Kære Erik. Jeg er jublende glad og har endeligt få det til at virke.
Tusinde tak for dine input og særligt løsningen, som du brugte en del af din fredag på at lave.

Der var flere små, men vigtige detaljer, jeg ikke havde styr på.

1. UID skal sættes og være unik pr. post.
2. Og så opdagede jeg - efter alt for langt tid - at det er lige som om, at Google Calendar har cachet iCal-filen, der angives til import.
Problemet er, at jeg jo tester og retter i den samme php-fil, som jeg importerer via URL'en. Når jeg så konstaterede, at det ikke virkede, så "fjernede" jeg den importerede kalender igen fra Google Calendar, rettede PHP-koden og indsatte den samme URL igen i Google Calendar. Her anvender Google Calendar de oprindelige og fejlbehæftede importdata og ikke de tilrettede.
Så løsningen var, at jeg ændrede filnavnet, hver gang jeg rettede PHP-filen.

MEN NU VIRKER DET  -  HURRA!
Avatar billede erikjacobsen Ekspert
10. maj 2024 - 21:28 #11
Herligt. Nu er det din tur til at svare på spørgsmål om import til Google Calendar ... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester