ฉันจะใช้ PHP เพื่อเผยแพร่ไฟล์ ical แบบไดนามิกเพื่อให้ Google ปฏิทินอ่านได้อย่างไร


108

การค้นหาของ Google บน PHP ical จะแสดง phpicalendar และวิธีการแยกวิเคราะห์หรืออ่านไฟล์ ical ฉันแค่ต้องการเขียนไฟล์ PHP ที่ดึงเหตุการณ์จากฐานข้อมูลของฉันและเขียนออกมาในรูปแบบ ical

ปัญหาของฉันคือฉันไม่พบที่ใดที่จะตอบคำถามสองข้อ:

  1. อะไรคือสิ่งที่แน่นอนรูปแบบ iCal รวมทั้งส่วนหัวรูปแบบไฟล์ท้าย ฯลฯ ? กล่าวอีกนัยหนึ่งคือไฟล์ต้องมีอะไรบ้างเพื่อให้ Google ปฏิทินอ่านได้อย่างถูกต้อง ฯลฯ
  2. ถ้าฉันสร้างไฟล์นี้โดยใช้นามสกุล. php ฉันจะเผยแพร่เป็น ical ได้อย่างไร ฉันต้องเขียนไฟล์. ics ใหม่หรือไม่? หรือ Google ปฏิทิน ฯลฯ จะอ่านไฟล์. php เป็น ical ตราบใดที่เนื้อหาอยู่ในรูปแบบที่ถูกต้อง? (เช่นเดียวกับไฟล์ style.css.php จะถูกอ่านเป็นไฟล์ CSS หากเนื้อหาเป็น CSS เป็นต้น)

ความช่วยเหลือใด ๆ ที่คุณสามารถให้หรือชี้ให้ฉันเห็นจะได้รับการชื่นชมอย่างมาก !!!

คำตอบ:


130

สิ่งนี้น่าจะง่ายมากหาก Google ปฏิทินไม่ต้องการ*.ics-extension (ซึ่งจะต้องมีการเขียน URL ใหม่ในเซิร์ฟเวอร์)

$ical = "BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:" . md5(uniqid(mt_rand(), true)) . "@yourhost.test
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR";

//set correct content-type-header
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename=calendar.ics');
echo $ical;
exit;

นั่นคือทั้งหมดที่คุณต้องทำให้ลูกค้าคิดว่าคุณกำลังให้บริการไฟล์ iCalendar แม้ว่าอาจมีปัญหาบางอย่างเกี่ยวกับการแคชการเข้ารหัสข้อความและอื่น ๆ แต่คุณสามารถเริ่มทดลองใช้โค้ดง่ายๆนี้ได้


1
ขอบคุณ. ฉันคิดว่าส่วนหัวเหล่านั้นคือสิ่งที่ฉันขาดหายไป ฉันคิดว่ามีขั้นตอนสุดท้ายสองสามขั้นตอนในการทำให้ Google ปฏิทินนี้พร้อมใช้งานเมื่อฉันพยายามฟีดไฟล์นี้ไปยัง Google ปฏิทินผ่าน URL มันขึ้นว่า "กำลังนำเข้าปฏิทินจาก url ... " แต่จะค้างอยู่ตลอดไป อาจเป็นคำถามอื่นที่จะโพสต์?
rhodesjason

3
ตรง ฉันอัปเดตตัวอย่างข้างต้น - และฉันยังเพิ่มคุณสมบัติ DTSTAMP ซึ่งจะแจ้งให้ลูกค้าทราบเมื่อมีการอัปเดตเหตุการณ์
Stefan Gehrig

1
โอเค Gehrig คุณเป็นอัจฉริยะ ที่ได้ผล ขอบคุณ. (เท่าที่ฉันสามารถบอกได้ว่า Google ปฏิทินกำลังอัปเดตเกือบจะในทันทีด้วย)
rhodesjason

