YARDIM!

3 Cevap php

Ben planlanan fotoğraf çekimleri izler bir tablo ile PHP 5 ve MySQL bir site kurdu. Ben bir iCal dosyası içine bu planlanan "olayların" bir yem dışarı itmek istiyor.

Ben aslında asked this question ve iyi bir cevabı var S. Gehrig. Ben örnek bir iCal dosyası, çalışma ve elle Dreamweaver dosyayı düzeltilmiş zaman Google Takvim'de düzenli olarak güncellenmesi var. Ancak, şimdi ben veritabanından çekerek dinamik PHP ekledim ki, bu iş olmaz.

İşte PHP bulunuyor:

<?php
require_once('../../_includes/initialize.php');

$ical = " BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN ";

$slots = Slot::find_all();
foreach($slots as $slot) {
    $job = Job::find_by_id($slot->job_id);

    $start_stamp = strtotime($slot->start);
    $end_stamp = strtotime($slot->endtime);
    $dtstart = gmdate('Ymd', $start_stamp).'T'. gmdate('His', $start_stamp) . "Z"; // converts to UTC time
    $dtend = gmdate('Ymd', $end_stamp).'T'. gmdate('His', $end_stamp) . "Z"; // converts to UTC time

    $summary = $job->title;

    $ical .= " BEGIN:VEVENT
    UID:" . $slot->id . "@homewoodphoto.jhu.edu
    DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
    DTSTART:" . $dtstart . "
    DTEND:" . $dtend . "
    SUMMARY:" . $summary . "
    END:VEVENT ";
}

$ical .= " END:VCALENDAR";

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

?>

Bu dosyanın çıktısı kadarıyla söyleyebilirim, çalışma var manuel, kodlanmış sürüm tam olarak aynıdır. Bu neden çalışmadığını kimse görebilir miyim??

PS burada çalışıyor dosyasının kodu - Ben sadece benim sunucuda yayınlanan ve Google Takvim'de URL yoluyla abone. Ben 2. olay kodlanmış zaman, kendi üzerinde Google Takvim ile kısa bir süre geldi.

<?php

$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:20090925T170000Z
DTEND:20090928T035959Z
SUMMARY:Bastille Day Party
END:VEVENT

BEGIN:VEVENT
UID:" . md5(uniqid(mt_rand(), true)); . "@yourhost.test
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
DTSTART:20090929T170000Z
DTEND:20090930T035959Z
SUMMARY:Camping Trip
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;

?>

YARDIM!

Bir yorumcu ben başlıklarını kaldırılması ve $ ical VAR yankılanan tarafından testi önerdi. İşte o testin sonuçları size kolaylık sağlamak için eklenen satır sonları ile, şunlardır:

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN 
BEGIN:VEVENT 
UID:21@homewoodphoto.jhu.edu 
DTSTAMP:20090929T212141Z 
DTSTART:20091001T230000Z 
DTEND:20091001T230000Z 
SUMMARY:little title 
END:VEVENT 
BEGIN:VEVENT 
UID:22@homewoodphoto.jhu.edu 
DTSTAMP:20090929T212141Z 
DTSTART:20090926T230000Z 
DTEND:20090927T010000Z 
SUMMARY:A big photo shoot 
END:VEVENT 
BEGIN:VEVENT 
UID:23@homewoodphoto.jhu.edu 
DTSTAMP:20090929T212141Z 
DTSTART:20091003T230000Z 
DTEND:20091004T010000Z 
SUMMARY:A big photo shoot 
END:VEVENT 
END:VCALENDAR

Teşekkürler!

3 Cevap

Muhammed'in yardımı sayesinde, biz bu hataları neden oldu ics dosyasına boşluk ekleyerek girintili kod olduğunu çıkarılabilir. \ N linebreaks kullanmak M'in öneri çalışır, ancak elle isabet linebreaks oluşturmak için girin, ama sonraki satıra girinti olmadan, bunu yapmış gibi görünüyor vermedi. Burada çalışan kod:

<?php
require_once('../../_includes/initialize.php');

$ical = "BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
";

$slots = Slot::find_all();
foreach($slots as $slot) {
$job = Job::find_by_id($slot->job_id);

$start_stamp = strtotime($slot->start);
$end_stamp = strtotime($slot->endtime);
$dtstart = gmdate('Ymd', $start_stamp).'T'. gmdate('His', $start_stamp) . "Z"; // converts to UTC time
$dtend = gmdate('Ymd', $end_stamp).'T'. gmdate('His', $end_stamp) . "Z"; // converts to UTC time

$summary = $job->title;

$ical .= "BEGIN:VEVENT
UID:" . $slot->id . "@homewoodphoto.jhu.edu
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
DTSTART:" . $dtstart . "
DTEND:" . $dtend . "
SUMMARY:" . $summary . "
END:VEVENT
";
}

$ical .= "END:VCALENDAR";

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

Bir arama üzerinden bu rastlamak insanlar için sorun çözüldü nasıl açık olmayabilir. Temelde, iCal şartname çalışması için komut sabit ne olduğu, çizgilerin başında \ r \ satır sonları için n ve hiçbir boşluk gerektirir.

ICal ile çalışırken ben en yararlı olmak için aşağıdaki 3 doğrulayıcılar buldum:

En temel (boşluk özlüyor): http://severinghaus.org/projects/icv/?url=

Bu bir boşluk yakalamak olacaktır: http://icalvalid.cloudapp.net/Default.aspx

Bu bir diğerleri ama neredeyse çok sıkı değildi şeyleri yakalamak olacaktır: http://arnout.engelen.eu/icalendar-validator

Ayrıca, tüm farklı unsurları iyi dokümantasyon: http://www.kanzaki.com/docs/ical/

İlk tahminim dizi doğru doldurulur değil olurdu. Yani bunu test etmek için ben kaldırılması ile başlamak istiyorum

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

ve değişen $ yuvaları = Yuvası :: find_all (); karşı

$slots = Slot::find_all();
print_r($slots);

nesnenin diziniz ayarlanır ediliyor emin olun.

Sonra google göndermeden önce beklendiği gibi çıkışları emin olmak için komut satırından veya tarayıcı ya da çalıştırın.

Beyaz boşluk önlemek için aşağıdaki kodu deneyin:

<?php
require_once('../../_includes/initialize.php');

$ical = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//hacksw/handcal//NONSGML v1.0//EN";

$slots = Slot::find_all();
foreach($slots as $slot) {
    $job = Job::find_by_id($slot->job_id);

    $start_stamp = strtotime($slot->start);
    $end_stamp = strtotime($slot->endtime);
    $dtstart = gmdate('Ymd', $start_stamp).'T'. gmdate('His', $start_stamp) . "Z"; // converts to UTC time
    $dtend = gmdate('Ymd', $end_stamp).'T'. gmdate('His', $end_stamp) . "Z"; // converts to UTC time

    $summary = $job->title;

    $ical .= "BEGIN:VEVENT\n";
    $ical .= "UID:" . $slot->id . "@homewoodphoto.jhu.edu\n";
    $ical .= "DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z\n";
    $ical .= "DTSTART:" . $dtstart . "\n";
    $ical .= "DTEND:" . $dtend . "\n";
    $ical .= "SUMMARY:" . $summary . "\n";
    $ical .= "END:VEVENT\n";
}

$ical .= "\nEND:VCALENDAR";

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

?>