phpfui / icalendar
icalendar.org PHP实现rfc5545的现代分支,用于管理iCal格式文件
Requires
- php: >=7.4 <8.4
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.3
- phpfui/phpunit-syntax-coverage: ^1.0
- phpstan/phpstan: ^1.8
- phpunit/phpunit: <11.0
README
是Zap Calendar iCalendar Library的7.4命名空间分支的现代分支
Zap Calendar iCalendar Library是一个支持iCalendar (RFC 5545)标准的PHP库。
此PHP库用于读取和写入iCalendar格式的馈送和文件。库的功能包括
- 支持读取和写入iCalendar文件
- 基于对象创建和操作iCalendar文件
- 支持将RRULE扩展为重复日期列表
- 支持将时区信息添加到iCalendar文件
所有iCalendar数据都存储在PHP对象树中。这允许在不要求专门的库函数调用的情况下向iCalendar馈送添加任何属性。权力伴随着责任。缺少或无效的属性可能导致生成的iCalendar文件无效。请访问iCalendar.org查看有效属性并使用站点的iCalendar验证工具测试您的馈送。
库API文档可在http://icalendar.org/zapcallibdocs和PHPFUI/ICalendarOrg找到
请参阅示例文件夹中的读取和写入iCalendar文件的程序。最好将示例文件包含到具有活动自动加载器的文件中,或包含所有类以直接运行示例。
使用ZCiCal对象创建ical对象
$icalobj = new \ICalendarOrg\ZCiCal();
添加事件对象
$eventobj = new \ICalendarOrg\ZCiCalNode("VEVENT", $icalobj->curnode);
将开始日期和结束日期添加到事件中
// add start date $eventobj->addNode(new \ICalendarOrg\ZCiCalDataNode("DTSTART:" . \ICalendarOrg\ZDateHelper::fromSqlDateTime("2020-01-01 12:00:00"))); // add end date $eventobj->addNode(new \ICalendarOrg\ZCiCalDataNode("DTEND:" . \ICalendarOrg\ZDateHelper::fromSqlDateTime("2020-01-01 13:00:00")));
使用export()函数调用以iCalendar格式写入对象
echo $icalobj->export();
此示例将不会验证,因为它缺少一些必需的元素。请查看simpleevent.php示例以了解验证的iCalendar文件所需的最小元素数量。
要创建多事件iCalendar文件,只需创建多个事件对象。例如
$icalobj = new \ICalendarOrg\ZCiCal(); $eventobj1 = new \ICalendarOrg\ZCiCalNode("VEVENT", $icalobj->curnode); $eventobj1->addNode(new \ICalendarOrg\ZCiCalDataNode("SUMMARY:Event 1")); ... $eventobj2 = new \ICalendarOrg\ZCiCalNode("VEVENT", $icalobj->curnode); $eventobj2->addNode(new \ICalendarOrg\ZCiCalDataNode("SUMMARY:Event 2")); ...
要读取现有的iCalendar文件/馈送,请使用表示iCalendar文件内容的字符串创建ZCiCal对象
$icalobj = new \ICalendarOrg\ZCiCal($icalstring);
大型iCalendar文件可以分块读取,以减少在内存中存储iCalendar馈送所需的内存量。此示例一次读取500个事件
$icalobj = null; $eventcount = 0; $maxevents = 500; do { $icalobj = new \ICalendarOrg\ZCiCal($icalstring, $maxevents, $eventcount); ... $eventcount += $maxevents; } while($icalobj->countEvents() >= $eventcount);
您可以使用这种方式从导入的(或创建的)iCalendar对象中读取事件
foreach($icalobj->tree->child as $node) { if($node->getName() == "VEVENT") { foreach($node->data as $key => $value) { if($key == "SUMMARY") { echo "event title: " . $value->getValues() . "\n"; } } } }
已知限制
- 由于库利用对象来读取和写入iCalendar数据,因此iCalendar数据的尺寸限制为机器上可用的内存量。ZCiCal()对象支持读取事件范围以最小化内存空间。
- 库在导入文件时忽略时区信息,而是利用PHP的时区库进行计算(导出文件时支持时区)。导入的时区需要别名到PHP支持的时区。
- 目前,库不支持RRULE项中的"BYSETPOS"选项。