3
ถ้าฉันไม่ได้ทำผิด. โปรแกรมใช้ UID เพื่อดูว่าเหตุการณ์ถูกลบหรือไม่ หาก php-script สร้าง UID อื่นเสมอ (-> mt_rand) โปรแกรมมักจะคิดว่าเนื้อหาทั้งหมดมีการเปลี่ยนแปลง ทุกอย่างหายไปและทุกอย่างใหม่ โดยส่วนตัวฉันจะยึดติดกับ UID เดียวกันหากเหตุการณ์เหมือนกันในฐานข้อมูลและใช้ recordID (และข้อมูลโฮสต์บางส่วน) DTSTAMP อยู่ที่นั่นเพื่อแสดงบางสิ่งที่เปลี่ยนแปลงไป แค่นั้นก็น่าจะเพียงพอแล้ว
Seirddriezel

3
Google ปฏิทินต้องใช้นามสกุล * .ics หากคุณใช้. htaccess คุณสามารถทำได้โดยเพิ่ม RewriteEngine on RewriteRule ^calendar.ics$ my_php_script.php [QSA]
Fanky

19

บันทึกประสบการณ์ส่วนตัวนอกเหนือจากคำตอบของ Stefan Gehrig และคำตอบของ Dave None (และคำตอบของ mmmshuddup):

ฉันมีปัญหาในการตรวจสอบความถูกต้องโดยใช้ทั้ง \ n และ PHP_EOL เมื่อฉันใช้ ICS validator ที่http://severinghaus.org/projects/icv/

ฉันได้เรียนรู้ว่าฉันต้องใช้ \ r \ n เพื่อให้ตรวจสอบถูกต้องดังนั้นนี่คือวิธีแก้ปัญหาของฉัน:

function dateToCal($timestamp) {
  return date('Ymd\Tgis\Z', $timestamp);
}

function escapeString($string) {
  return preg_replace('/([\,;])/','\\\$1', $string);
}    

    $eol = "\r\n";
    $load = "BEGIN:VCALENDAR" . $eol .
    "VERSION:2.0" . $eol .
    "PRODID:-//project/author//NONSGML v1.0//EN" . $eol .
    "CALSCALE:GREGORIAN" . $eol .
    "BEGIN:VEVENT" . $eol .
    "DTEND:" . dateToCal($end) . $eol .
    "UID:" . $id . $eol .
    "DTSTAMP:" . dateToCal(time()) . $eol .
    "DESCRIPTION:" . htmlspecialchars($title) . $eol .
    "URL;VALUE=URI:" . htmlspecialchars($url) . $eol .
    "SUMMARY:" . htmlspecialchars($description) . $eol .
    "DTSTART:" . dateToCal($start) . $eol .
    "END:VEVENT" . $eol .
    "END:VCALENDAR";

    $filename="Event-".$id;

    // Set the headers
    header('Content-type: text/calendar; charset=utf-8');
    header('Content-Disposition: attachment; filename=' . $filename);

    // Dump load
    echo $load;

นั่นหยุดข้อผิดพลาดในการแยกวิเคราะห์ของฉันและทำให้ไฟล์ ICS ของฉันตรวจสอบถูกต้อง


ข้อมูลส่วนหัวเป็นส่วนสำคัญของ FYI สำหรับทุกคนที่กำลังมองหาอนาคต ส่วนใหญ่แล้วแอพและโปรแกรมส่วนใหญ่ไม่ต้องกังวลกับการแบ่ง NewLine ดูเหมือนว่ามีเพียงผู้ตรวจสอบความถูกต้องเท่านั้น แต่สิ่งที่สำคัญที่สุดคือส่วนหัว เราพยายามสักพักโดยไม่มีมันและมีปัญหามากมาย
jfreak53

1
EscapeString มีไว้ทำอะไร? ฉันคิดว่ามันควรจะหนีสิ่งหนึ่งหรือสองสิ่ง แต่ดูเหมือนคุณจะใช้htmlspecialcharsแทน
ลั

1
การแก้ไขด่วน: วันที่ ('Ymd \ THis \ Z', $ timestamp) ควรเป็น H แทน g
Pedro Góes

6

มีแพ็คเกจ eluceo / ical ที่ยอดเยี่ยมที่ช่วยให้คุณสร้างไฟล์ ics ได้อย่างง่ายดาย

นี่คือตัวอย่างการใช้งานจากเอกสาร:

// 1. Create new calendar
$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');

