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


106

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

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

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

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

जवाबों:


128

यह बहुत सरल होना चाहिए अगर 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 कैलेंडर को तैयार करने में कुछ अंतिम चरण हैं, जब मैं इस फ़ाइल को URL के माध्यम से Google कैलेंडर को खिलाने का प्रयास करता हूं, तो यह कहता है कि "url से कैलेंडर आयात कर रहा है ..." लेकिन उस पर हमेशा के लिए हैंग हो जाता है। शायद यह पोस्ट करने के लिए एक अलग सवाल है?
रोडजसोन

3
बिल्कुल सही। मैंने ऊपर दिए गए उदाहरण को अपडेट किया - और मैंने एक DTSTAMP गुण भी जोड़ा, जो एक क्लाइंट को बताएगा कि घटनाओं को कब अपडेट किया गया है।
स्टीफन गेहरिग

1
ठीक है गेह्रिग, तुम एक प्रतिभाशाली हो। वह काम किया। धन्यवाद। (अब तक मैं बता सकता हूं कि Google कैलेंडर लगभग तुरंत अपडेट कर रहा है, भी।)
rhodesjason

3
अगर मै गलत नहीं हूँ। यदि कोई ईवेंट हटा दिया जाता है, तो प्रोग्राम यूआईडी का उपयोग करते हैं। अगर एक php-script हमेशा एक और UID (-> mt_rand) उत्पन्न करती है, तो प्रोग्राम हमेशा सोचेंगे कि पूरी सामग्री बदल गई है। सब कुछ गायब हो गया और सब कुछ नया है। व्यक्तिगत रूप से मैं उसी यूआईडी से चिपके रहूंगा यदि इवेंट डेटाबेस में समान है और सिर्फ रिकॉर्डआईडी (और कुछ होस्ट जानकारी) का उपयोग करें। कुछ बदल गया है दिखाने के लिए DTSTAMP है। इतना काफी होना चाहिए।
सेर्ड्रेड्रीज़ेल

3
Google कैलेंडर को * .ics- एक्सटेंशन की आवश्यकता होती है। यदि आप .htaccess का उपयोग कर रहे हैं, तो आप इसे जोड़ सकते हैं RewriteEngine on RewriteRule ^calendar.ics$ my_php_script.php [QSA]
Fanky

19

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

जब मैं http://severinghaus.org/projects/icv/ पर ICS सत्यापनकर्ता का उपयोग करता था, तो मुझे \ 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;

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


हेडर की जानकारी भविष्य में किसी को भी देखने के लिए महत्वपूर्ण भाग FYI है। अधिकांश भाग के लिए अधिकांश एप्लिकेशन और प्रोग्राम न्यूलाइन ब्रेक के बारे में चिंता नहीं करते हैं। केवल सत्यापनकर्ता ऐसा करते हैं। लेकिन सबसे महत्वपूर्ण बात है हेडर वाला हिस्सा। हमने इसके बिना थोड़ी देर के लिए प्रयास किया और कई समस्याएं हो रही थीं।
jfreak53

1
भागने के लिए क्या है? मैंने मान लिया कि इसे एक या दो से बचना चाहिए लेकिन आप htmlspecialcharsइसके बजाय इसका उपयोग करने लगते हैं ।
ल्यूक

1
एक त्वरित फिक्स: दिनांक ('Ymd \ THis \ Z', $ टाइमस्टैम्प)। जी के बजाय एक एच होना चाहिए।
पेड्रो गोज

6

एक उत्कृष्ट इलायसो / 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 स्पेस आरएफसी 5545
    • ical परीक्षण संसाधन
  2. .icsपिछले कुछ वर्षों के साथ काम करते हुए मेरी यात्रा पर कुछ नोट्स रिकॉर्ड किए गए । विशेष रूप से, आप इस दोहराई जाने वाली घटनाओं को उपयोगी मान सकते हैं ।

.ics वे क्षेत्र जिन्हें सावधानीपूर्वक निपटने की आवश्यकता है:

  • । पूरे दिन की घटनाएँ ’
  • तारीखों के प्रकार (टाइमज़ोन, यूटीसी, या स्थानीय 'फ्लोटिंग') - एनबी को भेद समझने के लिए
  • पुनरावृत्ति नियमों की अंतर

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

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

संपादित करें: विकिपीडिया से उदाहरण: 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 प्रकार, आदि कहाँ रखें?
रोड्सजसन

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"
हाँ बैरी

4
PHP_EOL अंतिम पंक्तियों के लिए पर्यावरण विशिष्ट है, इसलिए विंडोज़ में यह आउटपुट देगा \r\nइसलिए इसे ध्यान में रखें!
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.