Google Takvim tarafından okunacak bir ical dosyasını dinamik olarak yayınlamak için PHP'yi nasıl kullanabilirim?


107

PHP ical üzerindeki herhangi bir Google araması sadece phpicalendar'ı ve IN ical dosyalarının nasıl ayrıştırılacağını veya okunacağını getirir. Veritabanımdan olayları çeken ve bunları ical formatında yazan bir PHP dosyası yazmak istiyorum.

Benim sorunum, iki soruyu cevaplayacak hiçbir yer bulamıyorum:

  1. Başlıklar, dosya biçimi, altbilgiler vb. Dahil olmak üzere tam ical biçimi nedir ? Diğer bir deyişle, dosyanın Google Takvim vb. Tarafından düzgün bir şekilde okunabilmesi için tam olarak neye sahip olması gerekir?
  2. Bu dosyayı .php uzantısı kullanarak oluşturursam, ical olarak nasıl yayınlayabilirim? Yeni bir .ics dosyasına yazmam gerekiyor mu? Veya Google Takvim vb. İçerik doğru biçimde olduğu sürece bir .php dosyasını ical olarak okuyacak mı? (Bir style.css.php dosyası gibi, içeriği gerçekten CSS ise, bir CSS dosyası olarak okunacaktır.)

Hepinizin verebileceği veya bana gösterebileceği herhangi bir yardım çok takdir edilecektir !!!

Yanıtlar:


129

Google Takvim, *.ics-uzantı gerektirmiyorsa bu çok basit olmalıdır (bu, sunucuda bazı URL'lerin yeniden yazılmasını gerektirir).

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

Önbelleğe alma, metin kodlama vb. İle ilgili bazı sorunlar olsa bile, bir müşterinin bir iCalendar dosyası sunduğunuzu düşünmesini sağlamak için ihtiyacınız olan tek şey budur. Ancak bu basit kodu denemeye başlayabilirsiniz.


1
Teşekkürler. Sanırım eksik olan şey bu başlıklar. Bu dosyayı Google Takvim'e URL aracılığıyla beslemeye çalıştığımda, "url'den takvim içe aktarılıyor ..." diyor, ancak bu sonsuza kadar takılı kalıyor. Belki bu gönderilecek farklı bir sorudur?
rhodesjason

3
Kesinlikle. Yukarıdaki örneği güncelledim ve ayrıca olayların ne zaman güncellendiğini bir istemciye bildirecek bir DTSTAMP özelliği ekledim.
Stefan Gehrig

1
Tamam Gehrig, sen bir dahisin. İşe yaradı. Teşekkürler. (Anladığım kadarıyla Google Takvim de neredeyse anında güncelleniyor.)
rhodesjason

3
Eğer yanılmıyorsam. Programlar, bir olayın silinip silinmediğini görmek için UID'yi kullanır. Bir php-script her zaman başka bir UID (-> mt_rand) üretirse, programlar her zaman tüm içeriğin değiştiğini düşünecektir. Her şey kayboldu ve her şey yeni. Kişisel olarak, olay veritabanında aynıysa ve yalnızca kayıt kimliğini (ve bazı ana bilgisayar bilgilerini) kullanıyorsa aynı UID'ye bağlı kalırım. DTSTAMP bir şeyin değiştiğini göstermek için oradadır. O kadarı yeterli olacaktır.
Seirddriezel

3
Google takvimi * .ics-uzantısını GEREKTİRİR. .Htaccess kullanıyorsanız, ekleyerek yapabilirsiniz RewriteEngine on RewriteRule ^calendar.ics$ my_php_script.php [QSA]
Fanky

19

Hem Stefan Gehrig'in cevabına hem de Dave None'ın cevabına (ve mmmshuddup'ın cevabına) ek olarak kişisel deneyim notu:

Http://severinghaus.org/projects/icv/ adresinde ICS doğrulayıcıyı kullandığımda \ n ve PHP_EOL kullanarak doğrulama sorunları yaşıyordum

Doğru şekilde doğrulamak için \ r \ n kullanmam gerektiğini öğrendim, bu yüzden bu benim çözümümdü:

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;

Bu, ayrıştırma hatalarımı durdurdu ve ICS dosyalarımın düzgün şekilde doğrulanmasını sağladı.


Başlık bilgileri, geleceğe bakan herkes için FYI'nin önemli bir parçasıdır. Çoğunlukla çoğu uygulama ve program NewLine kesintileri için endişelenmez. Sadece doğrulayıcılar öyle görünüyor. Ancak en önemli şey başlık kısmıdır. Bir süre onsuz denedik ve birçok sorun yaşıyorduk.
jfreak53

1
EscapeString ne için? Bir veya iki şeyden kaçması gerektiğini varsaydım ama htmlspecialcharsbunun yerine kullanıyorsun.
Luc

1
Hızlı bir düzeltme: tarih ('Ymd \ THis \ Z', $ timestamp). G yerine H olmalıdır.
Pedro Góes

6

Kolayca ics dosyaları oluşturmanıza izin veren mükemmel bir eluceo / ical paketi var.

Dokümanlardan örnek bir kullanım:

// 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/ , eski spesifikasyonun biraz daha okunabilir bir versiyonuna sahiptir. Başlangıç ​​noktası olarak yardımcı olur - birçok şey hala aynıdır.

Ayrıca sitemde var

  1. Kullanışlı kaynakların bazı listeleri (sağ alttaki kenar çubuğuna bakın)
    • ical Spec RFC 5545
    • ical Test Kaynakları
  2. .icsSon birkaç yıldır birlikte çalıştığım yolculuğum hakkında bazı notlar kaydedildi . Özellikle, bu yinelenen olayların 'hile sayfasını' faydalı bulabilirsiniz.

.ics dikkatli kullanılması gereken alanlar:

  • "tüm gün" etkinlikleri
  • tarih türleri (saat dilimi, UTC veya yerel 'değişken') - farkı anlamak için nb
  • tekrarlama kurallarının birlikte çalışabilirliği

2
  1. Tam ical biçimi: http://www.ietf.org/rfc/rfc2445.txt
  2. Spesifikasyona göre, .ics ile bitmesi gerekiyor.

Düzenleme: aslında emin değilim - satır 6186 .ics adlandırma biçiminde bir örnek verir, ancak aynı zamanda url parametrelerini kullanabileceğinizi de belirtir. MIME türü doğru olduğu sürece önemli olduğunu sanmıyorum.

Düzenle: Wikipedia'dan örnek: 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 türü sunucuda yapılandırılır.


1
Bu özelliği birçok kez okumaya çalıştım, ancak ical dosyasının nasıl görüneceği konusunda kafa yormam. En azından, başlık kadar .ics dosyasının ne içermesi gerektiği, MIME türünün nereye koyulacağı vb. Hakkında konuşmaya başladığı bazı satırlara işaret edebilir misiniz?
rhodesjason

2

Dizeyi bu şekilde biçimlendirdiğinizden emin olun, yoksa işe yaramaz

 $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_EOLyerine kullanmak daha iyidir "\n".
Evet Barry

4
PHP_EOL, bitiş satırları için ortama özgüdür, bu nedenle Windows'ta çıktı verecektir, bu nedenle bunu \r\naklınızda bulundurun!
Chris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.