मैं Google कैलेंडर द्वारा पढ़ने के लिए एक ical फ़ाइल को गतिशील रूप से प्रकाशित करने के लिए PHP का उपयोग कैसे कर सकता हूं?




calendar icalendar (5)

PHP ical पर कोई भी Google खोज केवल phpicalendar लाता है और इनिकल फ़ाइलों को पार्स या पढ़ने के लिए कैसे लाता है। मैं सिर्फ एक PHP फ़ाइल लिखना चाहता हूं जो मेरे डेटाबेस से ईवेंट खींचती है और उन्हें ical प्रारूप में लिखती है।

मेरी समस्या यह है कि मुझे कहीं भी नहीं मिल रहा है जो दो सवालों का जवाब देगा:

  1. हेडर, फ़ाइल प्रारूप, पाद लेख इत्यादि सहित सटीक ical प्रारूप क्या है? दूसरे शब्दों में, फ़ाइल को Google कैलेंडर, आदि द्वारा ठीक से पढ़ने के लिए, वास्तव में क्या होना चाहिए?
  2. अगर मैं .php एक्सटेंशन का उपयोग करके इस फ़ाइल को बनाता हूं, तो मैं इसे ical के रूप में कैसे प्रकाशित करूं? क्या मुझे एक नई .ics फ़ाइल में लिखना है? या Google कैलेंडर इत्यादि एक .php फ़ाइल को ical के रूप में तब तक पढ़ेगा जब तक कि सामग्री सही प्रारूप में न हो? (एक style.css.php फ़ाइल की तरह एक सीएसएस फ़ाइल के रूप में पढ़ा जाएगा यदि सामग्री वास्तव में सीएसएस हैं, आदि)

कोई भी मदद जो आप सभी दे सकते हैं या मुझे इंगित कर सकते हैं उसकी सराहना की जाएगी !!!

https://code.i-harness.com


  1. सटीक ical प्रारूप: http://www.ietf.org/rfc/rfc2445.txt
  2. कल्पना के अनुसार, इसे .ics में समाप्त होना है

संपादित करें: असल में मुझे यकीन नहीं है - लाइन 6186 .ics नामकरण प्रारूप में एक उदाहरण देता है, लेकिन यह भी कहता है कि आप यूआरएल पैरामीटर का उपयोग कर सकते हैं। मुझे नहीं लगता कि यह महत्वपूर्ण है, जब तक कि एमआईएमई प्रकार सही है।

संपादित करें: विकिपीडिया से उदाहरण: 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

एमआईएमई प्रकार सर्वर पर कॉन्फ़िगर किया गया है।


एक उत्कृष्ट 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();

सुनिश्चित करें कि आप इस तरह की स्ट्रिंग को प्रारूपित करते हैं या यह काम नहीं करेगा

 $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";

स्टीफन गेह्रिग के उत्तर और डेव नोएल के उत्तर (और mmmshuddup के उत्तर) दोनों के अलावा व्यक्तिगत अनुभव का एक नोट:

जब मैंने आईसीएस सत्यापनकर्ता का उपयोग http://severinghaus.org/projects/icv/ पर किया था, तो मुझे दोनों \ n और PHP_EOL का उपयोग करके सत्यापन समस्याएं थीं।

मैंने सीखा कि इसे ठीक से सत्यापित करने के लिए \ 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;

इसने मेरी पार्स त्रुटियों को रोक दिया और मेरी आईसीएस फाइलों को सही तरीके से मान्य किया।


यह बहुत आसान होना चाहिए यदि Google कैलेंडर को *.ics -extension की आवश्यकता नहीं है (जिसके लिए सर्वर में कुछ यूआरएल पुनर्लेखन की आवश्यकता होगी)।

$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 फ़ाइल की सेवा कर रहे हैं, भले ही कैशिंग, टेक्स्ट एन्कोडिंग आदि के बारे में कुछ समस्याएं हो। लेकिन आप इस सरल कोड के साथ प्रयोग करना शुरू कर सकते हैं।





icalendar