// 2. Create an event
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent->setDtStart(new \DateTime('2012-12-24'));
$vEvent->setDtEnd(new \DateTime('2012-12-24'));
$vEvent->setNoTime(true);
$vEvent->setSummary('Christmas');

// Adding Timezone (optional)
$vEvent->setUseTimezone(true);

// 3. Add event to calendar
$vCalendar->addComponent($vEvent);

// 4. Set headers
header('Content-Type: text/calendar; charset=utf-8');
header('Content-Disposition: attachment; filename="cal.ics"');

// 5. Output
echo $vCalendar->render();


4

http://www.kanzaki.com/docs/ical/มีข้อมูลจำเพาะรุ่นเก่าที่อ่านง่ายกว่าเล็กน้อย ช่วยเป็นจุดเริ่มต้น - หลาย ๆ อย่างยังเหมือนเดิม

นอกจากนี้ในไซต์ของฉันฉันยังมี

  1. รายการทรัพยากรที่มีประโยชน์บางรายการ (ดูแถบด้านข้างล่างขวา) บน
    • ical Spec RFC 5545
    • ทรัพยากรการทดสอบ ical
  2. บันทึกบางส่วนบันทึกไว้เกี่ยวกับการเดินทางของฉัน.icsในช่วงสองสามปีที่ผ่านมา โดยเฉพาะอย่างยิ่งคุณอาจพบว่า'กลโกง' ของเหตุการณ์ที่เกิดขึ้นซ้ำ ๆนี้เป็นประโยชน์

.ics พื้นที่ที่ต้องใช้ความระมัดระวัง:

  • กิจกรรม 'ตลอดทั้งวัน'
  • ประเภทของวันที่ (เขตเวลา UTC หรือ 'ลอยตัว' ในท้องถิ่น) - เพื่อทำความเข้าใจความแตกต่าง
  • ความสามารถในการทำงานร่วมกันของกฎการเกิดซ้ำ

2
  1. รูปแบบ ical ที่แน่นอน: http://www.ietf.org/rfc/rfc2445.txt
  2. ตามข้อมูลจำเพาะจะต้องลงท้ายด้วย. ics

แก้ไข: ที่จริงฉันไม่แน่ใจ - บรรทัด 6186 ให้ตัวอย่างในรูปแบบการตั้งชื่อ. ics แต่ยังระบุว่าคุณสามารถใช้พารามิเตอร์ url ได้ ฉันไม่คิดว่ามันสำคัญตราบใดที่ประเภท MIME ถูกต้อง

แก้ไข: ตัวอย่างจาก wikipedia: http://en.wikipedia.org/wiki/ICalendar

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR

กำหนดค่าประเภท MIME บนเซิร์ฟเวอร์


1
ฉันพยายามอ่านข้อมูลจำเพาะนั้นหลายครั้ง แต่ฉันไม่สามารถสร้างหัวหรือก้อยได้เท่าที่ไฟล์ ical จะเป็นอย่างไร อย่างน้อยคุณช่วยชี้ให้ฉันเห็นบางบรรทัดที่มันเริ่มพูดถึงสิ่งที่ไฟล์. ics ควรมีเท่าส่วนหัวที่จะใส่ประเภท MIME ฯลฯ ได้ไหม
rhodesjason

2

ตรวจสอบให้แน่ใจว่าคุณจัดรูปแบบสตริงเช่นนี้มิฉะนั้นจะไม่ได้ผล

 $content = "BEGIN:VCALENDAR\n".
            "VERSION:2.0\n".
            "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n".
            "BEGIN:VEVENT\n".
            "UID:".uniqid()."\n".
            "DTSTAMP:".$time."\n".
            "DTSTART:".$time."\n".
            "DTEND:".$time."\n".
            "SUMMARY:".$summary."\n".
            "END:VEVENT\n".
            "END:VCALENDAR";

1
มันจะดีกว่าที่จะใช้แทนPHP_EOL "\n"
Yes Barry

4
PHP_EOL เป็นสภาพแวดล้อมเฉพาะสำหรับ end line ดังนั้นใน windows จะมีเอาต์พุต\r\nดังนั้นโปรดจำไว้ว่า!
คริส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.