2009-09-23 26 views
96

Bất kỳ tìm kiếm nào của Google trên PHP ical chỉ mang đến phpicalendar và cách phân tích hoặc đọc các tệp IN ical. Tôi chỉ muốn viết một tập tin PHP mà kéo các sự kiện từ cơ sở dữ liệu của tôi và viết chúng ra ở định dạng ical.Tôi làm cách nào để sử dụng PHP để xuất bản động tệp ical được Lịch Google đọc?

Vấn đề của tôi là tôi không thể tìm thấy bất cứ nơi nào mà sẽ trả lời hai câu hỏi sau:

  1. các chính xác định dạng ical, bao gồm tiêu đề, định dạng tập tin, footers, vv là gì? Nói cách khác, những gì hiện các tập tin phải có, chính xác, để được đọc đúng trong Lịch Google, vv?
  2. Nếu tôi xây dựng tệp này bằng phần mở rộng .php, làm thế nào để xuất bản nó dưới dạng ical? Tôi có phải ghi vào một tệp .ics mới không? Hoặc Lịch Google, v.v. có đọc tệp .php như ical miễn là nội dung ở định dạng chính xác không? (Giống như tệp style.css.php sẽ được đọc dưới dạng tệp CSS nếu nội dung thực sự là CSS, v.v.)

Bất kỳ trợ giúp nào bạn có thể đưa ra hoặc chỉ cho tôi sẽ được đánh giá cao !!!

Trả lời

117

Điều này sẽ rất đơn giản nếu Lịch Google không yêu cầu *.ics -extension (yêu cầu một số URL viết lại trong máy chủ).

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

Đó là về cơ bản tất cả các bạn cần phải thực hiện một khách hàng nghĩ rằng bạn đang phục vụ một tệp iCalendar, mặc dù có thể có một số vấn đề liên quan đến bộ nhớ đệm, mã hóa văn bản và vân vân. Nhưng bạn có thể bắt đầu thử nghiệm với mã đơn giản này.

+1

Cảm ơn. Tôi nghĩ những tiêu đề đó là những gì tôi đã bỏ lỡ. Tôi cho rằng có một vài bước cuối cùng để làm cho Lịch Google này sẵn sàng, như khi tôi cố gắng cấp tệp này lên Lịch Google qua URL, nó cho biết "Nhập lịch từ url ..." nhưng bị treo vĩnh viễn. Có thể đó là một câu hỏi khác để đăng? – rhodesjason

+0

Bạn đã thử truy cập tập lệnh từ trình duyệt của mình chưa? Nó có nhắc bạn tải xuống "caneldar.ics" không? Bạn có thể nhập tệp vào iCal hoặc Outlook chẳng hạn? –

+0

Có nó hoạt động tốt ở đó, và Entourage tải nó lên tốt là tốt. Tôi chỉ cần khả năng tạo một tệp mà Lịch Google (GC) sẽ ping lặp đi lặp lại để làm mới, sao cho nó luôn được cập nhật với lịch sự kiện trong cơ sở dữ liệu của tôi. Ngay bây giờ, GC sẽ không chấp nhận nó. – rhodesjason

2
  1. chính xác định dạng ical: http://www.ietf.org/rfc/rfc2445.txt
  2. Theo spec, nó phải kết thúc trong .ics

Edit: thực sự tôi không chắc chắn - dòng 6186 đưa ra một ví dụ trong .ics đặt tên định dạng, nhưng nó cũng cho biết bạn có thể sử dụng các tham số url. Tôi không nghĩ rằng nó quan trọng, miễn là loại MIME là chính xác.

Chỉnh sửa: Ví dụ từ 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 

kiểu MIME được cấu hình trên máy chủ.

+0

Tôi đã cố gắng để đọc thông số này nhiều lần nhưng tôi không thể làm cho người đứng đầu hoặc đuôi của nó như xa như những gì các tập tin ical sẽ trông như thế nào. Bạn có thể ít nhất chỉ cho tôi một số dòng nơi nó bắt đầu thực sự nói về những gì các tập tin .ics nên chứa như xa như tiêu đề, nơi để đặt các loại MIME, vv? – rhodesjason

+1

Chắc chắn, xem ở trên. – lod3n

4

http://www.kanzaki.com/docs/ical/ có phiên bản cũ hơn có thể đọc được của thông số kỹ thuật cũ hơn. Nó giúp làm điểm khởi đầu - nhiều thứ vẫn như cũ.

Cũng trong ngày my site, tôi có

  1. Một số danh sách các tài nguyên hữu ích (xem phía dưới bên phải) trên
    • ical Spec RFC 5545
    • ical Testing Tài
  2. Some notes ghi trên hành trình của tôi làm việc với .ics trong vài năm qua. Đặc biệt, bạn có thể thấy điều này repeating events 'cheatsheet' là hữu ích.

.ics khu vực cần xử lý cẩn thận:

  • 'cả ngày' sự kiện
  • loại ngày (múi giờ, UTC, hoặc địa phương 'nổi') - nb để hiểu sự khác biệt
  • khả năng tương tác các quy tắc lặp lại
2

Đảm bảo bạn định dạng chuỗi như thế này hoặc nó sẽ không hoạt động

$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

tốt hơn nên sử dụng' PHP_EOL' thay vì '" \ n "'. –

+3

PHP_EOL là môi trường đặc trưng cho các dòng kết thúc, vì vậy trong các cửa sổ nó sẽ xuất ra '\ r \ n' vì vậy hãy ghi nhớ điều đó! – Chris

15

Một lưu ý của kinh nghiệm cá nhân, thêm vào cả Stefan Gehrig của câu trả lời và Không của Dave câu trả lời (và trả lời mmmshuddup của):

Tôi đã gặp vấn đề xác nhận sử dụng cả hai \ n và PHP_EOL khi tôi sử dụng các validator ICS tại http://severinghaus.org/projects/icv/

tôi đã học tôi đã phải sử dụng \ r \ n để có được nó để xác nhận đúng, vì vậy đây là giải pháp của tôi:

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; 

đó dừng lại lỗi phân tích cú pháp của tôi và m ade các tập tin ICS của tôi xác nhận hợp lệ.

+0

Thông tin tiêu đề là phần quan trọng của FYI đối với bất kỳ ai tìm kiếm trong tương lai. Đối với hầu hết các phần, hầu hết các ứng dụng và chương trình đều không lo lắng về các ngắt dòng NewLine. Chỉ có những người xác nhận có vẻ như vậy. Nhưng điều quan trọng nhất là phần tiêu đề. Chúng tôi đã thử một lúc mà không có nó và gặp nhiều vấn đề. – jfreak53

+1

escapeString là gì? Tôi giả sử nó nên thoát khỏi một hoặc hai điều nhưng bạn dường như sử dụng 'htmlspecialchars' cho rằng thay vào đó. – Luc

+0

Khắc phục nhanh: ngày ('Ymd \ THis \ Z', $ dấu thời gian). Phải là chữ H thay vì g. –

4

Có gói xuất sắc eluceo/ical cho phép bạn dễ dàng tạo tệp ics.

Đây là một cách sử dụng ví dụ từ tài liệu:

// 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(); 
Các vấn đề liên quan