TimeTrex/vendor/kigkonsult/icalcreator/docs/using.html

11646 lines
428 KiB
HTML

<!DOCTYPE html>
<!--
iCalcreator, the PHP class package managing iCal (rfc2445/rfc5545) calendar information.
This file is a part of iCalcreator.
author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
copyright 2007-2022 Kjell-Inge Gustafsson, kigkonsult, All rights reserved
link https://kigkonsult.se
license Subject matter of licence is the software iCalcreator.
The above copyright, link, package and version notices,
this licence notice and the invariant [rfc5545] PRODID result use
as implemented and invoked in iCalcreator shall be included in
all copies or substantial portions of the iCalcreator.
iCalcreator is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
iCalcreator is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with iCalcreator. If not, see <https://www.gnu.org/licenses/>.
-->
<html lang="en">
<head>
<title>iCalcreator 2.41.70 manual</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="author" content="Kjell-Inge Gustafsson, kigkonsult, All rights reserved">
<meta name="copyright" content="2007-2022 Kjell-Inge Gustafsson, kigkonsult">
<meta name="keywords" content="ical, calendar, calender, xcal, xml, icalender, rfc2445, rfc5545, vcalender, php, create">
<meta name="description" content="using iCalcreator v2.41.70">
<style>
* {
FONT-FAMILY : "Bitstream Vera Sans", Helvetica, "Lucida Grande","Lucida Sans Unicode", Lucida, Arial, Geneva, sans-serif;
BACKGROUND-COLOR: white;
COLOR : black;
FONT-SIZE : small;
}
body {
MARGIN-LEFT : 10px;
WIDTH : 750px;
}
a.ref {
BACKGROUND-COLOR: inherit;
FONT-SIZE : 8pt;
LETTER-SPACING : 0.1em;
}
h1 {
BACKGROUND-COLOR: silver;
BORDER : thin solid black;
FONT-SIZE : x-large;
FONT-WEIGHT : bold;
DISPLAY : block;
}
h2 {
FONT-SIZE : large;
}
h3 {
FONT-SIZE : medium;
}
h4 {
FONT-SIZE : small;
FONT-WEIGHT : bold;
}
h5 {
FONT-SIZE : small;
FONT-WEIGHT : normal;
TEXT-DECORATION : underline;
}
table {
border-collapse : collapse;
width : 100%;
}
.bb {
BORDER-BOTTOM : gray dotted thin;
}
.bl {
BORDER-LEFT : gray dotted thin;
}
.center {
TEXT-ALIGN : center;
}
p.comment {
FONT-FAMILY : monospace;
FONT-SIZE : 9pt;
FONT-WEIGHT : 500;
WHITE-SPACE : pre-wrap; /* css-3 */
WHITE-SPACE : -moz-pre-wrap; /* Mozilla, since 1999 */
WHITE-SPACE : -o-pre-wrap; /* Opera 7 */
}
span.comment {
BACKGROUND-COLOR: transparent;
FONT-FAMILY : Areal, sans-serif;
FONT-SIZE : 8pt;
LETTER-SPACING : 0.2em;
}
p.example {
BACKGROUND-COLOR: #DCDCDC;
font-family : monospace;
FONT-SIZE : 9pt;
LETTER-SPACING : 0.1em;
LINE-HEIGHT : 1.5em;
WHITE-SPACE : pre-wrap; /* css-3 */
WHITE-SPACE : -moz-pre-wrap; /* Mozilla, since 1999 */
WHITE-SPACE : -o-pre-wrap; /* Opera 7 */
}
p.format, span.format {
BORDER : gray dotted thin;
FONT-FAMILY : Helvetica, sans-serif;
FONT-SIZE : 9pt;
LETTER-SPACING : 0.2em;
LINE-HEIGHT : 2em;
WHITE-SPACE : pre-wrap; /* css-3 */
WHITE-SPACE : -moz-pre-wrap; /* Mozilla, since 1999 */
WHITE-SPACE : -o-pre-wrap; /* Opera 7 */
}
.header {
BACKGROUND-COLOR: silver;
BORDER : thin solid black;
FONT-SIZE : xx-large;
}
p.label {
FONT-FAMILY : Arial, sans-serif;
FONT-WEIGHT : bold;
LETTER-SPACING : 0.1em;
}
p.quotes {
BACKGROUND-COLOR: #F5F5F5;
FONT-FAMILY : Arial, sans-serif;
FONT-STYLE : italic;
LETTER-SPACING : 0.1em;
}
sup {
BACKGROUND-COLOR: transparent;
FONT-SIZE : x-small;
FONT-WEIGHT : bold;
VERTICAL-ALIGN : super;
}
.ref {
BACKGROUND-COLOR: transparent;
FONT-SIZE : 8pt;
LETTER-SPACING : 0.1em;
}
.top {
VERTICAL-ALIGN : top;
}
</style>
</head>
<body>
<a id="top"></a>
<p class="header">iCalcreator v2.41.70</p>
<p>
iCalcreator v2.41.70<br>
Copyright &copy; 2007-2022 Kjell-Inge Gustafsson, kigkonsult, All rights reserved.<br>
<a href="#Copyright_and_Licence">Copyright_and_Licence</a><br>
<a href="https://kigkonsult.se" title="kigkonsult.se" target="_blank">kigkonsult.se</a><br>
Contact iCal_at_kigkonsult_dot_se
</p>
<h2>Preface</h2>
<p>
This document describes usage of iCalcreator, the <em>PHP</em> software implementation of standards
<a href="https://tools.ietf.org/html/rfc5545" title="Download rfc5545" target="_blank">rfc5545</a>/
<a href="https://tools.ietf.org/html/rfc5546" title="Download rfc5546" target="_blank">rfc5546</a>/
<a href="https://tools.ietf.org/html/rfc5870" title="Download rfc5870" target="_blank">rfc5870</a>/
<a href="https://tools.ietf.org/html/rfc6321" title="Download rfc6321" target="_blank">rfc6321</a>/
<a href="https://tools.ietf.org/html/rfc6868" title="Download rfc6868" target="_blank">rfc6868</a>/
<a href="https://tools.ietf.org/html/rfc7529" title="Download rfc7529" target="_blank">rfc7529</a>/
<a href="https://tools.ietf.org/html/rfc7808" title="Download rfc7808" target="_blank">rfc7808</a>/
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>/
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>/
<a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank"> rfc9074</a>
and other IETF rfc documents to manage calendar information.
The fc5545/rfc5546 obsoletes rfc2445/rfc2446.
</p>
<p>
This document is provided by kigkonsult for informational purposes
and is provided on an &quot;as is&quot; basis without any warranties expressed or implied.
</p>
<p>
Information in this document is subject to change without notice and does
not represent a commitment on the part of kigkonsult.
The software described in this document is provided under a <a href="#Copyright_and_Licence">license agreement</a>.
The software may be used only in accordance with the terms of that <a href="#Copyright_and_Licence">license agreement</a>.
It is against the law to copy or use the software except as specifically allowed in the <a href="#Copyright_and_Licence">license agreement</a>.
</p>
<p>
It is the users responsibility to ensure the suitability of the software before using it.
In no circumstances will kigkonsult be responsible for
the use of the software's outcomes or results or any loss
or damage of data or programs as a result of using the software.
</p>
<p>
The use of the software implies acceptance of these terms and the <a href="#Copyright_and_Licence">license</a>.
</p>
<p>
This document makes previous versions obsolete.
</p>
<a href="#INDEX">[index]</a>
<a id="INTRO"></a><h1>1 INTRO</h1>
<p>
iCalcreator is the <em>PHP</em> class package managing iCal calendar information,
supporting (non-)calendar
systems and applications to process and communicate calendar information like
events, agendas, tasks, reports, totos and journaling information.
</p>
<p>
iCalcreator features create, parse, edit and select <strong>calendar</strong> and <strong>calendar</strong> components.
</p>
<p>
For iCalcreator 2.40 version (and later), <em>PHP</em> version &gt;= 8.0 is required,
version v2.39 <em>PHP</em>7+.
To support the development, maintenance and test process
<a href="https://github.com/PHPCompatibility/PHPCompatibility" title="PHPCompatibility">PHPCompatibility</a>,
<a href="https://github.com/phpstan/phpstan" title="PHPStan">PHPStan</a>
and
<a href="https://github.com/DeGraciaMathieu/php-arguments-detector" title="php-arguments-detector">php-arguments-detector</a>
are included.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="Standards"></a><h2>1.1 Standards</h2>
<h4>iCal</h4>
<p>
A short iCal description is found at <a href="https://en.wikipedia.org/wiki/ICalendar" title="iCalendar From Wikipedia, the free encyclopedia" target="_blank">Wikipedia</a>.
If You are not familiar with iCal, read this first!
</p>
<a id="IETF_rfc"></a>
<p>
The <strong>iCalendar</strong> format, <strong>iCal</strong>, are described in
</p>
<dl>
<dt><a href="https://tools.ietf.org/html/rfc5545" title="Download rfc5545" target="_blank">rfc5545</a></dt>
<dd>quot;Internet Calendaring and Scheduling Core Object Specification (<strong>iCalendar</strong>)&quot;quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc5546" title="Download rfc5546" target="_blank">rfc5546</a></dt>
<dd>&quot;iCalendar Transport-Independent Interoperability Protocol (iTIP)&quot;<br>Scheduling Events, BusyTime, To-dos and Journal Entries
<p class="quotes">. ..allows for the capture and exchange of information normally stored
within a calendaring and scheduling application.</p>
and
<p class="quotes">. ..is an exchange format between applications or systems.</p>
</dd>
<dt><a href="https://tools.ietf.org/html/rfc5870" title="Download rfc5870" target="_blank">rfc5870</a></dt>
<dd>&quot;A Uniform Resource Identifier for Geographic Locations (geo URI)&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc6321" title="Download rfc6321" target="_blank">rfc6321</a></dt>
<dd>&quot;xCal: The XML Format for iCalendar&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc6868" title="Download rfc6868" target="_blank">rfc6868</a></dt>
<dd>&quot;Parameter Value Encoding in iCalendar and vCard&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc7529" title="Download rfc7529" target="_blank">rfc7529</a></dt>
<dd>&quot;Non-Gregorian Recurrence Rules in the Internet Calendaring and Scheduling Core Object Specification (iCalendar)&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc7808" title="Download rfc7808" target="_blank">rfc7808</a></dt>
<dd>&quot;Time Zone Data Distribution Service&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a></dt>
<dd>&quot;Calendar Availability&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a></dt>
<dd>&quot;New Properties for iCalendar&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a></dt>
<dd>&quot;Event Publishing Extensions to iCalendar&quot;</dd>
<dt><a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank"> rfc9074</a></dt>
<dd>&quot;VALARM Extensions for iCalendar&quot;</dd>
</dl>
<p>
<a href="https://tools.ietf.org/html/rfc5545" title="Download rfc5545" target="_blank">rfc5545</a> and
<a href="https://tools.ietf.org/html/rfc5546" title="Download rfc5546" target="_blank">rfc5546</a>
obsoletes, respectively,
<a href="https://tools.ietf.org/html/rfc2445" title="Download rfc2445" target="_blank">rfc2445</a> and
<a href="https://tools.ietf.org/html/rfc2446" title="Download rfc2446" target="_blank">rfc2446</a>.
</p>
<p>
For <a href="https://www.ietf.org/" target="_blank">IETF</a> rfc documents, copyright and licence,
see the &quot;Copyright Notice&quot; content part in top of each IETF rfc document.
</p>
<p>
A short xCal description is found at <a href="https://en.wikipedia.org/wiki/XCal" title="xCal on Wikipedia, the free encyclopedia" target="_blank">Wikipedia</a>.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="This_manual"></a><h2>1.2 This manual</h2>
<p>This style is used for text.</p>
<p class="format">This style is used for formats.</p>
<p class="example">
This style is used for <em>PHP</em> coding examples.
<span class="comment"> // this style is used for coding comments.</span>
</p>
<p class="comment">This style is used for content details.</p>
<p class="quotes">This style may be used for quotes and/or extracts.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="Versioning"></a><h2>1.3 Versioning</h2>
<p>The release numbering convention used is major.minor(.micro&nbsp;/&nbsp;suffix).</p>
<dl>
<dt>Major
<dd>Indicates a very large change in the core package. Rewrites or major milestones.
<dt>Minor
<dd>Significant amount of feature addition/modification.<br>odd number - development/experimental release<br> even number - production release
<dt>Micro
<dd>Primarily bug fix and maintenance number.
<dt>Suffix (opt)
<dd>rc1 for first release candidate etc.
</dl>
<p>The release plan is based on yearly releases with exception of emergency releases.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="Support"></a><h2>1.4 Support</h2>
<p>
For bug report or support request, use <a href="https://github.com/iCalcreator/iCalcreator/issues" title="kigkonsult.se issues" target="_blank"> github issues</a>.
</p>
<p>
For previous iCalcreator (master) releases or non-emergency issues, support upon (paid) request only.
</p>
<p>
kigkonsult offer professional services for software support, design and new/re-development and unit tests
of <em>PHP</em>/<em>MySQL</em> solutions with focus on software lifecycle management, including long term utility, reliability and maintainability.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="Donate"></a><h2>1.5 Donate</h2>
<p>
You can show your appreciation for our free software,
and can support future development by making a donation to the kigkonsult project iCalcreator
using <a href="https://paypal.me/kigkonsult" rel="nofollow" target="_blank">paypal.me/kigkonsult</a>.
For invoice, <a href="mailto:ical@kigkonsult.se">please e-mail</a>.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="INSTALL"></a><h2>1.6 Install</h2>
<dl>
<dt>Composer (https://getcomposer.org/)
<dd>&nbsp;
<dd>composer require kigkonsult/icalcreator
<dd>&nbsp;
<dt>Or
<dd> include the (download) iCalcreator folder to your include-path
<dd>Add
<dd><span class="format">require_once &quot;[path/]iCalcreator-2.41.70/autoload.php&quot;;</span>
<dd>to your <em>PHP</em>-script.
</dl>
<p>Builds :</p>
<dl>
<dt>v2.41.70</dt>
<dd>v2.42 pre-release</dd>
<dt>v2.40</dt>
<dd>stable PHP8</dd>
<dt>v2.39</dt>
<dd>PHP7</dd>
</dl>
<p>
iCalcreator 2.41.70 is using namespace &quot;Kigkonsult\Icalcreator&quot;.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="Major_changes"></a><h2>1.7 Major changes</h2>
<p>
Here are update headlines in this version.
</p>
<ul>
<li>more PHP8 updates, StringFactory::getRandChars() upd</li>
<li>rfc7808 new Vtimezone properties TZID-ALIAS-OF/TZUNTIL</li>
<li>rfc9074 new Valarm properties: UID, RELATED-TO, ACKNOWLEDGED, PROXIMITY</li>
<li>rfc9073 new properties <br>
for Vevent, Vtodo, Vjournal : STRUCTURED-DATA <br>
for Vevent, Vtodo, Vjournal, Valarm : STYLED_DESCRIPTION <br>
new Vcalendar/component method participants2Attendees()
</li>
<li>rfc9073 new component PARTICIPANT with new property CALENDAR-ADDRESS</li>
<li>rfc9073 new subComponent VLOCATION with new property LOCATION-TYPE</li>
<li>method(s) Vcalendar/caledarComponent::getComponent() moved to IcalBase</li>
<li>rfc9073 new subComponent VRESOURCE with new property RESOURCE-TYPE<br>
restructure of abstract classes</li>
<li>(new) signature of newAlarm, newParticipant, newVlocation, newVresource methods</li>
<li>rfc7953 new component VAVAILABILITY with new property BUSYTYPE</li>
<li>rfc7953 new component AVAILABLE</li>
<li>upd VtimezonePopulateFactory::process(), accept multiple timeszones<br>
arg timezone as string|string[]</li>
<li>rfc5870 Uniform Resource Identifier for Geographic Locations ('geo' URI)</li>
<li>rfc6868 Parameter Value Encoding in iCalendar and vCard</li>
<li>general upd factory methods (ex newVevent), arguments</li>
<li>
Vcalendar/component method participants2Attendees() upd (Participant uid+type as x-params)<br>
Vcalendar/Vevent/Vtodo method vlocationNames2Locations()() upd (Vlocation uid+type as x-params)<br>
Vcalendar/Vevent/Vtodo method vresourceNames2Resources() upd (Vresource uid+type as x-params)
</li>
<li>
<b>upd</b> multi Decription<br>
bug component::setDtend()<br>
<b>upd</b> createCalendar/Component methods<br>
using.html doc upd<br>
Vcalendar/Component::getXprop() consecutive invokes bug
</li>
<li>
Parsetest upd<br>
<b>upd</b> doc GEO/NAME component occurence<br>
CONTACT/DESCRIPTION/LOCATION/NAME property get-methods and IcalXMLFactory::compProps2Xml() logic<br>
Vcalendar::setComponents() bug, insert Vtimezone(s) first (not last)<br>
<b>upd</b> participants2Attendees() : Participant-type to (ATTENDEE) parameter ROLE
<br><br>
</li>
<li>
<b>new</b>, Component::is&lt;Property&gt;Set() methods
<br><br>
</li>
<li>
<b>upd</b>, all property value/params contents are now (class) Pc, an ArrayObject extend class<br>
Vcalendar/Component::get&lt;Property&gt;() methods return property->value or Pc (dep. on arg inclParam)<br>
For arg inclParam=true return usage: $return[&quot;value&quot;] &lt;=&gt; $return->value (dito params)<br>
Pc has also getter/setter-methods etc<br>
rewrite of Vcalendar/Component::set&lt;property&gt; methods<br>
Vcalendar/Component::set&lt;property&gt;() methods accepts Pc as first arg
<br><br>
</li>
<li>
Component::createAttendee() param format bug<br>
Changed Freebusy::getFreebusy() output, fbBusyType now in params<br>
Multi-properties help methods moved to trait
</li>
<li>
RequestSstatus exRule, int properties bug<br>
Pc::getParams() new arg (bool) asXparamkey<br>
github #99-101
</li>
<li>
Extended tests<br>
Refresh_Interval trait bug<br>
Calendar parse upd
<br><br>
</li>
<li>
<b>new</b> vCalendar/CalendarComponent::getComponents() methods, return array(*component)
</li>
<li>
ALL multi-props have &lt;getAllProperty&gt; method, return array, values only / full
</li>
<li>
opt URI (email) mailto-prefix in lowercase
</li>
<li>
<b>new</b> class factory methods, upd class constructs
</li>
<li>
Vcalendar/Component parser logic moved to parser classes<br>
Vcalendar/Component format logic moved to formatter classes
</li>
<li>
removed deleteDtstamp/deleteUid methods (use set-method to recreate)<br>
Vtimezone, Util and misc code tidy up...
<br><br>
</li>
<li>
GitHub#103 (non-PHP timezones)<br>
Note Vtimezone::TZID property still accepts any timezone<br>
RegulateTimezoneFactory deprecated<br>
code clean up, phpdoc args etc<br>
Geo/Version property (empty-)bug
</li>
<li>
new Pc::getValueParam() method<br>
upd property parameters format logic<br>
SelectFactory method argument typing<br>
upd Pc::getParams() return types<br>
upd format property output logic<br>
DateTimeInterface adapt
</li>
<li>
upd Pc::getParams() return types<br>
upd tests and format property output logic<br>
DateTimeInterface adapt<br>
Util/IcalXMLFactory split up in Xml/Formatter+Parser
</li>
</ul>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="Additional_Descriptors"></a><h2>1.8 Additional descriptors</h2>
<p>
Some properties (ex. as described in
<a href="https://en.wikipedia.org/wiki/ICalendar#Calendar_extensions" title="https://en.wikipedia.org/wiki/ICalendar#Calendar_extensions" target="_blank">wikipedia:iCal</a>)
may be required when importing iCal formatted data into some calendaring software (MS etc).
Also <a href="#X-PROPERTY">X-properties</a> may appear in exports. Below are examples</p>
<dl>
<dt>on <strong>calendar</strong> level
<dd><a href="#METHOD">METHOD</a> property (value PUBLISH etc.)
<dd><a href="#X-PROPERTY">X-WR-CALNAME</a> x-property
<dd><a href="#X-PROPERTY">X-WR-CALDESC</a> x-property
<dd><a href="#X-PROPERTY">X-WR-RELCALID</a> x-property <span class="comment">(Read more info about <a href="https://en.wikipedia.org/wiki/Universally_Unique_Identifier" title="Universally Unique Identifier">UUID</a>.)</span>
<dd><a href="#X-PROPERTY">X-WR-TIMEZONE</a> x-property
<dt>on component level
<dd><a href="#DTSTAMP">DTSTAMP</a> <sup>*</sup>
<dd><a href="#UID">UID</a> <sup>*</sup>
<dt>on component level in a <a href="#VTIMEZONE">vtimezone</a> component
<dd><a href="#X-PROPERTY">X-LIC-LOCATION</a> x-property
</dl>
<p>
<sup>*</sup>
Created automatically in iCalcreator at component creation.
<p>
To ease up usage, constants <br>
- Kigkonsult\Icalcreator\Vcalendar::METHOD,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_CALNAME,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_CALDESC,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_RELCALID,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_TIMEZONE,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_LIC_LOCATION<br>
are available.
</p>
<p class="label">Example</p>
<p>
A strong recommendation is also to set config <a href="#Unique_id">unique_id</a> when creating a new Vcalendar instance,
to ensure accurate setting of PRODID property.
Also setting &quot;X-WR-TIMEZONE&quot; (below) is to recommend.
</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vcalendar-&gt;setMethod( Vcalendar::PUBLISH )
-&gt;setXprop( Vcalendar::X_WR_CALNAME, &quot;Calendar Sample&quot; )
-&gt;setXprop( Vcalendar::X_WR_CALDESC, &quot;Calendar Description&quot; )
-&gt;setXProp( Vcalendar::X_WR_RELCALID, &quot;3E26604A-50F4-4449-8B3E-E4F4932D05B5&quot; )
-&gt;setXprop( Vcalendar::X_WR_TIMEZONE, &quot;Europe/Stockholm&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="INDEX"></a><h2>1.9 INDEX</h2>
<a href="#INTRO">1 INTRO</a><br>
<br>
<a href="#Standards">1.1 Standards</a><br>
<a href="#This_manual">1.2 This manual</a><br>
<a href="#Versioning">1.3 Versioning</a><br>
<a href="#Support">1.4 Support</a><br>
<a href="#Donate">1.5 Donate</a><br>
<a href="#INSTALL">1.6 Install</a><br>
<a href="#Major_changes">1.7 Major changes</a><br>
<a href="#Additional_Descriptors">1.8 Additional descriptors</a><br>
<a href="#INDEX">1.9 INDEX</a><br>
<br>
<a href="#Calendar_Component_list">2 Calendar Component list</a><br>
<br>
<a href="#VCALENDAR">2.1 VCALENDAR</a><br>
<a href="#VEVENT">2.2 VEVENT</a><br>
<a href="#VTODO">2.3 VTODO</a><br>
<a href="#VJOURNAL">2.4 VJOURNAL</a><br>
<a href="#VFREEBUSY">2.5 VFREEBUSY</a><br>
<a href="#VALARM">2.6 VALARM</a><br>
<a href="#PARTICIPANT">2.7 PARTICIPANT</a><br>
<a href="#VLOCATION">2.8 VLOCATION</a><br>
<a href="#VRESOURCE">2.9 VRESOURCE</a><br>
<a href="#VAVAILABILITY">2.10 VAVAILABILITY</a><br>
<a href="#AVAILABLE">2.11 AVAILABLE</a><br>
<a href="#VTIMEZONE">2.14 VTIMEZONE</a><br>
<br>
<a href="#methodList">3 Methods</a><br>
<br>
<a href="#iCalcreator_object_methods">3.1 Vcalendar methods</a><br>
<br>
<a href="#Calendar_object_constructors">3.1.1 Constructors</a><br>
<a href="#vcalendar_constr">3.1.1.1 Vcalendar</a><br>
<a href="#vevent_constr">3.1.1.2 Vevent</a><br>
<a href="#vtodo_constr">3.1.1.3 Vtodo</a><br>
<a href="#vjournal_constr">3.1.1.4 Vjournal</a><br>
<a href="#vfreebusy_constr">3.1.1.5 Vfreebusy</a><br>
<a href="#valarm_constr">3.1.1.6 Valarm</a><br>
<a href="#vavailability_constr">3.1.1.7 Vavailability</a><br>
<a href="#available_constr">3.1.1.8 Available</a><br>
<a href="#participant_constr">3.1.1.9 Participant</a><br>
<a href="#vlocation_constr">3.1.1.10 Vlocation</a><br>
<a href="#vresource_constr">3.1.1.11 Vresource</a><br>
<a href="#vtimezone_constr">3.1.1.12 Vtimezone</a><br>
<a href="#standard_daylight_constr">3.1.1.13 Standard / Daylight</a><br>
<br>
<a href="#iCalcreator_object_property_methods">3.1.2 Vcalendar property methods</a><br>
<a href="#CALSCALE">3.1.2.1 CALSCALE</a><br>
<a href="#METHOD">3.1.2.2 METHOD</a><br>
<a href="#VERSION">3.1.2.3 VERSION</a><br>
<br>
<a href="#iCalcreator_component_object_methods">3.1.3 Vcalendar component object methods</a><br>
<a href="#deleteComponent">3.1.3.1 deleteComponent</a><br>
<a href="#getComponent">3.1.3.2 getComponent</a><br>
<a href="#getComponents">3.1.3.3 getComponents</a><br>
<a href="#replaceComponent">3.1.3.4 replaceComponent</a><br>
<a href="#selectComponents">3.1.3.5 selectComponents</a><br>
<a href="#setComponent">3.1.3.6 setComponent</a><br>
<br>
<a href="#iCalcreator_calendar_methods">3.1.4 Vcalendar calendar methods</a><br>
<a href="#parse_merge">3.1.4.1 parse and merge</a><br>
<a href="#createCalendar">3.1.4.2 createCalendar</a><br>
<a href="#returnCalendar">3.1.4.3 returnCalendar</a><br>
<a href="#sort">3.1.4.4 sort</a><br>
<a href="#countComponents">3.1.4.5 countComponents</a><br>
<a href="#iCalcreatorVersion">3.1.4.6 iCalcreatorVersion</a><br>
<a href="#valendarVtimezonePopulate">3.1.4.7 vtimezonePopulate</a><br>
<br>
<a href="#iCalcreator_configuration_methods">3.1.5 Vcalendar configuration</a><br>
<a href="#configKeys">3.1.5.1 configuration keys</a><br>
<a href="#getConfig">3.1.5.2 getConfig</a><br>
<a href="#initConfig">3.1.5.3 calendar/component initialization</a><br>
<a href="#setConfig">3.1.5.4 setConfig</a><br>
<a href="#allowEmpty">3.1.5.5 Allow empty components</a><br>
<a href="#Compsinfo">3.1.5.6 Component information</a><br>
<a href="#Language">3.1.5.7 Language</a><br>
<a href="#setPropertyNames">3.1.5.8 setPropertyNames</a><br>
<a href="#Unique_id">3.1.5.9 Unique_id</a><br>
<br>
<a href="#Calendar_component_object_property_function_list">3.2 Component property methods</a><br>
<a href="#date_restraints">3.2.1 Date restraints</a><br>
<a href="#propValueParam">3.2.2 Property value/params</a><br>
<a href="#componentParse">3.2.3 Parse</a><br>
<dl>
<dt>Properties in ascending name order</dt>
<dd><a href="#ACKNOWLEDGED">3.2.4 ACKNOWLEDGED</a>
<dd><a href="#ACTION">3.2.5 ACTION</a>
<dd><a href="#ATTACH">3.2.6 ATTACH</a>
<dd><a href="#ATTENDEE">3.2.7 ATTENDEE</a>
<dd><a href="#BUSYTYPE">3.2.8 BUSYTYPE</a>
<dd><a href="#CALENDAR-ADDRESS">3.2.9 CALENDAR-ADDRESS</a>
<dd><a href="#CATEGORIES">3.2.10 CATEGORIES</a>
<dd><a href="#CLASS">3.2.11 CLASS</a>
<dd><a href="#COLOR">3.2.12 COLOR</a>
<dd><a href="#COMMENT">3.2.13 COMMENT</a>
<dd><a href="#COMPLETED">3.2.14 COMPLETED</a>
<dd><a href="#CONFERENCE">3.2.15 CONFERENCE</a>
<dd><a href="#CONTACT">3.2.16 CONTACT</a>
<dd><a href="#CREATED">3.2.17 CREATED</a>
<dd><a href="#DESCRIPTION">3.2.18 DESCRIPTION</a>
<dd><a href="#DTEND">3.2.19 DTEND</a>
<dd><a href="#DTSTAMP">3.2.20 DTSTAMP</a>
<dd><a href="#DTSTART">3.2.21 DTSTART</a>
<dd><a href="#DUE">3.2.22 DUE</a>
<dd><a href="#DURATION">3.2.22 DURATION</a>
<dd><a href="#EXDATE">3.2.24 EXDATE</a>
<dd><a href="#EXRULE">3.2.25 EXRULE</a>
<dd><a href="#FREEBUSY_PROP">3.2.26 FREEBUSY</a>
<dd><a href="#GEO">3.2.27 GEO</a>
<dd><a href="#IMAGE">3.2.28 IMAGE</a>
<dd><a href="#LAST-MODIFIED">3.2.29 LAST-MODIFIED</a>
<dd><a href="#LOCATION">3.2.30 LOCATION</a>
<dd><a href="#LOCATION-TYPE">3.2.31 LOCATION-TYPE</a>
<dd><a href="#NAME">3.2.32 NAME</a>
<dd><a href="#ORGANIZER">3.2.33 ORGANIZER</a>
<dd><a href="#PARTICIPANT-TYPE">3.2.34 PARTICIPANT-TYPE</a>
<dd><a href="#PERCENT-COMPLETE">3.2.35 PERCENT-COMPLETE</a>
<dd><a href="#PRIORITY">3.2.36 PRIORITY</a>
<dd><a href="#PROXIMITY">3.2.37 PROXIMITY</a>
<dd><a href="#RDATE">3.2.38 RDATE</a>
<dd><a href="#RECURRENCE-ID">3.2.39 RECURRENCE-ID</a>
<dd><a href="#REFRESH-INTERVAL">3.2.40 REFRESH-INTERVAL</a>
<dd><a href="#RELATED-TO">3.2.41 RELATED-TO</a>
<dd><a href="#REPEAT">3.2.42 REPEAT</a>
<dd><a href="#REQUEST-STATUS">3.2.43 REQUEST-STATUS</a>
<dd><a href="#RESOURCE-TYPE">3.2.44 RESOURCE-TYPE</a>
<dd><a href="#RESOURCES">3.2.45 RESOURCES</a>
<dd><a href="#RRULE">3.2.46 RRULE</a>
<dd><a href="#SEQUENCE">3.2.47 SEQUENCE</a>
<dd><a href="#SOURCE">3.2.48 SOURCE</a>
<dd><a href="#STATUS">3.2.49 STATUS</a>
<dd><a href="#STRUCTURED-DATA">3.2.50 STRUCTURED-DATA</a>
<dd><a href="#STYLED-DESCRIPTION">3.2.51 STYLED-DESCRIPTION</a>
<dd><a href="#SUMMARY">3.2.52 SUMMARY</a>
<dd><a href="#TRANSP">3.2.53 TRANSP</a>
<dd><a href="#TRIGGER">3.2.54 TRIGGER</a>
<dd><a href="#TZID">3.2.55 TZID</a>
<dd><a href="#TZID-ALIAS-OF">3.2.56 TZID-ALIAS-OF</a>
<dd><a href="#TZNAME">3.2.57 TZNAME</a>
<dd><a href="#TZOFFSETFROM">3.2.58 TZOFFSETFROM</a>
<dd><a href="#TZOFFSETTO">3.2.59 TZOFFSETTO</a>
<dd><a href="#TZUNTIL">3.2.60 TZUNTIL</a>
<dd><a href="#TZURL">3.2.61 TZURL</a>
<dd><a href="#UID">3.2.62 UID</a>
<dd><a href="#URL">3.2.63 URL</a>
<dd><a href="#X-PROPERTY">3.2.64 X-PROPERTY</a>
</dl>
<a href="#iCalcreator_component_configuration_methods">3.3 iCalcreator Component configuration methods</a><br>
<a href="#Language_PROP">3.3.1 Language</a><br>
<br>
<a href="#iCalcreator_misc_methods">3.4 iCalcreator misc. methods</a><br>
<a href="#deleteComponent_PROP">3.4.1 deleteComponent</a><br>
<a href="#getComponent_PROP">3.4.2 getComponent</a><br>
<a href="#getComponents_PROP">3.4.3 getComponents</a><br>
<a href="#setComponent_PROP">3.4.4 setComponent</a><br>
<a href="#vtimezone_populate">3.4.5 Vtimezone populate</a><br>
<a href="#msTimezone2PHPtz">3.4.6 Review timezones, opt alter to PHP timezone</a><br>
<br>
<a href="#TimezoneXMLjsonvCard">4 XML, json and vCard support</a><br>
<a href="#XMLhelpers">4.3 iCalcreator and (RFC6321) XML</a><br>
<a href="#iCal2XML">4.3.1 iCal2XML</a><br>
<a href="#XML2iCal">4.3.2 XML2iCal</a><br>
<a href="#iCal2jSon">4.4 iCalcreator and json export</a><br>
<a href="#vCardhelpers">4.5 iCalcreator and iCalvCardFactory class</a><br>
<a href="#iCal2vCard">4.5.1 iCal2vCard</a><br>
<a href="#iCal2vCards">4.5.2 iCal2vCards</a><br>
<br>
<a href="#Copyright_and_Licence">5 COPYRIGHT AND LICENSE</a><br>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
<a id="Calendar_Component_list"></a><h1>2 Calendar Component list</h1>
<p>
Note, to ease up usage, you will find convenient constants for component names,
properties, config keys etc in (src/)IcalInterface.
</p>
<a id="VCALENDAR"></a><h2>2.1 VCALENDAR</h2>
<dl>
<dt>
<a href="#VAVAILABILITY">VAVAILABILITY</a> (availabilityc below), as described in
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;Calendar Availability&quot;
</dt>
<dd>
may NOT be supported by all calendaring software.g1
</dd>
<dt>
Properties suffixed by &quot;*&quot;, described in
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
may NOT be supported by all calendaring software.<br>
If not set, <a href="#UID">UID</a> property
is automatically created by iCalcreator at instance creation
or using Vcalendar method <a href="#returnCalendar">returnCalendar</a>
or component::getUid() (<a href="#UID">UID</a>) methods.
</dd>
</dl>
<p class="center">icalobject = 1*(&quot;BEGIN&quot; &quot;:&quot; &quot;VCALENDAR&quot; CRLF</p>
<p class="center">icalbody</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VCALENDAR&quot; CRLF)</p>
<p>icalbody = calprops component</p>
<p>calprops = *(</p>
<p class="center">REQUIRED, MUST NOT occur more than once
<p class="center">prodid / <a href="#VERSION">version</a> /</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center"><a href="#CALSCALE">calscale</a> / <a href="#METHOD">method</a> /</p>
<p class="center">
<a href="#UID">uid*</a> / <a href="#LAST-MODIFIED">last-mod*</a> / <a href="#URL">url*</a> /
<a href="#REFRESH-INTERVAL">refresh*</a> / <a href="#SOURCE">source*</a> / <a href="#COLOR">color*</a>
</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#NAME">name*</a> / <a href="#DESCRIPTION">description*</a> / <a href="#CATEGORIES">categories*</a> / <a href="#IMAGE">image*</a>
</p>
<p class="center"><a href="#X-PROPERTY">x-prop</a></p>
<p>)</p>
<p class="center">component = 1*(
<a href="#VEVENT">eventc</a> /
<a href="#VTODO">todoc</a> /
<a href="#VJOURNAL">journalc</a> /
<a href="#VFREEBUSY">freebusyc</a> /
<a href="#VTIMEZONE">timezonec</a> /
<a href="#VAVAILABILITY">availabilityc</a> /
iana-comp<sup>1</sup> /
x-comp<sup>1</sup>
)
</p>
<p class="center">iana-comp = &quot;BEGIN&quot; &quot;:&quot; iana-token CRLF</p>
<p class="center">1*contentline</p>
<p class="center">&quot;END&quot; &quot;:&quot; iana-token CRLF</p>
<p class="center">x-comp = &quot;BEGIN&quot; &quot;:&quot; x-name CRLF</p>
<p class="center">1*contentline</p>
<p class="center">&quot;END&quot; &quot;:&quot; x-name CRLF</p>
<p><sup>1</sup>) <span class="comment">not supported by iCalcreator</span></p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VEVENT"></a><h2>2.2 VEVENT</h2>
<p>
Properties suffixed by &quot;*&quot;, described in
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;New Properties for iCalendar&quot;,
may NOT be supported by all calendaring software.
</p>
<p>
Components and properties suffixed by &quot;*2&quot;, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>
The <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
are automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VEVENT&quot; CRLF</p>
<p class="center">
eventprop
*<a href="#VALARM">alarmc</a>
*<a href="#PARTICIPANT">participantc*2</a>
*<a href="#VLOCATION">locationc*2</a>
*<a href="#VRESOURCE">resoucec*2</a>
</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VEVENT&quot; CRLF</p>
<p>eventprop = *(</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#COLOR">color*</a> /
<a href="#CLASS">class</a> /
<a href="#CREATED">created</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#DTSTART">dtstart</a> /
<a href="#GEO">geo</a> /
</p>
<p class="center">
<a href="#LAST-MODIFIED">last-mod</a> /
<a href="#LOCATION">location</a> /
<a href="#ORGANIZER">organizer</a> /
<a href="#PRIORITY">priority</a> /
<a href="#DTSTAMP">dtstamp</a> /
<a href="#SEQUENCE">seq</a> /
</p>
<p class="center">
<a href="#STATUS">status</a> /
<a href="#SUMMARY">summary</a> /
<a href="#TRANSP">transp</a> /
<a href="#UID">uid</a> /
<a href="#URL">url</a> /
<a href="#RECURRENCE-ID">recurid</a> /
</p>
<p class="center">
either &quot;<a href="#DTEND">dtend</a>&quot; or &quot;<a href="#DURATION">duration</a>&quot; may appear in a &quot;eventprop&quot;,<br>
but &quot;<a href="#DTEND">dtend</a>&quot; and &quot;<a href="#DURATION">duration</a>&quot; MUST NOT occur in the same &quot;eventprop&quot;
</p>
<p class="center">
<a href="#DTEND">dtend</a> /
<a href="#DURATION">duration</a> /
</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#ATTACH">attach</a> /
<a href="#ATTENDEE">attendee</a> /
<a href="#CATEGORIES">categories</a> /
<a href="#COMMENT">comment</a> /
<a href="#CONFERENCE">conference*</a> /
<a href="#CONTACT">contact</a> /
</p>
<p class="center">
<a href="#EXDATE">exdate</a> /
<a href="#EXRULE">exrule</a> /
<a href="#IMAGE">image*</a> /
<a href="#REQUEST-STATUS">rstatus</a> /
<a href="#RELATED-TO">related</a> /
<a href="#RESOURCES">resources</a> /
</p>
<p class="center">
<a href="#RDATE">rdate</a> /
<a href="#RRULE">rrule</a> /
<a href="#STYLED-DESCRIPTION">styleddescription*2</a> /
<a href="#STRUCTURED-DATA">sdataprop*2</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VTODO"></a><h2>2.3 VTODO</h2>
<p>
Properties suffixed by &quot;*&quot;, described in
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;New Properties for iCalendar&quot;,
may NOT be supported by all calendaring software.
</p>
<p>
Components and properties suffixed by &quot;*2&quot;, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>
The <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
are automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VTODO&quot; CRLF</p>
<p class="center">
todoprop
*<a href="#VALARM">alarmc</a>
*<a href="#PARTICIPANT">participantc*2</a>
*<a href="#VLOCATION">locationc*2</a>
*<a href="#VRESOURCE">resoucec*2</a>
</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VTODO&quot; CRLF</p>
<p>todoprop = *(</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#CLASS">class</a> /
<a href="#COLOR">color*</a> /
<a href="#COMPLETED">completed</a> /
<a href="#CREATED">created</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#DTSTAMP">dtstamp</a> /
<a href="#DTSTART">dtstart</a> /
</p>
<p class="center">
<a href="#GEO">geo</a> /
<a href="#LAST-MODIFIED">last-mod</a> /
<a href="#LOCATION">location</a> /
<a href="#ORGANIZER">organizer</a> /
<a href="#PERCENT-COMPLETE">percent</a> /
<a href="#PRIORITY">priority</a> /
</p>
<p class="center">
<a href="#RECURRENCE-ID">recurid</a> /
<a href="#SEQUENCE">seq</a> /
<a href="#STATUS">status</a> /
<a href="#SUMMARY">summary</a> /
<a href="#UID">uid</a> /
<a href="#URL">url</a> /
</p>
<p class="center">
either &quot;<a href="#DUE">due</a>&quot; or &quot;<a href="#DURATION">duration</a>&quot; may appear in a &quot;todoprop&quot;,<br>
but &quot;<a href="#DUE">due</a>&quot; and &quot;<a href="#DURATION">duration</a>&quot; MUST NOT occur in the same &quot;todoprop&quot;
</p>
<p class="center"><a href="#DUE">due</a> / <a href="#DURATION">duration</a> /</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#ATTACH">attach</a> /
<a href="#ATTENDEE">attendee</a> /
<a href="#CATEGORIES">categories</a> /
<a href="#COMMENT">comment</a> /
<a href="#CONFERENCE">conference*</a> /
<a href="#CONTACT">contact</a> /
</p>
<p class="center">
<a href="#IMAGE">image*</a> /
<a href="#EXDATE">exdate</a> /
<a href="#EXRULE">exrule</a> /
<a href="#REQUEST-STATUS">rstatus</a> /
<a href="#RELATED-TO">related</a> /
<a href="#RESOURCES">resources</a> /
</p>
<p class="center">
<a href="#RDATE">rdate</a> /
<a href="#RRULE">rrule</a> /
<a href="#STYLED-DESCRIPTION">styleddescription*2</a> /
<a href="#STRUCTURED-DATA">sdataprop*2</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VJOURNAL"></a><h2>2.4 VJOURNAL</h2>
<p>
Properties suffixed by &quot;*&quot;, described in
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;New Properties for iCalendar&quot;,
may NOT be supported by all calendaring software.
</p>
<p>
Components and properties suffixed by &quot;*2&quot;, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>
The <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
are automatically created by iCalcreator at instance creation.
</p>
<p class="center">journalc = &quot;BEGIN&quot; &quot;:&quot; &quot;VJOURNAL&quot; CRLF</p>
<p class="center">
jourprop
*<a href="#PARTICIPANT">participantc*2</a>
*<a href="#VLOCATION">locationc*2</a>
*<a href="#VRESOURCE">resoucec*2</a>
</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VJOURNAL&quot; CRLF</p>
<p>jourprop = *(</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#CLASS">class</a> /
<a href="#COLOR">color*</a> /
<a href="#CREATED">created</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#DTSTART">dtstart</a> /
<a href="#DTSTAMP">dtstamp</a> /
</p>
<p class="center">
<a href="#LAST-MODIFIED">last-mod</a> /
<a href="#ORGANIZER">organizer</a> /
<a href="#RECURRENCE-ID">recurid</a> /
</p>
<p class="center">
<a href="#SEQUENCE">seq</a> /
<a href="#STATUS">status</a> /
<a href="#SUMMARY">summary</a> /
<a href="#UID">uid</a> /
<a href="#URL">url</a> /
</p>
<p class="center">OPTIONAL, MAY occur more than once</p>
<p class="center">
<a href="#ATTACH">attach</a> /
<a href="#ATTENDEE">attendee</a> /
<a href="#CATEGORIES">categories</a> /
<a href="#COMMENT">comment</a> /
<a href="#CONTACT">contact</a> /
</p>
<p class="center">
<a href="#IMAGE">image*</a> /
<a href="#EXDATE">exdate</a> /
<a href="#EXRULE">exrule</a> /
<a href="#RELATED-TO">related</a> /
<a href="#RDATE">rdate</a> /
</p>
<p class="center">
<a href="#RRULE">rrule</a> /
<a href="#REQUEST-STATUS">rstatus</a> /
<a href="#STYLED-DESCRIPTION">styleddescription*2</a> /
<a href="#STRUCTURED-DATA">sdataprop*2</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VFREEBUSY"></a><h2>2.5 VFREEBUSY</h2>
<p>
Components and properties suffixed by &quot;*2&quot;, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>
The <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
are automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VFREEBUSY&quot; CRLF</p>
<p class="center">
fbprop
*<a href="#PARTICIPANT">participantc*2</a>
*<a href="#VLOCATION">locationc*2</a>
*<a href="#VRESOURCE">resoucec*2</a>
</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VFREEBUSY&quot; CRLF</p>
<p>fbprop = *(</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#CONTACT">contact</a> /
<a href="#DTSTART">dtstart</a> /
<a href="#DTEND">dtend</a> /
<a href="#DURATION">duration</a> /
</p>
<p class="center">
<a href="#DTSTAMP">dtstamp</a> /
<a href="#ORGANIZER">organizer</a> /
<a href="#UID">uid</a> /
<a href="#URL">url</a> /
</p>
<p class="center">OPTIONAL, MAY occur more than once</p>
<p class="center">
<a href="#ATTENDEE">attendee</a> /
<a href="#COMMENT">comment</a> /
<a href="#FREEBUSY_PROP">freebusy</a> /
<a href="#REQUEST-STATUS">rstatus</a> /
<a href="#STYLED-DESCRIPTION">styleddescription*2</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VALARM"></a><h2>2.6 VALARM</h2>
<p class="quotes">
The &quot;VALARM&quot; calendar component MUST only appear within either a
<a href="#VEVENT">VEVENT</a> or <a href="#VTODO">VTODO</a> calendar component.
</p>
<p class="quotes">
Multiple mutually independent &quot;VALARM&quot; calendar
components can be specified for a single <a href="#VEVENT">VEVENT</a> or <a href="#VTODO">VTODO</a> calendar
component.
</p>
<p>
Component and properties suffixed by &quot;*3&quot;, described in
<a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank">rfc9074</a>
&quot;VALARM Extensions for iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VALARM&quot; CRLF</p>
<p class="center">(audioprop / dispprop / emailprop / procprop) <a href="#VLOCATION">*locationc*3</a></p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VALARM&quot; CRLF</p>
<p>audioprop = *(</p>
<p class="center">REQUIRED, but MUST NOT occur more than once</p>
<p class="center"><a href="#ACTION">action</a> / <a href="#TRIGGER">trigger</a> /</p>
<p class="center">
&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot;
are both optional,and MUST NOT occur more than once each,<br>
but if one occurs, so MUST the other
</p>
<p class="center"><a href="#DURATION">duration</a> / <a href="#REPEAT">repeat</a> /</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#ATTACH">attach</a> /
<a href="#ACKNOWLEDGED">acknowledged*3</a> /
<a href="#PROXIMITY">proximity*3</a> /
<a href="#UID">uid*3</a> /
</p>
<p class="center">OPTIONAL, MAY occur more than once</p>
<p class="center">
<a href="#RELATED-TO">related*3</a> /
<a href="#STYLED-DESCRIPTION">styleddescription*2</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<p>dispprop = *(</p>
<p class="center">REQUIRED, MUST NOT occur more than once</p>
<p class="center">
<a href="#ACTION">action</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#TRIGGER">trigger</a> /
</p>
<p class="center">
&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot; are both optional,and MUST NOT occur more than once each,<br>
but if one occurs, so MUST the other
</p>
<p class="center"><a href="#DURATION">duration</a> / <a href="#REPEAT">repeat</a> /</p>
<p class="center">OPTIONAL, but MUST NOT occur more than once</p>
<p class="center">
<a href="#ACKNOWLEDGED">acknowledged*3</a> /
<a href="#PROXIMITY">proximity*3'</a> /
<a href="#UID">uid</a> /
</p>
<p class="center">OPTIONAL, MAY occur more than once</p>
<p class="center">
<a href="#RELATED-TO">related*3</a> /
<a href="#STYLED-DESCRIPTION">styleddescription*2</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<p>emailprop = *(</p>
<p class="center">REQUIRED, MUST NOT occur more than once</p>
<p class="center">
<a href="#ACTION">action</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#TRIGGER">trigger</a> /
<a href="#SUMMARY">summary</a> /
</p>
<p class="center">REQUIRED, MAY occur more than once</p>
<p class="center"><a href="#ATTENDEE">attendee</a> / </p>
<p class="center">
&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot; are both optional, and MUST NOT occur more than once each,<br>
but if one occurs, so MUST the other
</p>
<p class="center"><a href="#DURATION">duration</a> / <a href="#REPEAT">repeat</a> /</p>
<p class="center">OPTIONAL, but MUST NOT occur more than once</p>
<p class="center">
<a href="#ACKNOWLEDGED">acknowledged*3</a> /
<a href="#PROXIMITY">proximity*3'</a> /
<a href="#RELATED-TO">related*3</a> /
<a href="#UID">uid</a> /
</p>
<p class="center">OPTIONAL, MAY occur more than once</p>
<p class="center"><a href="#ATTACH">attach</a> / <a href="#RELATED-TO">related</a> / <a href="#X-PROPERTY">x-prop</a></p>
<p>)</p>
<p>procprop (defined in <a href="https://tools.ietf.org/html/rfc2445" title="Download rfc2445" target="_blank">rfc2445</a>
but excluded in <a href="https://tools.ietf.org/html/rfc5545" title="Download rfc5545" target="_blank">rfc5545</a>)
= *(</p>
<p class="center">REQUIRED, MUST NOT occur more than once</p>
<p class="center"><a href="#ACTION">action</a> / <a href="#ATTACH">attach</a> / <a href="#TRIGGER">trigger</a> /</p>
<p class="center">
&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot; are both optional,
and MUST NOT occur more than once each,<br>
but if one occurs, so MUST the other
</p>
<p class="center"><a href="#DURATION">duration</a> /
<a href="#REPEAT">repeat</a> /</p>
<p class="center">OPTIONAL and MUST NOT occur more than once</p>
<p class="center">
<a href="#ACKNOWLEDGED">acknowledged*3</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#PROXIMITY">proximity*3</a> /
<a href="#UID">uid</a> /
</p>
<p class="center">OPTIONAL, MAY occur more than once</p>
<p class="center">
<a href="#RELATED-TO">related*3</a> /
<a href="#STYLED-DESCRIPTION">styleddescription*2</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="PARTICIPANT"></a><h2>2.7 PARTICIPANT</h2>
<p class="quotes">...can be specified multiple times in a
<a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>, or <a href="#VFREEBUSY">VFREEBUSY</a> calendar component
</p>
<dl>
<dt>
Note, PARTICIPANT, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>may NOT be supported by all calendaring software</dd>
<dd>
<dl>
<dt>
<p class="quotes">
&quot;For backwards compatibility with existing clients and servers when
used to schedule events and tasks, the <a href="#ATTENDEE">ATTENDEE</a> property MUST be
used to specify the scheduling parameters as defined for that property.&quot;
</p>
</dt>
<dd>see <a href="#ATTENDEE">ATTENDEE</a> rfc9073 note </dd>
</dl>
</dd>
</dl>
<p>
The <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
are automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;PARTICIPANT&quot; CRLF</p>
<p class="center">
partprop
*<a href="#VLOCATION">locationc</a>
*<a href="#VRESOURCE">resourcec</a>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;PARTICIPANT&quot; CRLF</p>
<p>partprop = *(</p>
<p class="center">REQUIRED, but MUST NOT occur more than once</p>
<p class="center"><a href="#PARTICIPANT-TYPE">participanttype</a> / <a href="#UID">uid</a> / </p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#CALENDAR-ADDRESS">calendaraddress</a> /
<a href="#CREATED">created</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#DTSTAMP">dtstamp</a> /
<a href="#GEO">geo</a> /
<a href="#LAST-MODIFIED">last-mod</a> /
</p>
<p class="center">
<a href="#PRIORITY">priority</a> /
<a href="#SEQUENCE">seq</a> /
<a href="#STATUS">status</a> /
<a href="#SUMMARY">summary</a> /
<a href="#URL">url</a> /
</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#ATTACH">attach</a> /
<a href="#CATEGORIES">categories</a> /
<a href="#COMMENT">comment</a> /
<a href="#CONTACT">contact</a> /
<a href="#LOCATION">location</a> /
<a href="#REQUEST-STATUS">rstatus</a> /
</p>
<p class="center">
<a href="#RELATED-TO">related</a> /
<a href="#RESOURCES">resources</a> /
<a href="#STYLED-DESCRIPTION">styleddescription</a> /
<a href="#STRUCTURED-DATA">sdataprop</a> /
<a href="#X-PROPERTY">x-prop</a></p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VLOCATION"></a><h2>2.8 VLOCATION</h2>
<p class="quotes">
can be specified multiple times in a
<a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>, <a href="#VFREEBUSY">VFREEBUSY</a> or <a href="#PARTICIPANT">PARTICIPANT</a>
calendar component
</p>
<p>
Note, VLOCATION, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>See <a href="#LOCATION">LOCATION</a> rfc9073 note </p>
<p>
The <a href="#UID">UID</a> property
is automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VLOCATION&quot; CRLF</p>
<p class="center">locprop</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VLOCATION&quot; CRLF</p>
<p>locprop = *(</p>
<p class="center">REQUIRED, but MUST NOT occur more than once</p>
<p class="center"><a href="#UID">uid</a> /</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#DESCRIPTION">description</a> /
<a href="#GEO">geo</a> /
<a href="#LOCATION-TYPE">loctype</a> /
<a href="#NAME">name</a> /
</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#STRUCTURED-DATA">sdataprop</a> /
<a href="#X-PROPERTY">x-prop</a></p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VRESOURCE"></a><h2>2.9 VRESOURCE</h2>
<p class="quotes">
can be specified multiple times in a
<a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>, <a href="#VFREEBUSY">VFREEBUSY</a> or <a href="#PARTICIPANT">PARTICIPANT</a>
calendar component
</p>
<p>
Note, VRESOURCE, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>See <a href="#RESOURCES">RESOURCES</a> rfc9073 note </p>
<p>
The <a href="#UID">UID</a> property
is automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VRESOURCE&quot; CRLF</p>
<p class="center">resprop</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VRESOURCE&quot; CRLF</p>
<p>resprop = *(</p>
<p class="center">REQUIRED, but MUST NOT occur more than once</p>
<p class="center"><a href="#UID">uid</a> / </p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#DESCRIPTION">description</a> /
<a href="#GEO">geo</a> /
<a href="#NAME">name</a> /
<a href="#RESOURCE-TYPE">restype</a> /
</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#STRUCTURED-DATA">sdataprop</a> /
<a href="#X-PROPERTY">x-prop</a></p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VAVAILABILITY"></a><h2>2.10 VAVAILABILITY</h2>
<p>
VAVAILABILITY component can be specified multiple times in a <a href="#VCALENDAR">VCALENDAR</a>
</p>
<p>
The component, as described in
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;,
may NOT be supported by all calendaring software.
</p>
<p>
The <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
are automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VAVAILABILITY&quot; CRLF</p>
<p class="center">
availabilityprop
*<a href="#AVAILABLE">availablec</a>
</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VAVAILABILITY&quot; CRLF</p>
<p>availabilityprop = *(</p>
<p class="center">REQUIRED, MUST NOT occur more than once</p>
<p class="center">
<a href="#DTSTAMP">dtstamp</a> /
<a href="#UID">uid</a>
</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#BUSYTYPE">busytype</a> /
<a href="#CLASS">class</a> /
<a href="#CREATED">created</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#DTSTART">dtstart</a> /
<a href="#LAST-MODIFIED">last-mod</a> /
</p>
<p class="center">
<a href="#LOCATION">location</a> /
<a href="#ORGANIZER">organizer</a> /
<a href="#PRIORITY">priority</a> /
<a href="#SEQUENCE">seq</a> /
<a href="#SUMMARY">summary</a> /
<a href="#URL">url</a> /
</p>
<p class="center">
either &quot;<a href="#DTEND">dtend</a>&quot; or &quot;<a href="#DURATION">duration</a>&quot; may appear in a &quot;availabilityprop&quot;,<br>
but &quot;<a href="#DTEND">dtend</a>&quot; and &quot;<a href="#DURATION">duration</a>&quot; MUST NOT occur in the same &quot;availabilityprop&quot;<br>
<a href="#DURATION">duration</a>&quot; MUST NOT be present if &quot;<a href="#DTSTART">dtstart</a>&quot; is not present
</p>
<p class="center">
<a href="#DTEND">dtend</a> /
<a href="#DURATION">duration</a> /
</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#CATEGORIES">categories</a> /
<a href="#COMMENT">comment</a> /
<a href="#CONTACT">contact</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="AVAILABLE"></a><h2>2.11 AVAILABLE</h2>
<p>
AVAILABLE component can be specified multiple times in a <a href="#VAVAILABILITY">VAVAILABILITY</a>
</p>
<p>
Component, as described in
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;,
may NOT be supported by all calendaring software.
</p>
<p>
The <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
are automatically created by iCalcreator at instance creation.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;AVAILABLE&quot; CRLF</p>
<p class="center">
availableprop
</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;AVAILABLE&quot; CRLF</p>
<p>availableprop = *(</p>
<p class="center">REQUIRED, MUST NOT occur more than once</p>
<p class="center">
<a href="#DTSTAMP">dtstamp</a> /
<a href="#DTSTART">dtstart</a> /
<a href="#UID">uid</a>
</p>
<p class="center">
either &quot;<a href="#DTEND">dtend</a>&quot; or &quot;<a href="#DURATION">duration</a>&quot; may appear in a &quot;availableprop&quot;,<br>
but &quot;<a href="#DTEND">dtend</a>&quot; and &quot;<a href="#DURATION">duration</a>&quot; MUST NOT occur in the same &quot;availableprop&quot;
</p>
<p class="center">
<a href="#DTEND">dtend</a> /
<a href="#DURATION">duration</a> /
</p>
<p class="center">OPTIONAL, MUST NOT occur more than once</p>
<p class="center">
<a href="#CREATED">created</a> /
<a href="#DESCRIPTION">description</a> /
<a href="#LAST-MODIFIED">last-mod</a> /
<a href="#LOCATION">location</a> /
<a href="#RECURRENCE-ID">recurid</a> /
<a href="#RRULE">rrule</a> /
<a href="#SUMMARY">summary</a> /
</p>
<p class="center">OPTIONAL and MAY occur more than once</p>
<p class="center">
<a href="#CATEGORIES">categories</a> /
<a href="#COMMENT">comment</a> /
<a href="#CONTACT">contact</a> /
<a href="#EXDATE">exdate</a> /
<a href="#RDATE">rdate</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="VTIMEZONE"></a><h2>2.14 VTIMEZONE</h2>
<p>
Properties suffixed by &quot;*4&quot;, described in
<a href="https://tools.ietf.org/html/rfc7808" title="Download rfc7808" target="_blank">rfc7808</a>
&quot;Time Zone Data Distribution Service&quot;
may NOT be supported by all calendaring software.
</p>
<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VTIMEZONE&quot; CRLF</p>
<p>*(</p>
<p class="center">REQUIRED, but MUST NOT occur more than once</p>
<p class="center">
<a href="#TZID">tzid</a> /
</p>
<p class="center">OPTIONAL, but MUST NOT occur more than once</p>
<p class="center">
<a href="#LAST-MODIFIED">last-mod</a> /
<a href="#TZUNTIL">tzuntil*4</a> /
<a href="#TZURL">tzurl</a>
</p>
<p class="center">OPTIONAL, but MAY occur more than once</p>
<p class="center"><a href="#TZID-ALIAS-OF">tz-alias-of*4</a> /</p>
<p class="center">one of &quot;standardc&quot; or &quot;daylightc&quot; MUST occur and each MAY occur more than once.</p>
<p class="center">standardc / daylightc /</p>
<p class="center">optional, MAY occur more than once</p>
<p class="center"><a href="#X-PROPERTY">x-prop</a></p>
<p>)</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;VTIMEZONE&quot; CRLF</p>
<a id="STANDARD"></a>
<p class="center">standardc = &quot;BEGIN&quot; &quot;:&quot; &quot;STANDARD&quot; CRLF</p>
<p class="center">tzprop</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;STANDARD&quot; CRLF</p>
<a id="DAYLIGHT"></a>
<p class="center">daylightc = &quot;BEGIN&quot; &quot;:&quot; &quot;DAYLIGHT&quot; CRLF</p>
<p class="center">tzprop</p>
<p class="center">&quot;END&quot; &quot;:&quot; &quot;DAYLIGHT&quot; CRLF</p>
<p>tzprop = *(</p>
<p class="center">REQUIRED, MUST NOT occur more than once</p>
<p class="center">
<a href="#DTSTART">dtstart</a> /
<a href="#TZOFFSETTO">tzoffsetto</a> /
<a href="#TZOFFSETFROM">tzoffsetfrom</a> /
</p>
<p class="center">OPTIONAL, MAY occur more than once</p>
<p class="center">
<a href="#COMMENT">comment</a> /
<a href="#RDATE">rdate</a> /
<a href="#RRULE">rrule</a> /
<a href="#TZNAME">tzname</a> /
<a href="#X-PROPERTY">x-prop</a>
</p>
<p>)</p>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
<a id="methodList"></a><h1>3 methods</h1>
<a id="iCalcreator_object_methods"></a><h2>3.1 Vcalendar methods</h2>
<a id="Calendar_object_constructors"></a><h3>3.1.1 Constructors</h3>
<a id="vcalendar_constr"></a><h4>3.1.1.1 Vcalendar</h4>
<p>Create a new <a href="#VCALENDAR">VCALENDAR</a> object instance.</p>
<h5>Constructor</h5>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$config = [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ];
$vcalendar = new Vcalendar( $config );
</p>
<p>
The <strong>calendar</strong> PRODID property (based on the configuration <a href="#Unique_id">unique_id</a>)
and the <strong>calendar</strong>/component <a href="#UID">UID</a> property
are AUTOMATICALLY generated in iCalcreator at instance creation.
</p>
<p class="label">Example 2</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$tz = &quot;Europe/Stockholm&quot;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vcalendar-&gt;setXProp( Vcalendar::X_WR_TIMEZONE, $tz );
// <span class="comment">insert components or parse an iCal string calendar (and edit components)</span>
.. .
</p>
<p>
Some <strong>calendar</strong> software may also require calendar property <a href="#Additional_Descriptors">X-WR-TIMEZONE</a>
and vtimezone component with property <a href="#Additional_Descriptors">X-LIC-LOCATION</a>,
review Vcalendar <a href="#valendarVtimezonePopulate">populate</a> or
<a href="#vtimezone_populate">Util/VtimezonePopulateFactory::process</a> methods.
</p>
<h5>factory</h5>
<p>
Create a new Vcalendar object instance using a factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::factory( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = Vcalendar::factory( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] )
-&gt;setMethod( "PUBLIC" );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vevent_constr"></a><h4>3.1.1.2 Vevent</h4>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VEVENT is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VEVENT">VEVENT</a> object instance
using a <a href="#VCALENDAR">VCALENDAR</a> component factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vcalendar::newVevent( [ dtstart [, dtend [, duration [, summary ]]]] )</p>
<p class="comment">
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
summary = property <a href="#SUMMARY">SUMMARY</a> string value
*) dtend and duration MUST NOT occur in the same <a href="#VEVENT">VEVENT</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vevent = $vcalendar-&gt;newVevent( $dtStart );
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VEVENT">VEVENT</a> object instance using a VEVENT factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vevent::factory( [ config [, dtstart [, dtend [, duration [, summary ]]]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
summary = property <a href="#SUMMARY">SUMMARY</a> string value
*) dtend and duration MUST NOT occur in the same <a href="#VEVENT">VEVENT</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vevent = Vevent::factory( null, $dtStart );
.. .
$vcalendar-&gt;setComponent( $vevent );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VEVENT">VEVENT</a> object instance.</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vevent::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$config = $vcalendar-&gt;getConfig();
$vevent = new Vevent( $config );
.. .
$vcalendar-&gt;setComponent( $vevent );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vtodo_constr"></a><h4>3.1.1.3 Vtodo</h4>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VTODO is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VTODO">VTODO</a> object instance
using a <a href="#VCALENDAR">VCALENDAR</a> component factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vcalendar::newVtodo( [ dtstart [, due [, duration [, summary ]]]] )</p>
<p class="comment">
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
due = property <a href="#DUE">DUE</a> string|DateTimeInterface value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
summary = property <a href="#SUMMARY">SUMMARY</a> string value
*) dtend and duration MUST NOT occur in the same <a href="#VEVENT">VEVENT</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vtodo = $vcalendar-&gt;newVtodo( $dtStart );
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VTODO">VTODO</a> object instance using VTODO factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vcalendar::newVtodo( [ config [, dtstart [, due [, duration [, summary ]]]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
due = property <a href="#DUE">DUE</a> string|DateTimeInterface value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
summary = property <a href="#SUMMARY">SUMMARY</a> string value
*) dtend and duration MUST NOT occur in the same <a href="#VEVENT">VEVENT</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vtodo = Vtodo::factory( null, $dtStart );
.. .
$vcalendar-&gt;setComponent( $vtodo );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VTODO">VTODO</a> object instance.</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vtodo::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vtodo;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$config = $vcalendar-&gt;getConfig();
$vtodo = new Vtodo( $config );
.. .
$vcalendar-&gt;setComponent( $vtodo );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vjournal_constr"></a><h4>3.1.1.4 Vjournal</h4>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VJOURNAL is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VJOURNAL">VJOURNAL</a> object instance
using a <a href="#VCALENDAR">VCALENDAR</a> component factory-method.
</p>
<p class="format">Vcalendar::newVjournal( [ dtstart [, summary ]] )</p>
<p class="comment">
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
summary = property <a href="#SUMMARY">SUMMARY</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vjournal = $vcalendar-&gt;newVjournal( $dtStart );
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VJOURNAL">VJOURNAL</a> object instance using a VJOURNAL factory-method.
</p>
<p class="format">Vjournal::factory( [ config [, dtstart [, summary ]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
summary = property <a href="#SUMMARY">SUMMARY</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vjournal = Vjournal::factory( null, $dtStart );
.. .
$vcalendar-&gt;setComponent( $vjournal );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VJOURNAL">VJOURNAL</a> object instance.</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vtodo::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vjournal;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$config = $vcalendar-&gt;getConfig();
$vjournal = new Vjournal( $config );
.. .
$vcalendar-&gt;setComponent( $vjournal );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vfreebusy_constr"></a><h4>3.1.1.5 Vfreebusy</h4>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VFREEBUSY is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VFREEBUSY">VFREEBUSY</a> object instance
using a <a href="#VCALENDAR">VCALENDAR</a> component factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vcalendar::newVfreebuy( [ attendee [, dtstart [, dtend ]]] )</p>
<p class="comment">
attendee = property <a href="#ATTENDEE">ATTENDEE</a> string value
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vtodo = $vcalendar-&gt;newVfreebusy( $attendee, $dtStart, $dtend );
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VFREEBUSY">VFREEBUSY</a> object instance using a factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vcalendar::newVfreebuy( [ config [, attendee [, dtstart [, dtend ]]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
attendee = property <a href="#ATTENDEE">ATTENDEE</a> string value
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface value
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$config =[ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ];
$vcalendar = new Vcalendar( $config );
.. .
$vtodo = Vfreebusy::factory( $config, $attendee, $dtStart, $dtend );
.. .
$vcalendar-&gt;setComponent( $vfreebusy );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VTODO">VTODO</a> object instance.</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Vfreebusy::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vfreebusy;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$config = $vcalendar-&gt;getConfig();
$vfreebusy = new Vfreebusy( $config );
.. .
$vcalendar-&gt;setComponent( $vfreebusy );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="valarm_constr"></a><h4>3.1.1.6 Valarm</h4>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VALARM is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VALARM">VALARM</a> object instance using a Vcalendar component factory-method.
The <a href="#VALARM">VALARM</a> calendar component MUST only appear (one or more)
in either a <a href="#VEVENT">VEVENT</a> or <a href="#VTODO">VTODO</a> calendar component.
</p>
<p class="format">calendarComponent::newValarm( [ action [, trigger ]] )</p>
<p class="comment">
action = property <a href="#ACTION">ACTION</a> string value
trigger = property <a href="#TRIGGER">TRIGGER</a> string|DateInterval|DateTimeInterface value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
.. .
$vevent = $vcalendar-&gt;newVevent( $eventDtstart );
.. .
$valarm = $vevent-&gt;newValarm( Vcalendar::DISPLAY, $veventAlarmDtstart );
.. .
$vtodo = $vcalendar-&gt;newVtodo( $todoDtstart );
.. .
$valarm = $vtodo-&gt;newValarm( Vcalendar::AUDIO, $totoAlarmDtstart );
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VALARM">VALARM</a> object instance. using a factory-method.
</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Valarm::factory( [ config [, action [, trigger ]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
action = property <a href="#ACTION">ACTION</a> string value
trigger = property <a href="#TRIGGER">TRIGGER</a> string|DateInterval|DateTimeInterface value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
use Kigkonsult\Icalcreator\Valarm;
$config = [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ]:
$vcalendar = new Vcalendar( $config );
.. .
$vevent = Vevent::factory( $config );
.. .
$valarm = Valarm::factory( $config, Vcalendar::DISPLAY, $veventAlarmDtstart );
.. .
$vevent-&gt;setComponent( $valarm );
$vcalendar-&gt;setComponent( $vevent );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VALARM">VALARM</a> object instance.</p>
<p>
Throws InvalidArgumentException on (set)config error.
</p>
<p class="format">Valarm::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
use Kigkonsult\Icalcreator\Valarm;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = new Vevent( $vcalendar-&gt;getConfig());
.. .
$valarm = new Valarm( $vevent-&gt;getConfig());
.. .
$vevent-&gt;setComponent( $valarm );
$vcalendar-&gt;setComponent( $vevent );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vavailability_constr"></a><h4>3.1.1.7 Vavailability</h4>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;Calendar Availability&quot;
</dt>
<dd>
<a href="#VAVAILABILITY">VAVAILABILITY</a> may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VAVAILABILITY is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VAVAILABILITY">VAVAILABILITY</a> object instance
using an <a href="#VCALENDAR">VCALENDAR</a> component factory-method.
</p>
<p class="format">Vcalendar::newVavailability( [ busytype [, [ dtstart [, dtend [, duration ]]]] )</p>
<p class="comment">
busytype = property <a href="#BUSYTYPE">BUSYTYPE</a> string value,
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface datetime value,
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface datetime value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
*) dtend and duration MUST NOT occur in the same <a href="#VAVAILABILITY">VAVAILABILITY</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vavailability = $vcalendar-&gt;newVavailability(
&quot;BYSY&quot;,
&quot;20220101T080000&quot;,
&quot;20220101T170000&quot;
);
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VAVAILABILITY">VAVAILABILITY</a> object instance using a factory-method.
</p>
<p class="format">Vavailability::factory( [ config [, busytype [, [ dtstart [, dtend [, duration ]]]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
busytype = property <a href="#BUSYTYPE">BUSYTYPE</a> string value,
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface datetime value,
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface datetime value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
*) dtend and duration MUST NOT occur in the same <a href="#VAVAILABILITY">VAVAILABILITY</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vavailability = Vavailability::factory(
null,
&quot;BYSY&quot;,
&quot;20220101T080000&quot;,
&quot;20220101T170000&quot;
);
.. .
$vcalendar-&gt;setComponent( $vavailability );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VAVAILABILITY">VAVAILABILITY</a> object instance.</p>
<p class="format">Vavailability::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vavailability;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vavailability = new Vavailability( $vcalendar-&gt;getConfig());
.. .
$vcalendar-&gt;setComponent( $vavailability );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="available_constr"></a><h4>3.1.1.8 Available</h4>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;Calendar Availability&quot;
</dt>
<dd>
<a href="#AVAILABLE">AVAILABLE</a> may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::AVAILABLE is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#AVAILABLE">AVAILABLE</a> object instance
using an <a href="#VAVAILABILITY">VAVAILABILITY</a> component factory-method.
</p>
<p class="format">Vavailability::newAvailable( [ dtstart [, dtend [, duration ]]] )</p>
<p class="comment">
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface datetime value,
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface datetime value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
*) dtend and duration MUST NOT occur in the same <a href="#AVAILABLE">AVAILABLE</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vavailability = $vcalendar-&gt;newVavailability();
.. .
$available = $vavailability-&gt;newAvailable();
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#AVAILABLE">AVAILABLE</a> object instance using a factory-method.
</p>
<p class="format">Available::factory( [ config [, dtstart [, dtend [, duration ]]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
dtstart = property <a href="#DTSTART">DTSTART</a> string|DateTimeInterface datetime value,
dtend = property <a href="#DTEND">DTEND</a> string|DateTimeInterface datetime value *
duration = property <a href="#DURATION">DURATION</a> string|DateInterval value *
*) dtend and duration MUST NOT occur in the same <a href="#AVAILABLE">AVAILABLE</a>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vavailability = Vavailability::factory();
.. .
$available = Available::factory();
.. .
$vavailability-&gt;setComponent( $available );
.. .
$vcalendar-&gt;setComponent( $vavailability );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#AVAILABLE">AVAILABLE</a> object instance.</p>
<p class="format">Available::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vavailability;
use Kigkonsult\Icalcreator\Available;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vavailability = new Vavailability( $vcalendar-&gt;getConfig());
.. .
$available = new Available( $vavailability-&gt;getConfig());
.. .
$vavailability-&gt;setComponent( $available );
.. .
$vcalendar-&gt;setComponent( $vavailability );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="participant_constr"></a><h4>3.1.1.9 Participant</h4>
<p>
Note, <a href="#PARTICIPANT">PARTICIPANT</a>, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::PARTICIPANT is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#PARTICIPANT">PARTICIPANT</a> object instance
using a <a href="#VEVENT">VEVENT</a> /
<a href="#VTODO">VTODO</a> /
<a href="#VJOURNAL">VJOURNAL</a> /
<a href="#VFREEBUSY">VFREEBUSY</a>
component factory-method, used below as &quot;Component&quot;.
</p>
<p class="format">Component::newParticipant( [ participanttype [, calendaraddress ]] )</p>
<p class="comment">
participanttype = property <a href="#PARTICIPANT-TYPE">PARTICIPANT-TYPE</a> string value,
calendaraddress = property <a href="#CALENDAR-ADDRESS">CALENDAR-ADDRESS</a> string CAL-ADDRESS (uri) value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = $vcalendar-&gt;newVevent();
.. .
$participant = $vevent-&gt;newParticipant( Vcalendar::SPONSOR, &quot;hq@acme.com&quot;);
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#PARTICIPANT">PARTICIPANT</a> object instance using a factory-method.
</p>
<p class="format">Participant::factory( [ config [, participanttype [, calendaraddress ]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
participanttype = property <a href="#PARTICIPANT-TYPE">PARTICIPANT-TYPE</a> string value,
calendaraddress = property <a href="#CALENDAR-ADDRESS">CALENDAR-ADDRESS</a> string CAL-ADDRESS (uri) value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = $vcalendar-&gt;newVevent();
.. .
$participant = Participant::factory( null, Vcalendar::SPONSOR, &quot;hq@acme.com&quot;);
.. .
$vevent-&gt;setComponent( $participant );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#PARTICIPANT">PARTICIPANT</a> object instance.</p>
<p class="format">Participant::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
use Kigkonsult\Icalcreator\Participant;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = new Vevent( $vcalendar-&gt;getConfig());
.. .
$participant = new Participant( $vevent-&gt;getConfig());
.. .
$vevent-&gt;setComponent( $participant );
.. .
$vcalendar-&gt;setComponent( $vevent );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vlocation_constr"></a><h4>3.1.1.10 Vlocation</h4>
<p>
Note, <a href="#VLOCATION">VLOCATION</a>, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VLOCATION< is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#PARTICIPANT">VLOCATION</a> object instance
using a <a href="#VEVENT">VEVENT</a> /
<a href="#VTODO">VTODO</a> /
<a href="#VJOURNAL">VJOURNAL</a> /
<a href="#VFREEBUSY">VFREEBUSY</a> /
<a href="#PARTICIPANT">PARTICIPANT</a>
component factory-method, used below as &quot;Component&quot;.
</p>
<p class="format">Component::newVlocation( [ locationType [, name ] ] )</p>
<p class="comment">
locationType = property <a href="#LOCATION-TYPE">LOCATION-TYPE</a> string value
name = property <a href="#NAME">NAME</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = $vcalendar-&gt;newVevent();
.. .
$vlocation = $vevent-&gt;newVlocation();
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#PARTICIPANT">VLOCATION</a> object instance using a factory-method.
</p>
<p class="format">Vlocation:factory( [ config [, locationType [, name ]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
locationType = property <a href="#LOCATION-TYPE">LOCATION-TYPE</a> string value
name = property <a href="#NAME">NAME</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = $vcalendar-&gt;newVevent();
.. .
$vlocation = Vlocation::factory( null, $locationType , $name );
.. .
$vevent-&gt;setComponent( $vlocation );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VLOCATION">VLOCATION</a> object instance.</p>
<p class="format">Vlocation::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
use Kigkonsult\Icalcreator\Vlocation;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = new Vevent( $vcalendar-&gt;getConfig());
.. .
$vlocation = new Vlocation( $vevent-&gt;getConfig());
.. .
$vevent-&gt;setComponent( $vlocation );
.. .
$vcalendar-&gt;setComponent( $vevent );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vresource_constr"></a><h4>3.1.1.11 Vresource</h4>
<p>
Note, <a href="#VRESOURCE">VRESOURCE</a>, described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
may NOT be supported by all calendaring software.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VRESOURCE is available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VRESOURCE">VRESOURCE</a> object instance
using a <a href="#VEVENT">VEVENT</a> /
<a href="#VTODO">VTODO</a> /
<a href="#VJOURNAL">VJOURNAL</a> /
<a href="#VFREEBUSY">VFREEBUSY</a> /
<a href="#PARTICIPANT">PARTICIPANT</a>
component factory-method, used below as &quot;Component&quot;.
</p>
<p class="format">Component::newVresource( [ resourceType [, name ] ] )</p>
<p class="comment">
resourceType = property <a href="#RESOURCE-TYPE">RESOURCE-TYPE</a> string value
name = property <a href="#NAME">NAME</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = $vcalendar-&gt;newVevent();
.. .
$vresource = $vevent-&gt;newVresource();
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VRESOURCE">VRESOURCE</a> object instance using a factory-method.
</p>
<p class="format">Vresource::factory( [ config [, resourceType [, name ]]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
resourceType = property <a href="#RESOURCE-TYPE">RESOURCE-TYPE</a> string value
name = property <a href="#NAME">NAME</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = $vcalendar-&gt;newVevent();
.. .
$vresource = Vresource:factory( null, $resourceType, $name );
.. .
$vevent-&gt;setComponent( $vresource );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VRESOURCE">VRESOURCE</a> object instance.</p>
<p class="format">Vlocation::__construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
use Kigkonsult\Icalcreator\Vresource;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = new Vevent( $vcalendar-&gt;getConfig());
.. .
$vresource = new Vresource( $vevent-&gt;getConfig());
.. .
$vevent-&gt;setComponent( $vresource );
.. .
$vcalendar-&gt;setComponent( $vevent );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="vtimezone_constr"></a><h4>3.1.1.12 Vtimezone</h4>
<p>
The vtimezone component describe, at a minimum, the base offset from <b>UTC</b> for the time zone.
For dates with UTC DATE-TIME, read <a href="#DATE_WITH_UTC_TIME">this</a>!
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VTIMEZONE is available.
</p>
<p>
You can use <a href="#vtimezone_populate">Vtimezone populate</a> to ease up including Vtimezone(s) in a calendar.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VTIMEZONE">VTIMEZONE</a> object instance
using an <a href="#VCALENDAR">VCALENDAR</a> component factory-method.
</p>
<p class="format">Vcalendar::newVtimezone( [ tzid ] )</p>
<p class="comment">
tzid = property <a href="#TZID">TZID</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = $vcalendar-&gt;newVtimezone( &quot;Europe/Stockholm&quot;);
.. .
</p>
<p class="label">Format 2</p>
<p>
Create a new <a href="#VTIMEZONE">VTIMEZONE</a> object instance using a factory-method.
</p>
<p class="format">Vtimezone::factory( [ config [, tzid ]] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
tzid = property <a href="#TZID">TZID</a> string value
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = Vtimezone::factory( null, &quot;Europe/Stockholm&quot; );
.. .
$vcalendar-&gt;setComponent( $vtimezone );
</p>
<p class="label">Format 3</p>
<p>Create a new <a href="#VTIMEZONE">VTIMEZONE</a> object instance.</p>
<p class="format">Vtimezone::_construct( [ config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vtimezone;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = new Vtimezone( $vcalendar-&gt;getConfig());
.. .
$vcalendar-&gt;setComponent( $vtimezone );
.. .
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="standard_daylight_constr"></a><h4>3.1.1.13 Standard / Daylight</h4>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::STANDARD<br>
- Kigkonsult\Icalcreator\Vcalendar::DAYLIGHT<br>
are available.
</p>
<p class="label">Format 1</p>
<p>
Create a new <a href="#VTIMEZONE">VTIMEZONE</a>
<a href="#STANDARD">STANDARD</a> / <a href="#DAYLIGHT">DAYLIGHT</a> object instance
using a VTIMEZONE component factory-method.
</p>
<p class="format">Vtimezone::newStandard()</p>
<p class="format">Vtimezone::newDaylight()</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = $vcalendar-&gt;newVtimezone();
.. .
$standard = $vtimezone-&gt;newStandard();
.. .
$daylight = $vtimezone-&gt;newDaylight();
.. .
</p>
<p class="label">Format 2</p>
<p>Create a new <a href="#VTIMEZONE">VTIMEZONE</a> STANDARD object instance.</p>
<p class="format">Vtimezone::__construct( &quot;standard&quot; [, config ] )</p>
<p class="comment">
config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vtimezone;
use Kigkonsult\Icalcreator\Standard;
use Kigkonsult\Icalcreator\Daylight;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = new Vtimezone( $vcalendar-&gt;getConfig());
.. .
$standard = new Standard( $vtimezone-&gt;getConfig());
.. .
$vtimezone-&gt;setComponent( $standard );
$daylight = new Daylight( $vtimezone-&gt;getConfig());
.. .
$vtimezone-&gt;setComponent( $daylight );
$vcalendar-&gt;setComponent( $vtimezone );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#methodList">[up]</a>
<a id="iCalcreator_object_property_methods"></a><h3>3.1.2 Vcalendar property methods</h3>
<a id="CALSCALE"></a><h4>3.1.2.1 CALSCALE</h4>
<p>
This property defines the <strong>calendar</strong> scale used for the <strong>calendar</strong> information specified in the <strong>iCalendar</strong> object.
</p>
<p>
The default (pre-set) value is &quot;GREGORIAN&quot;.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::CALSCALE is available.
</p>
<h5>Create CALSCALE</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::createCalscale()</p>
<p class="label">Example</p>
<p class="example">
$str = $vcalendar-&gt;createCalscale();
</p>
<h5>Delete CALSCALE</h5>
<p>Remove CALSCALE from calendar.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::deleteCalscale()</p>
<p class="label">Example</p>
<p class="example">
$vcalendar-&gt;deleteCalscale();
</p>
<h5>Get Calscale</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::getCalscale()</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$calscale = $vcalendar-&gt;getCalscale();
</p>
<h5>Set CALSCALE</h5>
<p>Set property value. The default value is "GREGORIAN", it is pre-set.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::setCalscale()</p>
<p class="comment">value = (string) calscale value</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$config = [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ];
$vcalendar = new Vcalendar( $config );
$vcalendar-&gt;setCalscale( &quot;GREGORIAN&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
<a id="METHOD"></a><h4>3.1.2.2 METHOD</h4>
<p>
This property defines the <strong>iCalendar</strong> object method associated with the <strong>calendar</strong> object.
</p>
<p>
METHOD property (value PUBLISH etc.) may be required when importing iCal formatted information
into some calendaring software (MS etc.), as well as <a href="#X-PROPERTY">x-properties</a>
"X-WR-CALNAME", "X-WR-CALDESC" and "X-WR-TIMEZONE"
and the (automatically created) <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::METHOD<br>
- Kigkonsult\Icalcreator\Vcalendar::PUBLISH<br>
- Kigkonsult\Icalcreator\Vcalendar::REQUEST<br>
- Kigkonsult\Icalcreator\Vcalendar::REPLY<br>
- Kigkonsult\Icalcreator\Vcalendar::ADD<br>
- Kigkonsult\Icalcreator\Vcalendar::CANCEL<br>
- Kigkonsult\Icalcreator\Vcalendar::REFRESH<br>
- Kigkonsult\Icalcreator\Vcalendar::COUNTER<br>
- Kigkonsult\Icalcreator\Vcalendar::DECLINECOUNTER<br>
are available.
</p>
<h5>Create METHOD</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::createMethod()</p>
<p class="label">Example</p>
<p class="example">
$str = $vcalendar-&gt;createMethod();
</p>
<h5>Delete METHOD</h5>
<p>Remove METHOD from calendar.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::deleteMethod()</p>
<p class="label">Example</p>
<p class="example">
$vcalendar-&gt;deleteMethod();
</p>
<h5>Get METHOD</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::getMethod();</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vcalendar-&gt;parse();
$method = $vcalendar-&gt;getMethod();
</p>
<h5>Set METHOD</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::setMethod( value )</p>
<p class="comment">value = (string) method value</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vcalendar-&gt;setMethod( Vcalendar::PUBLISH );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
<a id="VERSION"></a><h4>3.1.2.3 VERSION</h4>
<p>
This property specifies the identifier corresponding to the version number of the <strong>iCalendar</strong> specification.
This property is always placed first in the formatted <strong>calendar</strong>.
</p>
<p>
Version is <b>AUTO</b> generated as &quot;2.0&quot; at <strong>calendar</strong> creation.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::VERSION is available.
</p>
<h5>Create Version</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::createVersion()</p>
<p class="label">Example</p>
<p class="example">
$str = $vcalendar-&gt;createVersion();
</p>
<h5>Get Version</h5>
<p>Fetch property value.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::getVersion()</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$version = $vcalendar-&gt;getVersion()
</p>
<h5>Set Version</h5>
<p>Set property value.
Only version 2.0 valid, version is <b>AUTO</b> generated at <strong>calendar</strong> creation.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::setVersion( version )</p>
<p class="comment">version = (string) iCal version</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot;, ] );
$vcalendar-&gt;setVersion(&quot;2.0&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
<a id="iCalcreator_component_object_methods"></a><h3>3.1.3 Vcalendar component object methods</h3>
<a id="deleteComponent"></a><h4>3.1.3.1 deleteComponent</h4>
<p>
Remove component from the Vcalendar instance.
</p>
<p>
Bool false is returned if no component exists or at end-of-components invoking the method consecutive.
</p>
<p class="label">format 1</p>
Remove component with order number (1st=1, 2nd=2).
<p class="format">Vcalendar::deleteComponent( orderNumber )</p>
<p class="comment">orderNumber = (int) order number</p>
<p class="label">format 2</p>
<P>Remove component with component type (e.g. &quot;vevent&quot;) and order 1 alt. suborder number.</p>
<p class="format">Vcalendar::deleteComponent( componentType [, componentSuborderNumber])</p>
<p class="comment">componentType = (string) component type
componentSuborderNumber = (int) order number</p>
<p class="label">format 3</p>
<p>Remove component with <a href="#UID">UID</a>. N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a> components.</p>
<p class="format">Vcalendar::deleteComponent( <a href="#UID">UID</a> )</p>
<p class="label">Example 1</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$vcalendar-&gt;deleteComponent( 1 );
$vcalendar-&gt;deleteComponent( Kigkonsult\Icalcreator\Vcalendar::VTODO, 2 );
$vcalendar-&gt;deleteComponent( &quot;20070803T194810CEST-0123U3PXiX@kigkonsult.se&quot;);
</p>
<p class="label">Example 2</p>
<p>Deleting all components, using format 2 without order number.</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
while( $vcalendar-&gt;deleteComponent( Vcalendar::VEVENT)) {
continue;
}
$vtodo = $vcalendar-&gt;getComponent( Vcalendar::VTODO );
while( $vtodo-&gt;deleteComponent( Vcalendar::VALARM)) {
continue;
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
<a id="getComponent"></a><h4>3.1.3.2 getComponent</h4>
<p>Get (next) component from the Vcalendar instance.</p>
<p>
Bool false is returned if no component exists or at end-of-components invoking the method consecutive.
</p>
<p class="label">format 1</p>
<p>Get next component, until end-of-components.</p>
<p class="format">Vcalendar::getComponent()</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
while( $comp = $vcalendar-&gt;getComponent()) {
.. .
}
</p>
<p class="label">format 2</p>
<P>Get specific component with order number (1st=1, 2nd=2).</p>
<p class="format">Vcalendar::getComponent( orderNumber )</p>
<p class="comment">orderNumber = (int) order number</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
if( $comp = $vcalendar-&gt;getComponent( 1 )) {
.. .
}
</p>
<p class="label">format 3</p>
<p>
Get (first/next) component with component type (until end-of-components) alt.
get specific component with component type and suborder number (1st=1, 2nd=2).
</p>
<p class="format">Vcalendar::getComponent( componentType [, componentSuborderNumber])</p>
<p class="comment">componentType = (string) component type
componentSuborderNumber = (int) order number</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
if( $comp = $vcalendar-&gt;getComponent( Kigkonsult\Icalcreator\Vcalendar::VTODO, 2 )) {
.. .
}
</p>
<p class="label">format 4</p>
<p>
Get (first/next) component with <a href="#UID">UID</a> as key.
(<a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a> components.)
May be used when trying to find (base) component and corresponding <a href="#RECURRENCE-ID">RECURRENCE-ID</a> components.
</p>
<p class="format">Vcalendar::getComponent( <a href="#UID">UID</a> )</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$uid = &quot;20070803T194810CEST-0123U3PXiX@kigkonsult.se&quot;;
if( $comp = $vcalendar-&gt;getComponent( $uid )) {
.. .
}
</p>
<a id="getComponent5"></a>
<p class="label">format 5</p>
<p>
Get (first/next) component based on specific property contents:
<p>
Note, to ease up usage, you will find convenient constants for component names,
properties, config keys etc in (src/)IcalInterface.
</p>
<dl>
<dt>Supported Descriptive Component Properties
<dd><a href="#CATEGORIES">CATEGORIES</a>
<dd><a href="#LOCATION">LOCATION</a>
<dd><a href="#PRIORITY">PRIORITY</a>
<dd><a href="#RESOURCES">RESOURCES</a>
<dd><a href="#STATUS">STATUS</a>
<dd><a href="#SUMMARY">SUMMARY</a>
<dt>Date and Time Component Properties
<dd><a href="#COMPLETED">COMPLETED</a>
<dd><a href="#DTEND">DTEND</a>
<dd><a href="#DUE">DUE</a>
<dd><a href="#DTSTART">DTSTART</a>
<dt>SupportedRelationship Component Properties
<dd><a href="#ATTENDEE">ATTENDEE</a>&nbsp;<sup>*1</sup>
<dd><a href="#CONTACT">CONTACT</a>
<dd><a href="#ORGANIZER">ORGANIZER</a>&nbsp;<sup>*1</sup>
<dd><a href="#RECURRENCE-ID">RECURRENCE-ID</a>
<dd><a href="#RELATED-TO">RELATED-TO</a>
<dd><a href="#URL">URL</a>
<dd><a href="#UID">UID</a>
<dt>Change Management Component Properties
<dd><a href="#CREATED">CREATED</a>
<dd><a href="#DTSTAMP">DTSTAMP</a>
<dd><a href="#LAST-MODIFIED">LAST-MODIFIED</a>
</dl>
<dl>
<dt><sup>*1</sup>
<dd><a href="#ATTENDEE">ATTENDEE</a> and
<a href="#ORGANIZER">ORGANIZER</a> search values must be prefixed by protocol ex. &quot;MAILTO:chair@ical.net&quot;.
</dl>
<p>
For the property &quot;SUMMARY&quot; ,if a search value (any case) exists within property value, a hit exists.
For the other, non-date, properties an exact (strict case) match is required.
</p>
<p>
To select components based on property values, use <a href="#selectComponents2">selectComponents</a> (Format 2).
</p>
<p class="format">Vcalendar::getComponent( search )</p>
<p class="comment">
search = (array) ( *[ propertyName =&gt; uniqueValue ]), multiple array elements are combined by &quot;OR&quot;
propertyName = (string) property name, above
propertyData = (string) unique property value (strict case),
date format &quot;YYYYMMDD&quot; (if any side is DATE, only dates are used),
datetime format &quot;YYYYMMDDTHHMMSS&quot;</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
while( $comp = $vcalendar-&gt;getComponent( [ Vcalendar::RESOURCES =&gt; &quot;PC&quot; ]) {
.. .
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
<a id="getComponents"></a><h4>3.1.3.3 getComponents</h4>
<p>Return (array) Vcalendar instance components.</p>
<p class="label">format</p>
<p class="format">Vcalendar::getComponents( [ compType ] )</p>
<p class="comment">compType : (string) component type
<p class="label">Example</p>
<p>Return all Vevents</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
foreach( $vcalendar-&gt;getComponents( Vcalendar::VEVENT ) as $component ) {
.. .
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
<a id="replaceComponent"></a><h4>3.1.3.4 replaceComponent</h4>
<P>
Replace calendar component in vcalendar based on component property <a href="#UID">UID</a>
(<a href="#VEVENT">EVENT</a> / <a href="#VTODO">VTODO</a> / <a href="#VJOURNAL">VJOURNAL</a> / <a href="#VFREEBUSY">VFREEBUSY</a>).
If not found, inserted last in component chain.
</p>
<p>
In case of multiple components sharing the same UID (ex. a RECURRENCE-ID property altering a recurrence pattern),
the first found is replaced and it may lead to unpredictable result, to use with care.
</p>
<p>
For a <a href="#VTIMEZONE">VTIMEZONE</a> component, a <a href="#TZID">TZID</a> match is required.
</p>
<p>
A successfull replace returns bool true otherwise bool false.
</p>
<p>
Throws InvalidArgumentException/UnexpectedValueException on unknown or not-found component error.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::replaceComponent( component )</p>
<p class="comment">component = (object) component instance</p>
<p class="label">Example</p>
<p class="example">
$vcalendar-&gt;replaceComponent( $component );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
<a id="selectComponents"></a><h4>3.1.3.5 selectComponents</h4>
<p class="label">Format 1</p>
<p>
Selects <a href="#VEVENT">EVENT</a> / <a href="#VTODO">VTODO</a> / <a href="#VJOURNAL">VJOURNAL</a> /
<a href="#VFREEBUSY">VFREEBUSY</a> components from the Vcalendar instance on based on <b>dates</b>
(notice <a href="#date_restraints">date restraints</a>), based on the initial <a href="#DTSTART">DTSTART</a>
property along with the <a href="#RRULE">RRULE</a>, <a href="#RDATE">RDATE</a>, <a href="#EXDATE">EXDATE</a>
and <a href="#EXRULE">EXRULE</a> properties in the component and <a href="#UID">UID</a>-matched component(s)
with <a href="#RECURRENCE-ID">RECURRENCE-ID</a>.
</p>
<p>Requirement:</p>
<ul>
<li>
The property <a href="#DTSTART">DTSTART</a> is required.
If missing in a <a href="#VTODO">VTODO</a> component, <a href="#DTSTART">DUE</a> is used.
</li>
<li>If not using local date, timezone in property <a href="#DTSTART">DTSTART</a> etc. MUST be PHP compliant.</li>
</ul>
<p>Limitations:</p>
<ul>
<li>The values &quot;SECONDLY&quot; / &quot;MINUTELY&quot; / &quot;HOURLY&quot; in the &quot;FREQ&quot; rule part are NOT supported.</li>
<li>
<dl>
<dt>If using components with properties</dt>
<dd>
<a href="#UID">UID</a> in combination with <a href="#SEQUENCE">SEQUENCE</a> and
<a href="#RECURRENCE-ID">RECURRENCE-ID</a>
(i.e. altering an individual instance within the recurrence set),
</dd>
</dl>
the <a href="#RECURRENCE-ID">RECURRENCE-ID</a> parameter &quot;RANGE&quot; (&quot;THISANDPRIOR&quot; / &quot;THISANDFUTURE&quot;)
is NOT (yet) supported.
</li>
<li>only one reccurrence a day</li>
<li>a RDATE reccurrence will overwrite any RRULE reccurrence, on an date (Ymd) basis</li>
<li>no X-CURRENT-DTEND if no DTEND (DUE) is set (below)</li>
<li>
if <a href="https://tools.ietf.org/html/rfc7529" title="Download rfc7529" target="_blank">rfc7529</a>
RRULE RSCALE set, only GREGORY/GREGORIAN/ISO8601 accepted.
</li>
</ul>
<p>
Returns an array with components (events) or bool falses if no found component(s) exists.
Opt. replaced (<a href="#RECURRENCE-ID">RECURRENCE-ID</a>) components has (if missing)
updated <a href="#SUMMARY">SUMMARY</a>,
<a href="#DESCRIPTION">DESCRIPTION</a> and <a href="#COMMENT">COMMENT</a>s properties.
</p>
<p>
Added X-properties in recurrent instances of a <strong>calendar</strong> component:
</p>
<ul>
<li>&quot;X-CURRENT-DTSTART&quot;, TEXT content, <i>&quot;Y-m-d&nbsp;[H:i:s [timezone]]&quot;</i> showing the current start date.</li>
<li>&quot;X-CURRENT-DTEND&quot; alt. &quot;X-CURRENT-DUE&quot; (opt), TEXT content, <i>&quot;Y-m-d&nbsp;[H:i:s [timezone]]&quot;</i> showing the current end date.</li>
<li>&quot;X-RECURRENCE&quot;, the RRULE/RDATE recurrence pattarn number (not in the recurrence start), also after an RECURRENCE-ID change</li>
<li>&quot;X-OCCURENCE&quot;, contains, where applicable, single multi-day recurrence event day number (formatted as 'day X of Y')</li>
</ul>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::X_CURRENT_DTSTART,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_CURRENT_DTEND,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_CURRENT_DUE,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_RECURRENCE,<br>
- Kigkonsult\Icalcreator\Vcalendar::X_OCCURENCE<br>
are available.
</p>
<p>
Throws InvalidArgumentException on argument error, Exception on DateTime/DateInterval error.
</p>
<p>
The following recur rule sets has improved base selects :
</p>
<dl>
<dt>FREQ=DAILY</dt>
<dd>BYDAY opt, only fixed weekdays ex. &quot;TH&quot;, not &quot;-1TH&quot;</dd>
<dd>BYMONTH opt</dd>
<dd>BYMONTHDAY opt</dd>
<dd>BYSETPOS, only if BYMONTH or BYMONTHDAY is set</dd>
<dt>FREQ=WEEKLY</dt>
<dd>1
<ul>
<li>BYMONTH opt</li>
</ul>
</dd>
<dd>2
<ul>
<li>BYDAY req, only fixed weekdays ex. &quot;TH&quot;, not &quot;-1TH&quot;</li>
<li>BYMONTH opt</li>
</ul>
</dd>
<dt>FREQ=MONTHLY</dt>
<dd>1
<ul>
<li>BYDAY opt, only fixed weekdays ex. &quot;TH&quot;, not &quot;-1TH&quot;</li>
<li>BYMONTH opt, BYMONTHDAY opt</li>
<li>BYSETPOS opt, only if BYMONTHDAY is set</li>
</ul>
</dd>
<dd>2
<ul>
<li>BYDAY req</li>
<li>BYMONTH opt</li>
<li>BYSETPOS opt</li>
</ul>
</dd>
<dt>FREQ=YEARLY</dt>
<dd>1
<ul>
<li>BYMONTH opt</li>
<li>BYMONTHDAY opt</li>
</ul>
</dd>
<dd>2
<ul>
<li>BYMONTH opt</li>
<li>BYDAY req</li>
<li>BYSETPOS opt</li>
</ul>
</dd>
</dl>
<p class="format">Vcalendar::selectComponents([ startYear, startMonth, startDay
[, endYear, endMonth, endDay
[, cType [, flat [, any [, split]]]]]])
</p>
<p class="comment">startYear : (int) start year (4*digit), default current year
(object) DateTimeInterface instance, start date<sup>*</sup>
startMonth : (int) start month (1-2*digit), default current month
(object) DateTimeInterface instance, end date<sup>*</sup>
startDay : (int) start day (1-2*digit), default current day
endYear : (int) end year (4*digit), default startYear
endMonth : (int) end month (1-2*digit), default startMonth
endDay : (int) end day (1-2*digit), default startDay
cType : (mixed) <strong>calendar</strong> component type(-s), (string/array)
(&quot;vevent&quot;, &quot;vtodo&quot;, &quot;vjournal&quot;, &quot;vfreebusy&quot;)
(bool) false (default) =&gt; all
flat : (bool) true =&gt; output : array[] (ignores split)
component where recurrence pattern exists within period
false (default) =&gt; output : array[Year][Month][Day][]
any : (bool) true (default) =&gt; select components with recurrence within period
false =&gt; only components that starts (DTSTART) within period
split : (bool) true (default) =&gt; one component copy for every day it occurs
within the period
false =&gt; one occurrence of component in output array,
start date/recurrence (start) date
<sup>*</sup>When using DateTimeInterface instances, other start/end arguments are ignored.
valid flat any split
combinations (defaults in upper case)
1 false true true
2 false true false
3 false false [false] (split set to false if flat=false and any=false)
4 true true [false] (split set to false if flat=true)
5 true false [false] (split set to false if flat=true)
If flat is set to false, output array is sorted in 'Y-m-d h-i-s' asc. order.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot;, ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$events_arr = $vcalendar-&gt;selectComponents(
2007, 11, 1, 2007, 11, 30, Vcalendar::VEVENT
);
// <span class="comment">select all events occurring 1-30 nov. 2007</span>
foreach( $events_arr as $year =&gt; $year_arr ) {
foreach( $year_arr as $month =&gt; $month_arr ) {
foreach( $month_arr as $day =&gt; $day_arr ) {
foreach( $day_arr as $event ) {
$currddate = $event-&gt;getDtstart();
<span class="comment">// if member of a recurrence set
// X-prop &quot; x-current-dtstart&quot; returns
// &lt;(string) date(&quot;Y-m-d&nbsp;[H:i:s][timezone/UTC&nbsp;offset]&quot;)&gt;</span>
$startDate = $event-&gt;getDtstart(;
$summary = $event-&gt;getSummary();
$description = $event-&gt;getDescription();
.. .
</p>
<a id="selectComponents2"></a>
<p class="label">format 2</p>
<p>
Using this format, the Vcalendar method selects components based on specific property value(-s).
</p>
<dl>
<dt>Supported Descriptive Component Properties
<dd><a href="#CATEGORIES">CATEGORIES</a>
<dd><a href="#LOCATION">LOCATION</a>
<dd><a href="#PRIORITY">PRIORITY</a>
<dd><a href="#RESOURCES">RESOURCES</a>
<dd><a href="#STATUS">STATUS</a>
<dd><a href="#SUMMARY">SUMMARY</a>
<dt>Supported Relationship Component Properties
<dd><a href="#ATTENDEE">ATTENDEE</a>&nbsp;<sup>*1</sup>
<dd><a href="#CONTACT">CONTACT</a>
<dd><a href="#ORGANIZER">ORGANIZER</a>&nbsp;<sup>*1</sup>
<dd><a href="#RELATED-TO">RELATED-TO</a>
<dd><a href="#URL">URL</a>
<dd><a href="#UID">UID</a>
</dl>
<dl>
<dt><sup>*1</sup>
<dd><a href="#ATTENDEE">ATTENDEE</a> and
<a href="#ORGANIZER">ORGANIZER</a> search values must be prefixed by (upper case) protocol like &quot;MAILTO:chair@ical.net&quot;.
</dl>
<p>
Note, to ease up usage, you will find convenient constants for component names,
properties, config keys etc in (src/)IcalInterface.
</p>
<p>
For the property <a href="#SUMMARY">SUMMARY</a>, if a search value (any case) exists within property value, a hit is found.
For the other properties an exact (strict case) match is required. Multiple search properties may coexist.
</p>
<p>
To retrieve specific Vcalendar instance property values,
searching <b>ALL</b> components,
Vcalendar::getProperty() may work.
</p>
<p>
To get components based on property values, use <a href="#getComponent5">getComponent</a> (Format 5).
</p>
<p class="format">Vcalendar::selectComponents( searchArray )</p>
<p>Outputs an array of matched (unique) components in <a href="#UID">UID</a> order.</p>
<p class="comment">searchArray : (array) *( propertyName =&gt; propertyValue )
propertyName : (string) above (any case)
propertyValue : (string) value / (array) ( *[ (string) value] )
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$searchArray = [ Vcalendar::PRIORITY =&gt; [ 1, 2, 3, 4 ]];
$highPrioArr = $vcalendar-&gt;selectComponents( $searchArray );
// <span class="comment">select all components with PRIORITY set to high (1-4)</span>
if( ! empty( $highPrioArr )) {
$highPrioCal = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$highPrioCal-&gt;setXProp( Vcalendar::X_WR_CALDESC, "High priority events" );
foreach( $highPrioArr as $highPrioComponent ) {
$highPrioCal-&gt;setComponent( $highPrioComponent );
}
$highPrioCal-&gt;returnCalendar();
} // end if
exit;
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
<a id="setComponent"></a><h4>3.1.3.6 setComponent</h4>
<p>
Replace or update component in the Vcalendar instance.
Also add a <strong>calendar</strong> component to the Vcalendar instance
when <strong>calendar</strong> component is created with the procedural (<b>non</b>-factory) method,
see example <a href="#vevent_constr">VEVENT</a>, format 2.
</p>
<p>A successful update returns true.</p>
<p>
The method throws InvalidArgumentException on unknown component.
</p>
<p class="label">format 1</p>
<p>Insert last in component chain.</p>
<p class="format">Vcalendar::setComponent( component )
Vcalendar::addComponent( component ) // <span class="comment">alias</span></p>
<p class="comment">component = (object) Vcalendar component instance</p>
<p class="comment">addComponent, may be removed in future versions.</p>
<p class="label">format 2</p>
<p>
Insert/replace component with order number (1st=1, 2nd=2).
If replace and orderNumber is not found, component is inserted last in chain.
</p>
<p class="format">Vcalendar::setComponent( component, orderNumber )</p>
<p class="comment">component = (object) Vcalendar component instance
int = (int) order numder</p>
<p class="label">format 3</p>
<p>
Replace component with component type and 1st alt. component order number.
If orderNumber is not found, component is inserted last in chain.
</p>
<p class="format">Vcalendar::setComponent( component, componentType [, componentSuborderNo])</p>
<p class="comment">component = (object) Vcalendar component instance
componentType = (string) component type
componentSuborderNo = (int) component Suborder Number</p>
<p class="label">format 4</p>
<p>
Replace component with <a href="#UID">UID</a>.
N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a> components.
If <a href="#UID">UID</a> is not found, component is inserted last in chain.
</p>
<p>
As described in <a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank">rfc9074</a>
&quot;VALARM Extensions for iCalendar&quot;,
<a href="#VALARM">ALARM</a> may have <a href="#UID">UID</a>,
may NOT be supported by all calendaring software.
</p>
<p class="format">Vcalendar::setComponent( component, <a href="#UID">UID</a> )</p>
<p class="comment">component = (object) Vcalendar component instance</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$vevent = vcalendar-&gt;getComponent( 1 ); // <span class="comment">fetch first EVENT</span>
$vevent-&gt;setDtstart(
new DateTime( &quot;2006-12-24 19:30:00&quot; )
); // <span class="comment">update <a class="ref" href="#DTSTART">DTSTART</a> property</span>
$vcalendar-&gt;setComponent( $vevent, 1 ); // <span class="comment">replace first component</span>
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
<a id="iCalcreator_calendar_methods"></a><h3>3.1.4 Vcalendar calendar methods</h3>
<a id="parse_merge"></a><h4>3.1.4.1 parse and merge</h4>
<p>
Parse string <strong>calendar</strong> content (or iCal file(-s)) into a single Vcalendar instance (components, properties and parameters),
including multiple vcalendars (within a single iCal calendar) parse, e.g. Oracle Calendar exports.
</p>
<p>
If missing, component property <a href="#UID">UID</a> is created when parsing.
</p>
<p>
Minor errors like non-standard line-endings, initial and trailing empty lines
as well as files without proper end line(-s) (i.e. missing component end and/or &quot;END:CALENDAR&quot; iCal directives)
are managed.
</p>
<p>
Throws InvalidArgumentException on argument error, UnexpectedValueException on parse error.<br>
Note, parsing an empty calendar (ie without <a href="#VEVENT">EVENT</a>s etc) will NOT lead to error.
To count components, before and after parse, use <a href="#countComponents">countComponents</a> method.
</p>
<p>
Non-standard iCal properties (except the <a href="#X-PROPERTY">X-properties</a>) are ignored.
</p>
<p>
For parsing an internet URL resource, <a href="https://github.com/iCalcreator/UrlRsrc" target="_blank" title="download UrlRsrc">UrlRsrc</a> can be used.
</p>
<p class="label">Format</p>
<p>
The method returns the class instance (static).
</p>
<p class="format">Vcalendar::parse( [ textToParse ] )</p>
<p class="comment">textToParse = (string) calendarContent
ex. result from - file_get_contents( &quot;filename&quot;)
(array) calendarContent
ex. result from - file( &quot;filename&quot;, FILE_IGNORE_NEW_LINES )
</p>
<p class="label">parse example 1</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
// <span class="comment">set Your unique id, </span>
// <span class="comment">site info for the Vcalendar PRODID property</span>
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot;, ] );
// <span class="comment">get iCal contents from file</span>
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
// <span class="comment">parse iCal contents</span>
$vcalendar-&gt;parse( $iCalContent );
</p>
<p class="label">parse example 2</p>
<p>
PHP <span class="example">file_get_contents</span> may work on external resources.
</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
// <span class="comment">set Your unique id, </span>
// <span class="comment">site info for the Vcalendar PRODID property</span>
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
// <span class="comment">get iCal contents from external resource</span>
$iCalContent = file_get_contents( &quot;https://www.ical.net/calendars/calendar.ics&quot; );
// <span class="comment">parse iCal contents</span>
$vcalendar-&gt;parse( $iCalContent );
</p>
<p class="label">parse example 3</p>
<p>
Here using <a href="https://github.com/iCalcreator/UrlRsrc" target="_blank" title="download UrlRsrc">UrlRsrc</a> to download an internet (URL) resource.
</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Http\UrlRsrc;
// <span class="comment">set Your unique id, </span>
// <span class="comment">site info for the Vcalendar PRODID property</span>
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
// <span class="comment">get iCal contents from external resource</span>
$iCalContent = UrlRsrc::getContent( &quot;https://www.ical.net/calendars/calendar.ics&quot; );
// <span class="comment">parse iCal contents</span>
$vcalendar-&gt;parse( $iCalContent );
</p>
<p class="label">parse example 4</p>
<p>
Parse an array with iCal formatted rows.
</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$str = [
&quot;BEGIN:VCALENDAR&quot;,
&quot;PRODID:-//kigkonsult.se//NONSGML kigkonsult.se iCalcreator 2.41.70//&quot;,
&quot;VERSION:2.0&quot;,
&quot;BEGIN:VEVENT&quot;,
&quot;DTSTART:20101224T190000Z&quot;,
&quot;DTEND:20101224T200000Z&quot;,
&quot;DTSTAMP:20101020T103827Z&quot;,
&quot;UID:20101020T113827-1234GkdhFR@test.org&quot;,
&quot;DESCRIPTION:example&quot;,
&quot;END:VEVENT&quot;,
&quot;END:VCALENDAR&quot;
];
$vcalendar-&gt;parse( $str );
</p>
<p class="label">merge example</p>
<p>
Parse two iCal files into one.
</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;file1.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$iCalContent = file_get_contents( &quot;file2.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
file_put_contents(
&quot;icalmerge.ics&quot;,
$vcalendar-&gt;createCalendar(),
LOCK_EX
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_calendar_methods">[up]</a>
<a id="createCalendar"></a><h4>3.1.4.2 createCalendar</h4>
Generate and return (string) <strong>calendar</strong>.
<p class="label">Format</p>
<p class="format">Vcalendar::createCalendar()</p>
<p class="label">Example</p>
<p class="example">
$str = $vcalendar-&gt;createCalendar();
echo $str;
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_calendar_methods">[up]</a>
<a id="returnCalendar"></a><h4>3.1.4.3 returnCalendar</h4>
<p>
Redirect the Vcalendar instance content to user browser.
Filename, addressed to browser, is automatically generated if missing or not set,
the filename will look like it is set using<br>
</p>
<p class="example">
$filename = date( &quot;YmdHis&quot; ).&quot;.ics&quot;</p>
<p>
The method do not stop PHP script (exit), returns (bool) true on success.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::returnCalendar( [ utf8Encode [, gzip [, cdType [, fileName ]]]] )</p>
<p class="comment">utf8Encode = (bool) true: utf8 encoded output,
false: (default) no encoding
gzip = (bool) true: gzip compressed output
Header &quot;Content-Length&quot; only sent when gzip=true
false: (default) no compressing
cdType = (bool) true: (default) Content-Disposition: attachment
false: Content-Disposition: inline
fileName = (string) returned file Name</p>
<p class="label">Example 1</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vevent = $vcalendar-&gt;newVevent()
-&gt;setDtstart(
new DateTime(
&quot;2007-04-01 19:00:00&quot;,
new DateTimezone( &quot;Europe/Stockholm&quot; )
)
)
-&gt;setDuration( new DateInterval( &quot;PT1H&quot; ))
-&gt;setLocation( &quot;Central Plaza&quot; )
-&gt;setSummary( &quot;PHP summit&quot; );
$vcalendar-&gt;returnCalendar();
exit;
</p>
<p class="label">Example 2</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$utf8Encode = true;
if( isset( $_SERVER[&quot;HTTP_ACCEPT_ENCODING&quot;] ) &amp;&amp;
( false !== strpos( strtolower( $_SERVER[&quot;HTTP_ACCEPT_ENCODING&quot;] ), &quot;gzip&quot; ))) {
$gzip = true;
}
else {
$gzip = false;
}
$vcalendar-&gt;returnCalendar( $utf8Encode, $gzip );
exit;
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_calendar_methods">[up]</a>
<a id="sort"></a><h4>3.1.4.4 sort</h4>
<p class="label">Format 1</p>
<p>
Sort created/parsed <strong>calendar</strong> components on the following (prioritized) keys:<br>
1 - X-CURRENT-DTSTART - X-CURRENT-DTEND/X-CURRENT-DUE<br>
&nbsp;&nbsp;&nbsp;&nbsp;(if created in Vcalendar method <a href="#selectComponents">selectComponents</a>)<br>
1 - <a href="#DTSTART">DTSTART</a> + <a href="#DTEND">DTEND</a> alt. <a href="#DURATION">DURATION</a> (where exists)<br>
1 - <a href="#DTSTART">DTSTART</a> + <a href="#DUE">DUE</a> alt. <a href="#DURATION">DURATION</a> (where exists)<br>
1 - <a href="#DTSTART">DTSTART</a> (if exists)<br>
2 - <a href="#CREATED">CREATED</a> / <a href="#DTSTAMP">DTSTAMP</a><br>
3 - <a href="#UID">UID</a><br>
A date value, like &quot;DTSTART;VALUE=DATE:20120717&quot;, are sorted before a datetime value.<br>
<a href="#VTIMEZONE">VTIMEZONE</a> component(-s) is always placed first (ordered by <a href="#TZID">TZID</a>). The
<a href="#VTIMEZONE">STANDARD</a>&nbsp;/&nbsp;<a href="#VTIMEZONE">DAYLIGHT</a>&nbsp; sub-components are sorted (on asc. key <a href="#DTSTART">DTSTART</a>) when using
<a href="#createCalendar">createCalendar</a> method (or <a href="#returnCalendar">returnCalendar</a>).
<br>
Sub-components, if exists, ex.<a href="#VALARM">ALARM</a>, are not sorted.
</p>
<p class="format">Vcalendar::sort()</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$vcalendar-&gt;sort();
$vcalendar-&gt;returnCalendar();
exit;
</p>
<a id="sort2"></a>
<p class="label">Format 2</p>
<p>
Sort created/parsed <strong>calendar</strong> components based on specific property values and ascending order.
If a property is not set in component, an empty sort key is used (i.e. sorted first).
</p>
<p class="format">Vcalendar::sort( sortArgument )</p>
<p class="comment">sortArgument: (string) &quot;<a href="#ATTENDEE">ATTENDEE</a>&quot; <sup>*</sup> / &quot;<a href="#CATEGORIES">CATEGORIES</a>&quot; <sup>*</sup> / &quot;<a href="#CONTACT">CONTACT</a>&quot; <sup>*</sup> / &quot;<a href="#DTSTAMP">DTSTAMP</a>&quot; /
&quot;<a href="#LOCATION">LOCATION"</a>&quot; / &quot;<a href="#ORGANIZER">ORGANIZER</a>&quot; / &quot;<a href="#PRIORITY">PRIORITY</a>&quot; /
&quot;<a href="#RESOURCES">RESOURCES</a>&quot; <sup>*</sup> / &quot;<a href="#STATUS">STATUS</a>&quot; / &quot;<a href="#SUMMARY">SUMMARY</a>&quot; / &quot;<a href="#URL">URL</a>&quot; / &quot;<a href="#UID">UID</a>&quot; <sup>**</sup>.
<p class="comment"><sup>*) </sup> For a property where multiple occurrence may exist (<a href="#ATTENDEE">ATTENDEE</a>, <a href="#CATEGORIES">CATEGORIES</a>, <a href="#CONTACT">CONTACT</a>, <a href="#RESOURCES">RESOURCES</a>) lowest (alphabetic) value is used as sort key.</p>
<p class="comment"><sup>**)</sup> For multiple components with the same <a href="#UID">UID</a>, components with <a href="#RECURRENCE-ID">RECURRENCE-ID</a> / <a href="#SEQUENCE">SEQUENCE</a> set are sorted first (on asc. values) and components without <a href="#RECURRENCE-ID">RECURRENCE-ID</a> last.</p>
<p>
Note, to ease up usage, you will find convenient constants for component names,
properties, config keys etc in (src/)IcalInterface.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_calendar_methods">[up]</a>
<a id="countComponents"></a><h4>3.1.4.5 countComponents</h4>
<p>
The method returns (int) number of components in valendar.
Ex. usage counting components, before and after parse.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::countComponents()</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_calendar_methods">[up]</a>
<a id="iCalcreatorVersion"></a><h4>3.1.4.6 iCalcreatorVersion</h4>
<p>
This static class method returns the iCalcreator class version number.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::ICALCREATOR_VERSION is available.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::iCalcreatorVersion()</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_calendar_methods">[up]</a>
<a id="valendarVtimezonePopulate"></a><h4>3.1.4.7 vtimezonePopulate</h4>
<p>
Adds populated Vtimezone to calendar with base from arguments or calendar data.
</p>
<p>
A shortcut using <a href="#vtimezone_populate">Util/VtimezonePopulateFactory::process</a> method.
</p>
<p>
Return Vcalendar instance.
</p>
<p>
Throws Exception on invalid (<em>PHP</em>) timezone.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::vtimezonePopulate( [ timezone [, xprops, [ start [, end ]]]] )</p>
<p class="comment">timezone = (string|array) valid timezone(s), acceptable by <em>PHP</em> DateTimeZone
xprops = (array) ( *[ x-propName =&gt; value ] ), timezone non-standard properties
from = DateTimeInterface | (int) timestamp, period start date<sup>*</sup>
to = DateTimeInterface | (int) timestamp, period end date<sup>*</sup>
</p>
<p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_calendar_methods">[up]</a>
<a id="iCalcreator_configuration_methods"></a><h3>3.1.5 Vcalendar configuration</h3>
<a id="configKeys"></a><h4>3.1.5.1 configuration keys</h4>
<p>
Note, to ease up usage, you will find convenient constants for config keys etc in (src/)IcalInterface.
</p>
<table>
<tr>
<td class="bl bb">key</td>
<td class="bl bb"><strong>calendar</strong></td>
<td class="bl bb">component</td>
<td class="bl bb">remark</td>
</tr>
<tr>
<td class="bl bb"><a class="ref" href="#allowEmpty">allowEmpty</a></td>
<td class="bl bb center">*</td>
<td class="bl bb center">*</td>
<td class="bl bb ref">&nbsp;</td>
</tr>
<tr>
<td class="bl bb"><a class="ref" href="#Compsinfo">Compsinfo</a></td>
<td class="bl bb center">*</td>
<td class="bl bb center">*</td>
<td class="bl bb ref">getConfig only</td>
</tr>
<tr>
<td class="bl bb"><a class="ref" href="#Language">Language</a></td>
<td class="bl bb center">*</td>
<td class="bl bb center">*</td>
<td class="bl bb ref">&nbsp;</td>
</tr>
<tr>
<td class="bl bb"><a class="ref" href="#setPropertyNames">setPropertyNames</a></td>
<td class="bl bb center">&nbsp;</td>
<td class="bl bb center">*</td>
<td class="bl bb ref">getConfig only</td>
</tr>
<tr>
<td class="bl bb"><a class="ref" href="#Unique_id">Unique_id</a></td>
<td class="bl bb center">*</td>
<td class="bl bb center">*</td>
<td class="bl bb ref">&nbsp;</td>
</tr>
</table>
<br>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="getConfig"></a><h4>3.1.5.2 getConfig</h4>
<p class="format">Vcalendar::getConfig( [ key ] )</p>
<p class="comment">key = (string) config key</p>
<p class="label">Example 1</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
.. .
$uniqueId = $vcalendar-&gt;getConfig( Vcalendar::UNIQUE_ID );
.. .
</p>
<p class="label">Example 2</p>
<p class="example">
.. .
$config = $vcalendar-&gt;getConfig();
.. .
</p>
<p class="comment">Output= [
*( string key =&gt; mixed value )
]
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="initConfig"></a><h4>3.1.5.3 calendar/component initialization</h4>
<p class="label">Format</p>
<p>Create a new Vcalendar object instance.</p>
<p class="format">Vcalendar::vcalendar( [ config ] )</p>
<p class="comment">config = (array) ( *[, key =&gt; value] )
key = (string) config key
value = (mixed) config value</p>
<p class="label">Example 1</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
</p>
<p>Create a new <strong>calendar</strong> component.</p>
<p class="format">Vcalendar::component( [ config ] )</p>
<p class="comment">config = (array) ( key =&gt; value *[, key =&gt; value] )
key = (string) config key
value = (mixed) config value</p>
<p class="label">Example 2</p>
<p class="example">
use Kigkonsult\Icalcreator\Vevent;
$config = [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ];
$vevent = new Vevent( $config );
</p>
<p class="label">Example 3</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
.. .
$config = $vcalendar-&gt;getConfig();
$vevent = new Vevent( $config );
.. .
</p>
<p>
Only component relevant configuration are set.
If using a <a href="#vevent_constr">component factory method</a>, configuration is set automatically.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="setConfig"></a><h4>3.1.5.4 setConfig</h4>
<p>A successful &quot;setConfig&quot; returns true.</p>
<p class="label">Format 1</p>
<p class="format">Vcalendar::setConfig( [ config ] )</p>
<p class="comment">config = (array) ( key =&gt; value *[, key =&gt; value] )
key = (string) config key
value = (mixed) config value</p>
<p class="label">Example 1</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar();
$config = [
Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot;,
];
$vcalendar-&gt;setConfig( $config );
</p>
<p class="label">Format 2</p>
<p class="format">Vcalendar::setConfig( key, value )</p>
<p class="comment">key = (string) config key
value = (mixed) config value</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar();
$vcalendar-&gt;setConfig( Vcalendar::UNIQUE_ID, &quot;kigkonsult.se&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="allowEmpty"></a><h4>3.1.5.5 Allow empty components</h4>
<p>
Allow or reject empty <strong>calendar</strong> properties. Used in <a href="#createCalendar">createCalendar</a>, <a href="#returnCalendar">returnCalendar</a> or
create&lt;Property&gt; methods, creating [RFC5545] formats.
</p>
<p>
Default true (allow).
</p>
<p>
There is a convenient config key constant available: Vcalendar::ALLOWEMPTY.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="Compsinfo"></a><h4>3.1.5.6 Component information</h4>
<p>Only to use with Vcalendar method getConfig.</p>
<p>
Get information about the Vcalendar instance components. Returns array with basic information
about all components (in array format) within the Vcalendar instance.
</p>
<p class="comment">Output = [ *compinfo ]
compinfo = [
&quot;ordno&quot; =&gt; int ordno,
// <span class="commsnt">order number (1st=1, 2nd=2..)</span>
&quot;type&quot; =&gt; string type,
// <span class="comment">component type (vevent, vtodo</span>
&quot;uid&quot; =&gt; string uid,
// <span class="comment">component <a href="#UID">UID</a> (not for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a>)</span>
&quot;props&quot; =&gt;, [ *( propertyName =&gt; Property count ) ],
// <span class="comment">for every set property</span>
&quot;sub&quot; =&gt; [ *compinfo ] )
// <span class="comment">if subcomponents exists, an array for each subcomponent</span></p>
]
<p>
There is a convenient config key constant available: Vcalendar::COMPSINFO.
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$compsinfo = $vcalendar-&gt;getConfig( Vcalendar::COMPSINFO );
foreach( $compsinfo as compinfo) {
echo &quot; order number : &quot; . $compinfo[&quot;ordno&quot;].&quot;&lt;br/&gt;&quot;;
echo &quot; type : &quot; . $compinfo[&quot;type&quot;].&quot;&lt;br/&gt;&quot;;
echo &quot; UID : &quot; . $compinfo[&quot;uid&quot;].&quot;&lt;br/&gt;&quot;;
foreach( $compinfo[&quot;props&quot;] as $propertyName =&gt; $propertyCount ) {
echo &quot; $propertyName = $propertyCount&quot;;
if( is_array( $compinfo[&quot;sub&quot;] )) {
foreach( $compinfo[&quot;sub&quot;] as $subcompinfo ) {
echo &quot; order number : &quot; . $subcompinfo[&quot;ordno&quot;].&quot;&lt;br/&gt;&quot;;
/* .. dito if subcomponents exists */
}
} // end foreach
} // end foreach
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="Language"></a><h4>3.1.5.7 Language</h4>
<p>
Language for the Vcalendar instance and component TEXT value properties as defined in [RFC5546].
</p>
<p>
Default empty.
</p>
<p>
If NOT set in TEXT property parameters, language from component instance &quot;setConfig( &quot;language&quot;, ..)&quot; method will be used, if set,
otherwise language from <strong>calendar</strong> method &quot;setConfig( &quot;language&quot;, ..)&quot; will be used, if set.
</p>
<p>
The <strong>calendar</strong> property PRODID is always recreated when setting (<strong>calendar</strong>) language
(, note <a href="#Unique_id">Unique_id</a>, below).
</p>
<p>
There is a convenient config key constant available: Vcalendar::LANGUAGE.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="setPropertyNames"></a><h4>3.1.5.8 setPropertyNames</h4>
<p>
Returns array of property names for all set properties in component. &quot;X-PROP&quot; will be used when <a href="#X-PROPERTY">X-properties</a> are set.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="Unique_id"></a><h4>3.1.5.9 Unique_id</h4>
<p>
&quot;Unique_id&quot; is used in <strong>calendar</strong> property PRODID, created automatically.
</p>
<p class="quotes">PRODID
The identifier is RECOMMENDED to be the identical syntax to the [RFC 822] addr-spec.
A good method to assure uniqueness is to put the domain name or a domain literal IP address of the host on which
</p>
<p>
Default AUTOMATICALLY generated by using <em>PHP</em> function gethostbyname( $_SERVER[&quot;SERVER_NAME&quot;] )
when running in a web server environment or &quot;localhost&quot; when using command line interface.
Used when setting other (domain) name than server name.
</p>
<p>
The <strong>calendar</strong> property PRODID is always recreated when setting unique_id.
</p>
<p>
There is a convenient config key constant available: Vcalendar::UNIQUE_ID.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
<a id="Calendar_component_object_property_function_list"></a><h2>3.2 Component property methods</h2>
<p>
All iCalcreator component object property methods for get/set data.<br>
For property format in detail, see
<a href="https://tools.ietf.org/html/rfc5545" title="RFC5545" target="_blank">RFC5545</a>
&quot;Internet Calendaring and Scheduling Core Object Specification (iCalendar)&quot;.
</p>
<a id="date_restraints"></a><h3>3.2.1 Date restraints</h3>
<a id="DATE_WITH_UTC_TIME"></a>
<p>
Notice for properties and VALUE=DATE-TIME in <b>UTC</b> timezone.
<p class="quotes">RFC5545:
The date with UTC time, or absolute time,
is identified by a LATIN CAPITAL LETTER Z suffix character (US-ASCII decimal 90),
the UTC designator, appended to the time value.
For example, the following represents January 19, 1998, at 0700 UTC:
</p>
<p class="quotes">DTSTART:19980119T070000Z</p>
<p class="quotes">The TZID property parameter MUST <b>NOT</b> be applied to DATE-TIME properties
whose time values are specified in UTC timezone.
</p>
<p>
Due to a limitation in <em>PHP</em> date functions (on 32 bit systems),
a date (ex. while setting <a href="#DTSTART">DTSTART</a> property)
before 1970 or after GMT may force a <em>PHP</em> date function to generate an error or set date to &quot;January 1 1970&quot;.
</p>
<p class="comment">string date(time) formats:
&quot;20110625&quot;, &quot;2011-06-25&quot;, &quot;2011/06/26&quot;
&quot;20110625051015&quot;, &quot;20110625 051015&quot;
&quot;20110625T051015&quot;, &quot;20110625t051015&quot;
&quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
&quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
Other string formats, acceptable by <em>PHP</em> strtotime function, may work.
Any trailing characters, will be interpreted as offset/timezone.
Input string dates with timezone should have a space character between datePart and timezonePart.
</p>
<p>
If a DateTime instance used as (date[time]) property input (to recommend),
opt. param TZID (timezone) should match
or not be set at all.
</p>
<p>
As of 2.41.60, GitHub#103,
using a non-PHP complient (ex ms) timezone in a date property string value input
or in a TZID parameter
may be accepted and converted to a corr. PHP timezone but may result in an unpredictable one.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="propValueParam"></a><h3>3.2.2 Property value/params</h3>
<p>
From 2.41.36 all (but
<a href="#VCALENDAR">VCALENDAR</a>
<a href="#CALSCALE">CALSCALE</a>,
<a href="#METHOD">METHOD</a> and
<a href="#VERSION">VERSION</a>)
properties value and parameters
are stored in a (class) Pc instance,
changed from a PHP type array to an somewhat restricted ArrayObject extend class, Pc.
</p>
<p>
The <span class="format"> component::get&lt;Property&gt;( true )</span> method output
is an cloned Pc instance with property contents.<br>
For properties where multiple occurences are allowed (ex <a href="#COMMENT">COMMENT</a>),<br>
format is <span class="format"> component::get&lt;Property&gt;( propOrderNo/null, true );</span><br>
The current property contents will not be affected of any output Pc instance changes.<br>
Parameter (&quot;params&quot;) keys always in uppercase,
</p>
<p>An pre-2.41.36 get-example, still works in post-2.41.36.</p>
<p class="example">
.. .
$output = $event->getSummary( true );
$value = $output[&quot;value&quot;];
$params = $output[&quot;params&quot;];
.. .
</p>
<p>
All property set-methods (but <a href="#VCALENDAR">VCALENDARs</a>, above) accepts
Pc class instance as first (and only) argument.
</p>
<p>An post-2.41.36 get/set-example, get-methods works as in example above.</p>
<p class="example">
.. .
$output = $event->getSummary( true );
$value = $output->value;
$params = $output->params;
.. .
$event->setSummary( Pc::factory( $value, $params ));
.. .
</p>
<p>Pc class methods :</p>
<dl>
<dt><span class="format">Pc::factory( [ value [, params ]] )</span></dt>
<dd>Pc class factory (static) method</dd>
<dd><span class="comment">value = mixed </span></dd>
<dd><span class="comment">params = array </span></dd>
<dd>Return class instance</dd>
<dt><span class="format">Pc::getAsArray()</span></dt>
<dd>(Pc::getArrayCopy() alias)</dd>
<dd>return property (key/value) assoc array</dd>
<dd><br></dd>
<dt><span class="format">Pc::isset()</span></dt>
<dd>Return bool true if property value property is set, i.e not null</dd>
<dt><span class="format">Pc::getValue()</span></dt>
<dd>Return property value, false if not set</dd>
<dt><span class="format">Pc::setEmpty()</span></dt>
<dd>Set (reset) to &quot;empty&quot; state (property value &quot;&quot; params [] )</dd>
<dd>Return class instance</dd>
<dt><span class="format">Pc::setValue( [ value ] )</span></dt>
<dd><span class="comment">value = mixed </span></dd>
<dd>Set property value</dd>
<dd>Return class instance</dd>
<dd><br></dd>
<dt><span class="format">Pc::getParamKeys()</span></dt>
<dd>Return array, property parameter keys (in uppercase)</dd>
<dt><span class="format">Pc::getParams( [ pKey [, asXparamKey ] ] )</span></dt>
<dd><span class="comment">pKey = string, set to uppercase </span></dd>
<dd><span class="comment">asXparamKey = bool, opt do X-prefix pkey, default false </span></dd>
<dd>Return all property parameters (key/value) assoc array or single parameter key value, null if not key exists</dd>
<dd><br></dd>
<dt><span class="format">Pc::hasParamKey( [ pKey [, pValue ] ] )</span></dt>
<dd><span class="comment">pKey = string, set to uppercase </span></dd>
<dd><span class="comment">pValue = string </span></dd>
<dd>Return bool true if property params has key, opt with spec. value</dd>
<dt><span class="format">Pc::hasXparamKey( [ pKey [, pValue ] ] )</span></dt>
<dd><span class="comment">pKey = string, set to uppercase, x-prefixed if missing </span></dd>
<dd><span class="comment">pValue = string </span></dd>
<dd>Return bool true if property params has X-key, opt with spec. value</dd>
<dt><span class="format">Pc::hasParamValue( [ pValue ] )</span></dt>
<dd><span class="comment">pValue = string, set to uppercase </span></dd>
<dd>Return bool true if property params has &quot;VALUE&quot; key with spec. value</dd>
<dd><br></dd>
<dt><span class="format">Pc::removeParam( [ pKey [, pValue ] ] )</span></dt>
<dd><span class="comment">pKey = string, set to uppercase </span></dd>
<dd><span class="comment">pValue = string </span></dd>
<dd>Remove property parameter key, opt only with spec. value</dd>
<dd>Return class instance</dd>
<dt><span class="format">removeXparam( pKey )</span></dt>
<dd><span class="comment">pKey = string, set to uppercase, x-prefixed if missing </span></dd>
<dd>Remove property parameter X-key</dd>
<dd>Return class instance</dd>
<dd><br></dd>
<dt><span class="format">addParam( pKey, pValue [, overwrite = true ] )</span></dt>
<dd><span class="comment">pKey = string, set to uppercase </span></dd>
<dd><span class="comment">pValue = string </span></dd>
<dd><span class="comment">overwrite = bool, default true </span></dd>
<dd>Set property parameter key/value, default overwrite</dd>
<dd>Return class instance</dd>
<dt><span class="format">addParamValue( pValue [, overwrite = true ] ] )</span></dt>
<dd><span class="comment">pValue = string, set to uppercase </span></dd>
<dd><span class="comment">overwrite = bool, default true </span></dd>
<dd>Set contents for property parameter key &quot;VALUE&quot;, default overwrite</dd>
<dd>Return class instance</dd>
<dt><span class="format">addXparam( pKey, pValue [, overwrite = true ] )</span></dt>
<dd><span class="comment">pKey = string, set to uppercase, x-prefixed if missing </span></dd>
<dd><span class="comment">pValue = string </span></dd>
<dd><span class="comment">overwrite = bool, default true </span></dd>
<dd>Set property parameter X-key/value, default overwrite</dd>
<dd>Return class instance</dd>
<dt><span class="format">setParams( params [, overwrite = true ] ] )</span></dt>
<dd><span class="comment">params = array </span></dd>
<dd><span class="comment">overwrite = bool, default true </span></dd>
<dd>Set property parameter X-key/value array, default overwrite (keys set to uppercase )</dd>
<dd>Return class instance</dd>
<dd><br></dd>
<dt><span class="format">isXprefixed( key )</span></dt>
<dd>static method</dd>
<dd><span class="comment">key = string </span></dd>
<dd>Return bool true if key is X-Prefixed, otherwise false</dd>
<dt><span class="format">setXPrefix( key )</span></dt>
<dd>static method</dd>
<dd><span class="comment">key = string </span></dd>
<dd>Return (string) X-prefixed key in upper case</dd>
<dt><span class="format">unsetXPrefix( key )</span></dt>
<dd>static method</dd>
<dd><span class="comment">key = string </span></dd>
<dd>Return string with opt. leading x-prefix removed</dd>
</dl>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="componentParse"></a><h3>3.2.3 Parse</h3>
<p>
Parse iCal component property text from a string or an array.
Each string/array row must be strict RFC5545 formatted, i.e. begin with a property name.
</p>
<p>
You can also parse complete <a href="#VALARM">ALARM</a>s, all properties included, in array format and
first array row as &quot;BEGIN:VALARM&quot;, last as &quot;END:VALARM&quot;
as well as <a href="#VTIMEZONE">TIMEZONE</a> and standard/daylight subcomponents.
Empty lines in a text property must be replaced by &quot;\n&quot;.
</p>
<p>
Minor errors like non-standard line-endings, initial and trailing empty lines
as well as files without proper end line(-s) (i.e. missing component end iCal directives)
are managed.
</p>
<p>
Throws InvalidArgumentException, UnexpectedValueException on parse error.
</p>
<p>
Except for the <a href="#X-PROPERTY">X-properties</a>, non-standard properties are ignored.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::parse( propertyText )</p>
<p class="comment">propertyText = (string) [RFC5545] formatted property,
(array) [RFC5545] formatted properties,
property name <b>must</b> start string / rows(-s)
// <span class="comment">For a property array MUST all, but first row, be prefixed by space.</span></p>
<p class="label">Example</p>
<p class="example">
$e = $vcalendar-&gt;newVevent();
$e-&gt;parse( &quot;DTSTAMP:19970324T1200Z&quot; );
$e-&gt;parse( &quot;SEQUENCE:0&quot; );
$e-&gt;parse( &quot;ORGANIZER:MAILTO:jdoe@host1.com&quot; );
$e-&gt;parse( [
&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com&quot;,
&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host2.com&quot;,
&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host3.com&quot;,
&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host4.com&quot;
]);
$e-&gt;parse( &quot;DTSTART:19970324T123000Z&quot; );
$e-&gt;parse( &quot;DTEND:19970324T210000Z&quot; );
$e-&gt;parse( &quot;CATEGORIES:MEETING,PROJECT&quot; );
$e-&gt;parse( &quot;CLASS:PUBLIC&quot; );
$e-&gt;parse( &quot;SUMMARY:Calendaring Interoperability Planning Meeting&quot; );
$e-&gt;parse( &quot;STATUS:DRAFT&quot; );
$e-&gt;parse(
&quot;DESCRIPTION:Project xyz Review Meeting Minutes\\n &quot; .
&quot;Agenda\\n &quot; .
&quot;1. Review of project version 1.0 requirements.\\n &quot; .
&quot;2. Definition of project processes.\\n &quot; .
&quot;3. Review of project schedule.\\n &quot; .
&quot;Participants: John Smith, Jane Doe, Jim Dandy\\n &quot; .
&quot;- It was decided that the requirements need to be signed off by \\n &quot; .
&quot;product marketing.\\n &quot; .
&quot;- Project processes were accepted.\\n &quot; .
&quot;- Project schedule needs to account for scheduled holidays and employee\\n &quot; .
&quot; vacation time. Check with HR for specific dates.\\n &quot; .
&quot;- New schedule will be distributed by Friday.\\n &quot; .
&quot;- Next weeks meeting is cancelled. No meeting until 3/23.&quot;
);
$e-&gt;parse( &quot;LOCATION:LDB Lobby&quot; );
$e-&gt;parse( &quot;ATTACH;FMTTYPE=application/postscript:ftp://xyz.com/pub/conf/bkgrnd.ps&quot; );
$e-&gt;parse(
[
&quot;BEGIN:VALARM&quot;,
&quot;ACTION:AUDIO&quot;,
&quot;TRIGGER;VALUE=DATE-TIME:19970224T070000Z&quot;,
&quot;ATTACH;FMTTYPE=audio/basic:https://host.com/pub/audio-files/ssbanner.aud&quot;,
&quot;REPEAT:4&quot;,
&quot;DURATION:PT1H&quot;,
&quot;X-alarm:non-standard ALARM property&quot;,
&quot;END:VALARM&quot;
]
);
$e-&gt;parse( &quot;X-xomment:non-standard property will be displayed, comma escaped&quot;);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="ACKNOWLEDGED"></a><h3>3.2.4 ACKNOWLEDGED</h3>
<p class="quotes">
ACKNOWLEDGED specifies the UTC date and time at which the corresponding alarm was last sent or acknowledged
</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank">rfc9074</a>
&quot;VALARM Extensions for iCalendar&quot;
</dt>
<dd>
ACKNOWLEDGED is OPTIONAL but MUST NOT occur more than once in <a href="#VALARM">VALARM</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is (UTC) DATE-TIME.</p>
<p>
To ease up usage, constan Kigkonsult\Icalcreator\Vcalendar::ACKNOWLEDGED is available.
</p>
<p>For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="ACTION"></a><h3>3.2.5 ACTION</h3>
<p class="quotes">
This property defines the action to be invoked when an <a href="#VALARM">VALARM</a> is triggered,
<br> &quot;AUDIO&quot; / &quot;DISPLAY&quot; / &quot;EMAIL&quot; / &quot;PROCEDURE&quot;.
This property is REQUIRED and MUST NOT occur more than once. (&quot;PROCEDURE&quot; is deprecated in [RFC5545].)
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::ACTION<br>
- Kigkonsult\Icalcreator\Vcalendar::AUDIO<br>
- Kigkonsult\Icalcreator\Vcalendar::DISPLAY<br>
- Kigkonsult\Icalcreator\Vcalendar::EMAIL<br>
- Kigkonsult\Icalcreator\Vcalendar::PROCEDURE // Deprecated in rfc5545<br>
are available.
</p>
<h5>Create ACTION</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createAction()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createAction();
</p>
<h5>Delete ACTION</h5>
<p>Remove ACTION from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteAction()</p>
<p class="label">Example</p>
<p class="example">
$valarm-&gt;deleteAction();
</p>
<h5>Get ACTION</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getAction()</p>
<p class="comment">output = actionValue<sup>1</sup>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getAction( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; actionValue<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup> )
]
</p>
<p class="label">Example</p>
<p class="example">
$action = $valarm-&gt;getAction();
<h5>is ACTION set</h5>
<p>Return bool true if ACTION is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isActionSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $valarm-&gt;isActionSet();
</p>
<h5>Set ACTION</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setAction( actionValue [, xparams ] )</p>
<p class="comment">actionValue<sup>1</sup> = (string) one of
Vcalendar::AUDIO / Vcalendar::DISPLAY / Vcalendar::EMAIL / Vcalendar::PROCEDURE
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$valarm-&gt;setAction( &quot;DISPLAY&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="ATTACH"></a><h3>3.2.6 ATTACH</h3>
<p class="quotes">
The property provides the capability to associate a document object with a <strong>calendar</strong> component.
The property is<br>
- OPTIONAL and MUST NOT occur more than once in an &quot;ALARM&quot; (&quot;audio&quot;)<br>
- REQUIRED and MUST NOT occur more than once in an <a href="#VALARM">VALARM</a> (&quot;display&quot;/&quot;procedure&quot;),<br>
- OPTIONAL and MAY occur more than once in
<a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a> and
<a href="#VALARM">VALARM</a> (&quot;email&quot;).
</p>
<p>Logic, described above, is NOT implemented in the method setAttach(), below, multiple ATTACH are allowed in all.</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
ATTACH may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
The default value type for ATTACH is URI. The value type can also be set to BINARY to indicate inline binary encoded content (params<sup>2</sup>).
</p>
<p>
If using other parameters than the recommended &quot;FMTTYPE&quot; and the mandatory &quot;ENCODING&quot; (=&quot;BASE64&quot;)and &quot;VALUE&quot; (=&quot;BINARY&quot;)
for an inline binary encoded attachment,
please use only characters within the ASCII character set in parameter name and content,
to ensure proper line folding when using <a href="#createCalendar">createCalendar</a> and/or <a href="#returnCalendar">returnCalendar</a>.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::ATTACH<br>
- Kigkonsult\Icalcreator\Vcalendar::ENCODING<br>
- Kigkonsult\Icalcreator\Vcalendar::FMTTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::EIGHTBIT // e.i 8BIT <br>
- Kigkonsult\Icalcreator\Vcalendar::BASE64<br>
are available.
</p>
<h5>Create ATTACH</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createAttach()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createAttach();
</p>
<h5>Delete ATTACH</h5>
<p>Remove ATTACH from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteAttach()</p>
<p class="label">Example 1</p>
<p class="example">
$valarm-&gt;deleteAttach();
</p>
<p class="label">Example 2</p>
Delete ATTACH property no 2.
<p class="example">
$valarm-&gt;deleteAttach( 2 );
</p>
<p class="label">Example 3</p>
Deleting all ATTACH properties.
<p class="example">
while( $valarm-&gt;deleteAttach()) {
continue;
}
</p>
<h5>Get ALL ATTACH</h5>
<p>Returns array : all ATTACH, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllAttach( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get ATTACH</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getAttach()</p>
<p class="comment">output = attachValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getAttach( propOrderNo/null, true )</p>
<p class="comment">propOrderNo = (int) specific property value,
<p class="comment">output = [
&quot;value&quot; =&gt; attachValue<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getAttach( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo ATTACH</p>
<p class="label">Example</p>
<p class="example">
$attach = $valarm-&gt;getAttach();
<h5>is ATTACH set</h5>
<p>Return bool true if ATTACH is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isAttachSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isAttachSet();
</p>
<h5>Set ATTACH</h5>
<p>
Set property value. Parameters will be ordered as prescribed in [RFC5545].
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setAttach( attachValue<sup>1</sup> [, params [, propOrderNo ]] )</p>
<p class="comment">attachValue<sup>1</sup> = (string) URI / inline binary encoded content
params<sup>2</sup> = (array ) ( [ &quot;ENCODING&quot; =&gt; &quot;BASE64&quot;, &quot;VALUE&quot; =&gt; &quot;BINARY&quot; ]
[, &quot;FMTTYPE&quot; =&gt; contentType ]
*[,&nbsp;xparams ] )
contentType = (string) The parameter value MUST be the TEXT for either an IANA
registered content type or a non-standard content type.
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setAttach(
&quot;ftp://domain.com/pub/docs/agenda.doc&quot;,
[ Vcalendar::FMTTYPE =&gt; &quot;application/binary&quot; ]
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="ATTENDEE"></a><h3>3.2.7 ATTENDEE</h3>
<p class="quotes">
The property defines an "Attendee" within a <strong>calendar</strong> component and is OPTIONAL
and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>, <a href="#VFREEBUSY">VFREEBUSY</a> components and
<a href="#VALARM">VALARM</a> (&quot;ACTION&quot; &quot;email&quot;).
</p>
<dl>
<dt>
Note, as described in
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>(may NOT be supported by all calendaring software)</dd>
<dd>for <a href="#PARTICIPANT">PARTICIPANT</a>
<p class="quotes">
&quot;For backwards compatibility with existing clients and servers when
used to schedule events and tasks, the ATTENDEE property MUST be
used to specify the scheduling parameters as defined for that property.&quot;
</p>
</dd>
<dd>
the <a href="#VCALENDAR">VCALENDAR</a>/component method <i>participants2Attendees()</i><br>
may be used to create new ATTENDEEs from
<a href="#PARTICIPANT">PARTICIPANT</a> (sub-)components
and the <a href="#CALENDAR-ADDRESS">CALENDAR-ADDRESS</a> property value
with X-parameters : ATTENDEE default values, see setAttendee() below, and PARTICIPANT
<a href="#UID">UID</a> and <a href="#PARTICIPANT-TYPE">PARTICIPANT-TYPE</a>.<br>
Another option is to set ATTENDEE and <a href="#PARTICIPANT">PARTICIPANT</a> in pairs.
</dd>
</dl>
<p>This value type for ATTENDEE is URI, a <strong>calendar</strong> user address.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) ATTENDEE values.</p>
<p>You can export <strong>calendar</strong> ATTENDEE values as <a href="#iCal2vCards">vCards</a>.
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::ATTENDEE<br>
- Kigkonsult\Icalcreator\Vcalendar::CUTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::MEMBER<br>
- Kigkonsult\Icalcreator\Vcalendar::ROLE<br>
- Kigkonsult\Icalcreator\Vcalendar::PARTSTAT<br>
- Kigkonsult\Icalcreator\Vcalendar::RSVP<br>
- Kigkonsult\Icalcreator\Vcalendar::DELEGATED_TO<br>
- Kigkonsult\Icalcreator\Vcalendar::DELEGATED_FROM<br>
- Kigkonsult\Icalcreator\Vcalendar::SENT_BY<br>
- Kigkonsult\Icalcreator\Vcalendar::CN<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
- Kigkonsult\Icalcreator\Vcalendar::DIR<br>
- Kigkonsult\Icalcreator\Vcalendar::GROUP<br>
- Kigkonsult\Icalcreator\Vcalendar::INDIVIDUAL<br>
- Kigkonsult\Icalcreator\Vcalendar::RESOURCE<br>
- Kigkonsult\Icalcreator\Vcalendar::ROOM<br>
- Kigkonsult\Icalcreator\Vcalendar::UNKNOWN<br>
- Kigkonsult\Icalcreator\Vcalendar::COMPLETED<br>
- Kigkonsult\Icalcreator\Vcalendar::NEEDS_ACTION<br>
- Kigkonsult\Icalcreator\Vcalendar::ACCEPTED<br>
- Kigkonsult\Icalcreator\Vcalendar::DECLINED<br>
- Kigkonsult\Icalcreator\Vcalendar::TENTATIVE<br>
- Kigkonsult\Icalcreator\Vcalendar::DELEGATED<br>
- Kigkonsult\Icalcreator\Vcalendar::IN_PROCESS<br>
- Kigkonsult\Icalcreator\Vcalendar::CHAIR<br>
- Kigkonsult\Icalcreator\Vcalendar::REQ_PARTICIPANT<br>
- Kigkonsult\Icalcreator\Vcalendar::OPT_PARTICIPANT<br>
- Kigkonsult\Icalcreator\Vcalendar::NON_PARTICIPANT<br>
- Kigkonsult\Icalcreator\Vcalendar::FALSE<br>
- Kigkonsult\Icalcreator\Vcalendar::TRUE<br>
are available.
</p>
<h5>Create ATTENDEE</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createAttendee()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createAttendee();
</p>
<h5>Delete ATTENDEE</h5>
<p>Remove ATTENDEE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteAttendee()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) ATTENDEE property</p>
<p class="example">
$valarm-&gt;deleteAttendee();
</p>
<p class="label">Example 2</p>
<p>Delete ATTENDEE property no 2.</p>
<p class="example">
$valarm-&gt;deleteAttendee();
</p>
<p class="label">Example 3</p>
Deleting all ATTENDEE properties.
<p class="example">
while( $valarm-&gt;deleteAttendee()) {
continue;
}
</p>
<h5>Get ALL ATTENDEE</h5>
<p>Returns array : all ATTENDEE, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllAttendee( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get ATTENDEE</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getAttendee()</p>
<p class="comment">output = attendeeValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getAttendee( propOrderNo/null, true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; attendeeValue<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getAttendee( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = attendeeValue<sup>1</sup></p>
<p class="label">Example</p>
<p class="example">
$attendee = $valarm-&gt;getAttendee();
<h5>is ATTENDEE set</h5>
<p>Return bool true if ATTENDEE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isAttendeeSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isAttendeeSet();
</p>
<h5>Set ATTENDEE</h5>
<p>
Set property value. If exist, default parameter values are removed after input (params<sup>2</sup>).
Property value must be prefixed by protocol (ftp://, https://, mailto:, file:// etc, ref.
<a href="https://tools.ietf.org/html/rfc1738" title="Download rfc1738" target="_blank">rfc1738</a>),
if missing, &quot;mailto:&quot; is set (indicating an internet mail address).
Also MEMBER and DIR parameters must be prefixed by protocol. DELEGATED-TO, DELEGATED-FROM, SENT-BY parameters
must use protocol &quot;mailto:&quot;, prefixed if missing (indicating an internet mail address).
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>
The CN, ROLE, PARTSTAT, RSVP, CUTYPE, MEMBER, DELEGATED-TO,DELEGATED-FROM, ORDER, SENT-BY and DIR
properties are not accepted (i.e. removed) in a "VFREEBUSY" or "VALARM" "ATTENDEE" property content.
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setAttendee( attendeeValue [, params [, propOrderNo ]] )</p>
<p class="comment">attendeeValue<sup>1</sup> = (string) a <strong>calendar</strong> user address, a URI as defined by
[RFC 1738] or any other IANA registered form
for a URI.
params<sup>2</sup> = (array) ( [CUTYPE] [,MEMBER] [,ROLE] [,PARTSTAT]
[,RVSP] [,DELEGATED-TO] [,DELEGATED-FROM]
[,SENT-BY] [,CN] [,DIR] [,LANGUAGE]
*[,xparams] )
CUTYPE = "CUTYPE" =&gt; &quot;INDIVIDUAL&quot;
(An individual, <b>Default</b>)
/ &quot;GROUP&quot;
(A group of individuals)
/ &quot;RESOURCE&quot;
(A physical resource)
/ &quot;ROOM&quot;
(A room resource)
/ &quot;UNKNOWN&quot;
(Otherwise not known)
/ (string) x-name
(Experimental type)
/ iana-token
(string) (Other IANA registered type)
MEMBER = "MEMBER" =&gt; array( *[ (string) &quot;single member
of the group or list membership&quot;])
ROLE = "ROLE" =&gt; &quot;CHAIR&quot;
(Indicates chair of the <strong>calendar</strong>
entity)
/ &quot;REQ-PARTICIPANT&quot;
(required participation, <b>Default</b>)
/ &quot;OPT-PARTICIPANT&quot;
(optional participation)
/ &quot;NON-PARTICIPANT&quot;
(information purposes only)
/ (string) x-name
(Experimental role)
/ (string) iana-token
(Other IANA role)
PARTSTAT = Vcalendar::PARTSTAT =&gt; &quot;NEEDS-ACTION&quot;
(Event needs action, <b>Default</b>)
/ &quot;ACCEPTED&quot;
(Event accepted)
/ &quot;DECLINED&quot;
(Event declined)
/ &quot;TENTATIVE&quot;
(Event tentatively accepted)
/ &quot;DELEGATED&quot;
(Event delegated)
/ &quot;NEEDS-ACTION&quot;
(To-do needs action, <b>Default</b>)
/ &quot;ACCEPTED&quot;
(To-do accepted)
/ &quot;DECLINED&quot;
(To-do declined)
/ &quot;TENTATIVE&quot;
(To-do tentatively accepted)
/ &quot;DELEGATED&quot;
(To-do delegated)
/ &quot;COMPLETED&quot;
(To-do completed.
<a href="#COMPLETED">COMPLETED</a> property
has date/time completed)
/ &quot;IN-PROCESS&quot;
(To-do in process of being completed)
/ &quot;NEEDS-ACTION&quot;
(Journal needs action, <b>Default</b>)
/ &quot;ACCEPTED&quot;
(Journal accepted)
/ &quot;DECLINED&quot;
(Journal declined)
/ (string) x-name
(Experimental status)
/ (string) iana-token
(Other IANA registered status)
RSVP = Vcalendar::RSVP =&gt; (string) &quot;true&quot;
/ &quot;false&quot;, <b>Default</b> (reply expectation)
DELEGATED-TO = &quot;DELEGATED-TO&quot; =&gt; array(*[(string) &quot;single <strong>calendar</strong> user
to specified by the property
has delegated participation&quot;])
DELEGATED-FROM = &quot;DELEGATED-FROM&quot; =&gt; array( *[ (string) &quot;single <strong>calendar</strong> user that
have delegated their
participation to the
<strong>calendar</strong> user specified
by the property&quot; ] )
SENT-BY = Vcalendar::SENT_BY =&gt; (string) single <strong>calendar</strong> user that is
acting on behalf
of the <strong>calendar</strong> user
specified by the property&quot;
LANGUAGE = Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot; (applies to the CN parameter value)
CN = Vcalendar::CN =&gt; (string) &quot;common name to be associated with the <strong>calendar</strong>
user specified by the property&quot;
DIR = Vcalendar::DIR =&gt; (string) &quot;reference to a directory entry associated with
the <strong>calendar</strong> user specified by the property&quot;
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p>
See rules in detail in <a href="https://tools.ietf.org/html/rfc5545" title="rfc5545" target="_blank">rfc5545</a>
&quot;Internet Calendaring and Scheduling Core Object Specification (iCalendar)&quot;.
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setAttendee( &quot;attendee1@ical.net&quot; );
$vevent-&gt;setAttendee(
&quot;attendee2@ical.net&quot;,
[
Vcalendar::CUTYPE =&gt; &quot;INDIVIDUAL&quot;,
Vcalendar::MEMBER =&gt; [
&quot;member1@ical.net&quot;,
&quot;member2@ical.net&quot;,
&quot;member3@ical.net&quot;
],
Vcalendar::ROLE =&gt; &quot;CHAIR&quot;,
Vcalendar::PARTSTAT =&gt; &quot;ACCEPTED&quot;,
Vcalendar::RSVP =&gt; &quot;true&quot;,
Vcalendar::DELEGATED_TO =&gt; [
&quot;part1@ical.net&quot;,
&quot;part2@ical.net&quot;,
&quot;part3@ical.net&quot;
],
Vcalendar::DELEGATED_FROM =&gt; [
&quot;cio@ical.net&quot;,
&quot;vice.cio@ical.net&quot;
],
Vcalendar::SENT_BY =&gt; &quot;secretary@ical.net&quot;,
Vcalendar::LANGUAGE =&gt; &quot;us-EN&quot;,
Vcalendar::CN =&gt; &quot;John Doe&quot;,
Vcalendar::DIR =&gt; &quot;https://www.ical.net/info.doc&quot;,
&quot;x-agenda&quot; =&gt; &quot;status reports&quot;, <span class="comment">// xparam</span>
&quot;x-time&quot; =&gt; &quot;15 min&quot; <span class="comment">// xparam</span>
]
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="BUSYTYPE"></a><h3>3.2.8 BUSYTYPE</h3>
<p class="quotes">BUSYTYPE specifies the default busy time type</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
BUSYTYPE specifies the default busy time type
and may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is TEXT.</p>
<p class="quotes">
The values correspond to those used by the "FBTYPE"
parameter used on a "FREEBUSY" property, with the exception that
the "FREE" value is not used in this property. If not specified
on a component that allows this property, the default is "BUSY-
UNAVAILABLE".
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::BUSYTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::BUSY<br>
- Kigkonsult\Icalcreator\Vcalendar::BUSY-UNAVAILABLE<br>
- Kigkonsult\Icalcreator\Vcalendar::BUSY-TENTATIVE<br>
are available.
</p>
<p>For methods and formatting, explore the <a href="#CLASS">CLASS</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="CALENDAR-ADDRESS"></a><h3>3.2.9 CALENDAR-ADDRESS</h3>
<p class="quotes">
This property specifies the calendar address for a <a href="#PARTICIPANT">PARTICIANT</a>.
</p>
<p>This value type for CALENDAR-ADDRESS is CAL-ADDRESS (uri).</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::CALENDAR-ADDRESS is available.
</p>
<p class="quotes">
&quot;For backwards compatibility with existing clients and servers when
used to schedule events and tasks, the <a href="#ATTENDEE">ATTENDEE</a> property MUST be
used to specify the scheduling parameters as defined for that property.&quot;,
</p>
<p>
see <a href="#ATTENDEE">ATTENDEE</a> rfc9073 note.
</p>
<p>For methods and formatting, explore the <a href="#ORGANIZER">ORGANIZER</a> property but with no prescribed parameters</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="CATEGORIES"></a><h3>3.2.10 CATEGORIES</h3>
<p class="quotes">
This property defines the categories for a <strong>calendar</strong> component and is OPTIONAL
and MAY occur more than once in
<a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
CATEGORIES may occur more than once in <a href="#VAVAILABILITY">VAVAILABILITY</a>
and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
CATEGORIES may occur more than once in <a href="#VCALENDAR">VCALENDAR</a>
and may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
CATEGORIES may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
The value type for CATEGORIES is TEXT.
</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) CATEGORIES values.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::CATEGORIES is available.
</p>
<h5>Create CATEGORIES</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createCategories()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createCategories();
</p>
<h5>Delete CATEGORIES</h5>
<p>Remove CATEGORIES from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteCategories( [ propOrderNo ] )</p>
<p class="comment">propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span></p>
<p class="label">Example 1</p>
<p>Delete (single/first) CATEGORIES property</p>
<p class="example">
$vevent-&gt;deleteCategories();
</p>
<p class="label">Example 2</p>
<p>Delete CATEGORIES property no 2.</p>
<p class="example">
$vevent-&gt;deleteCategories( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all CATEGORIES properties.</p>
<p class="example">
while( $vevent-&gt;deleteCategories()) {
continue;
}
</p>
<h5>Get ALL CATEGORIES</h5>
<p>Returns array : all CATEGORIES, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllCategories( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get CATEGORIES</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getCategories()</p>
<p class="comment">output = categoryValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getCategories( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; categories<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getCategories( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo CATEGORIES</p>
<p class="label">Example</p>
<p class="example">
$categories = $valarm-&gt;getCategories();
</p>
<h5>is CATEGORIES set</h5>
<p>Return bool true if CATEGORIES is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isCategoriesSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isCategoriesSet();
</p>
<h5>Set CATEGORIES</h5>
<p>Set property value.</p>
<p>
In spite of the fact that CATEGORIES may contain a (comma separated) list of values,
a strong recommendation is to split a CATEGORIES &quot;list&quot; into multiple single CATEGORIES entries.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setCategories( categories [, params [, propOrderNo ]] )</p>
<p class="comment">categories<sup>1</sup> = (string) textual categories or subtypes of the <strong>calendar</strong> component,
can be specified as a list of categories
separated by the COMMA character
params<sup>2</sup> = (array) ( [Vcalendar::LANGUAGE =&gt; (string) &quot;&lt;lang<sup>*</sup>&gt;&quot;] *[, xparams] )
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setCategories( &quot;project_x&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="CLASS"></a><h3>3.2.11 CLASS</h3>
<p class="quotes">
This property defines the access classification for a <strong>calendar</strong> component and is OPTIONAL
and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
CLASS may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::KLASS // note CLASS<br>
- Kigkonsult\Icalcreator\Vcalendar::P_BLIC // note PUBLIC<br>
- Kigkonsult\Icalcreator\Vcalendar::P_IVATE // note PRIVATE<br>
- Kigkonsult\Icalcreator\Vcalendar::CONFIDENTIAL<br>
are available.
</p>
<h5>Create CLASS</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createClass()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createClass();
</p>
<h5>Delete CLASS</h5>
<p>Remove CLASS from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteClass()</p>
<p class="label">Example</p>
<p class="example">
$vjournal-&gt;deleteClass();
</p>
<h5>Get CLASS</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getClass()</p>
<p class="comment">output = classValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p class="format">calendarComponent::getClass( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; classValue<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$class = $valarm-&gt;getClass();
</p>
<h5>is CLASS set</h5>
<p>Return bool true if CLASS is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isClassSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isClassSet();
</p>
<h5>Set CLASS</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setClass( classvalue [, xparams ] )</p>
<p class="comment">classvalue<sup>1</sup> = &quot;PUBLIC&quot;
/ &quot;PRIVATE&quot;
/ &quot;CONFIDENTIAL&quot;
/ (string) iana-token
/ (string) x-name
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setClass( Vcalendar::CONFIDENTIAL );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="COLOR"></a><h3>3.2.12 COLOR</h3>
<p class="quotes">
This property specifies a color used for displaying the
<a href="#VCALENDAR">VCALENDAR</a>
<a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a> data.
The value is a case-insensitive color name taken from the CSS3 set of
names, defined in Section 4.3 of
<a href="https://www.w3.org/TR/2011/REC-css3-color-20110607" title="Download" target="_blank">[W3C.REC-css3-color-20110607]</a>.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
COLOR may occur once and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is TEXT.</p>
<p>
To ease up usage, constants Kigkonsult\Icalcreator\Vcalendar::COLOR is available.
</p>
<h5>Create COLOR</h5>
<p>If set, returns [RFC7986] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createColor()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createColor();
</p>
<h5>Delete COLOR</h5>
<p>Remove COLOR from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteColor()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteColor();
</p>
<h5>Get COLOR</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getColor( )</p>
<p class="comment">output = color<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getColor( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; color<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$transp = $vtodo-&gt;getColor();
</p>
<h5>is COLOR set</h5>
<p>Return bool true if COLOR is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isColorSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isColorSet();
</p>
<h5>Set COLOR</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setColor( color [, xparams ] )</p>
<p class="comment">transp<sup>1</sup> = &lt;color&gt;
xparams<sup>2</sup> = (array) *( (string) key =&gt; (string) value ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setColor( &quot;Blue&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="COMMENT"></a><h3>3.2.13 COMMENT</h3>
<p class="quotes">
This property specifies non-processing information intended to provide a comment to the <strong>calendar</strong> user
and is OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>, <a href="#VFREEBUSY">VFREEBUSY</a>,
<a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
COMMENT may occur more than once in <a href="#VAVAILABILITY">VAVAILABILITY</a>
and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
COMMENT may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for COMMENT is TEXT.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::COMMENT<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create COMMENT</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createComment()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createComment();
</p>
<h5>Delete COMMENT</h5>
<p>Remove COMMENT from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteComment()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) COMMENT property</p>
<p class="example">
$vevent-&gt;deleteComment();
</p>
<p class="label">Example 2</p>
<p>Delete COMMENT property no 2.</p>
<p class="example">
$vevent-&gt;deleteComment( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all COMMENT properties.</p>
<p class="example">
while( $vevent-&gt;deleteComment()) {
continue;
}
</p>
<h5>Get ALL COMMENT</h5>
<p>Returns array : all COMMENT, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllComment( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get COMMENT</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getComment()</p>
<p class="comment">output = commentValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getComment( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; commentValue<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getComment( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo COMMENT</p>
<p class="label">Example</p>
<p class="example">
$comment = $vevent-&gt;getComment();
</p>
<h5>is COMMENT set</h5>
<p>Return bool true if COMMENT is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isCommentSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isCommentSet();
</p>
<h5>Set COMMENT</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setComment( commentValue [, params [, propOrderNo ]] )</p>
<p class="comment">commentValue<sup>1</sup> = (string) Value type Text
params<sup>2</sup> = array(
Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;],
Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;]
*(xparams )
)
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setComment( &quot;this is a comment&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="COMPLETED"></a><h3>3.2.14 COMPLETED</h3>
<p class="quotes">
This property defines the date and time that a <a href="#VTODO">VTODO</a> was actually completed and is OPTIONAL and MUST NOT occur more than once.
</p>
<p>The value type for COMPLETED is <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::COMPLETED is available.
</p>
<p>For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="CONFERENCE"></a><h3>3.2.15 CONFERENCE</h3>
<p class="quotes">
CONFERENCE specifies information for accessing a conferencing system for attendees of a meeting or task.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
CONFERENCE may be specified multiple times in a
<a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is URI.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::CONFERENCE<br>
- Kigkonsult\Icalcreator\Vcalendar::URI<br>
- Kigkonsult\Icalcreator\Vcalendar::FEATURE<br>
- Kigkonsult\Icalcreator\Vcalendar::LABEL<br>
- Kigkonsult\Icalcreator\Vcalendar::URI<br>
- Kigkonsult\Icalcreator\Vcalendar::LABEL<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create CONFERENCE</h5>
<p>If set, returns [RFC7986] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createConference()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createConference();
</p>
<h5>Delete CONFERENCE</h5>
<p>Remove CONFERENCE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteConference()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteConference();
</p>
<h5>Get ALL CONFERENCE</h5>
<p>Returns array : all CONFERENCE, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllConference( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get CONFERENCE</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getConference()</p>
<p class="comment">output = url<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getConference( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; conference<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$conference = $vevent-&gt;getConference();
</p>
<h5>is CONFERENCE set</h5>
<p>Return bool true if CONFERENCE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isConferenceSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isConferenceSet();
</p>
<h5>Set CONFERENCE</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
InvalidArgumentException on url error.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setConference( conference [, params ] )</p>
<p class="comment">conference<sup>1</sup> = (string) Value type URI
params<sup>2</sup> = [
Vcalendar::VALUE =&gt; Vcalendar::URI,
Vcalendar::FEATURE =&gt; featureValue,
Vcalendar::LABEL =&gt; human-readable data,
Vcalendar::LANGUAGE =&gt; (string) &quot;lang&quot; // opt. if LABEL is set
xparams
]
featureValue = one or more (comma separated)
Vcalendar::AUDIO // Audio capability
Vcalendar::CHAT // Chat or instant messaging
Vcalendar::FEED // Blog or Atom feed
Vcalendar::MODERATOR // Moderator dial-in code
Vcalendar::PHONE // Phone conference
Vcalendar::SCREEN // Screen sharing
Vcalendar::VIDEO // Video capability
x-name // Experimental type
iana-token // Other IANA-registered type
lang = as defined in [RFC5546]
xparams = *[ (string) key =&gt; (string) value ] // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="CONTACT"></a><h3>3.2.16 CONTACT</h3>
<p class="quotes">
The property is used to represent textual contact information or alternately a reference to textual contact information
associated with the <strong>calendar</strong> component. The property is OPTIONAL and MUST NOT occur more than once in
a <a href="#VFREEBUSY">VFREEBUSY</a> or MAY occur more than once in <a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
CONTACT may occur more than once in <a href="#VAVAILABILITY">VAVAILABILITY</a>
and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
CONTACT may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for CONTACT is TEXT.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) CONTACT values.</p>
<p>You can export <strong>calendar</strong> CONTACT values as <a href="#iCal2vCards">vCards</a>.
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::CONTACT<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create CONTACT</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createContact()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createContact();
</p>
<h5>Delete CONTACT</h5>
<p>Remove CONTACT from component.</p>
<p>For CONTACT in <a href="#VFREEBUSY">VFREEBUSY</a> (may only occur once), skip the &quot;propOrderNo&quot; argument.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteContact( [ propOrderNo ] )</p>
<p class="label">Example 1</p>
<p>Delete (single/first) CONTACT property<p>
<p class="example">
$vevent-&gt;deleteContact();
</p>
<p class="label">Example 2</p>
<p>Delete CONTACT property no 2.</p>
<p class="example">
$vevent-&gt;deleteContact( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all CONTACT properties.</p>
<p class="example">
while( $vevent-&gt;deleteContact()) {
continue;
}
</p>
<h5>Get ALL CONTACT</h5>
<p>Returns array : all CONTACT, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllContact( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get CONTACT</h5>
<p>For CONTACT in <a href="#VFREEBUSY">VFREEBUSY</a> (may only occur once), skip the &quot;propOrderNo&quot; argument.</p>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getContact()</p>
<p class="comment">output = contactValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getContact( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; contactValue<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getContact( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo CONTACT</p>
<p class="label">Example</p>
<p class="example">
$contact = $vevent-&gt;getContact();
</p>
<h5>is CONTACT set</h5>
<p>Return bool true if CONTACT is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isContactSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isContactSet();
</p>
<h5>Set CONTACT</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p>For CONTACT in <a href="#VFREEBUSY">VFREEBUSY</a> (may only occur once), skip the &quot;propOrderNo&quot; argument.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setContact( contactValue [, params [, propOrderNo ]] )</p>
<p class="comment">contactValue<sup>1</sup> = (string) Value type TEXT
params<sup>2</sup> = [
Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;],
Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;],
*(xparams )
]
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$c-&gt;setContact( &quot;tel 012-34 56 789&quot; )
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="CREATED"></a><h3>3.2.17 CREATED</h3>
<p class="quotes">
This property specifies the date and time that the <strong>calendar</strong> information was created by
the <strong>calendar</strong> user agent in the <strong>calendar</strong> store.
Note: This is analogous to the creation date and time for a file in the file system.
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
CREATED may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;,
</dt>
<dd>
CREATED may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for CREATED is <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::CREATED is available.
</p>
<h5>Create CREATED</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createCreated()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createCreated();
</p>
<h5>Delete CREATED</h5>
<p>Remove CREATED from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteCreated()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteCreated();
</p>
<h5>Get CREATED</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getCreated()</p>
<p class="comment">output = createdDate<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getCreated( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; createdDate<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$created = $vevent-&gt;getCreated();
</p>
<h5>is CREATED set</h5>
<p>Return bool true if CREATED is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isCreatedSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isCreatedSet();
</p>
<h5>Set CREATED</h5>
<p>
Set property value. Input date is always a <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME or,
if &quot;offset&quot; parameter is used, timezone is set to first found matching timezone.
</p>
<p>
The current UTC date-time is set if invoked without or an empty value
and may be used to set or update a previously set property value to current UTC date-time.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws Exception on DateTime error.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setCreated( [ createdDate [, xparams ]] )</p>
<p class="comment">
createdDate = (object) DateTimeInterface instance, will be set to UTC if not UTC timezone
createdDate = (string) date/datetime string<sup>*</sup>
xparams<sup>2</sup> = array( *[ (string) key =&gt; (string) value ] )
<br>date/datetime string<sup>*</sup> please notice <a href="#date_restraints">date restraints</a>.
</p>
<p class="label">Example 1</p>
<p class="example">use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ calendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtodo = $vcalendar-&gt;newVtodo();
try {
$vtodo-&gt;setCreated( new DateTime( &quot;2006-08-11 14:30:35 UTC&quot; ));
// <span class="comment">11 august 2006 14.30.35 UTC</span>
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="DESCRIPTION"></a><h3>3.2.18 DESCRIPTION</h3>
<p class="quotes">
This property provides a more complete textual description of the <strong>calendar</strong> component,
than that provided by the <a href="#SUMMARY">SUMMARY</a> property (, analogous to a mail BODY).
The property is OPTIONAL, MUST NOT occur more than once within
<a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a> or
<a href="#VALARM">VALARM</a> (PROCEDURE)
but can be specified multiple times within the <a href="#VJOURNAL">VJOURNAL</a> <strong>calendar</strong> component.
The property is REQUIRED in <a href="#VALARM">VALARM</a> (DISPLAY, EMAIL) component.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
DESCRIPTION may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
DESCRIPTION may occur more than once in <a href="#VCALENDAR">VCALENDAR</a>
(with different &quot;LANGUAGE&quot; parameter values on each)
and may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
DESCRIPTION may occur once in
<a href="#PARTICIPANT">PARTICIPANT</a>,
<a href="#VRESOURCE">VRESOURCE</a> and
<a href="#VLOCATION">VLOCATION</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for DESCRIPTION is TEXT.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::DESCRIPTION<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create DESCRIPTION</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createDescription()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createDescription();
</p>
<h5>Get ALL DESCRIPTION</h5>
<p>Returns array : all DESCRIPTION, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllDescription( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Delete DESCRIPTION</h5>
<p>Remove DESCRIPTION from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteDescription()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) DESCRIPTION property.</p>
<p class="example">
$vevent-&gt;deleteDescription();
</p>
<p class="label">Example 2</p>
<p>Delete DESCRIPTION property no 2, <a href="#VCALENDAR">VCALENDAR</a>/<a href="#VJOURNAL">VJOURNAL</a> only.</p>
<p class="example">
$vjournal-&gt;deleteDescription( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all DESCRIPTION properties. <a href="#VCALENDAR">VCALENDAR</a>/<a href="#VJOURNAL">VJOURNAL</a> only.</p>
<p class="example">
while( $vjournal-&gt;deleteDescription()) {
continue;
}
</p>
<h5>Get DESCRIPTION</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p class="label">Format 1</p>
<p>get (single) DESCRIPTION property, for <a href="#VCALENDAR">VCALENDAR</a>/<a href="#VJOURNAL">VJOURNAL</a>, first/next</p>
<p class="format">calendarComponent::getDescription()</p>
<p class="comment">output = descriptionValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getDescription( propOrderNo/null ,true )</p>
<p class="comment">
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc, <a href="#VCALENDAR">VCALENDAR</a>/<a href="#VJOURNAL">VJOURNAL</a> only</span>
</p>
<p class="comment">output = [
&quot;value&quot; =&gt; descriptionValue<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$description = $vevent-&gt;getDescription();
</p>
<h5>is DESCRIPTION set</h5>
<p>Return bool true if DESCRIPTION is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isDescriptionSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isDescriptionSet();
</p>
<h5>Set DESCRIPTION</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].
<p class="label">Format</p>
<p class="format">calendarComponent::setDescription( descriptionValue [, params [, propOrderNo ]] )</p>
<p class="comment">descriptionValue<sup>1</sup> = (string) Value type TEXT
params<sup>2</sup> = array(
Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;],
Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;]
*(xparams )
)
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc, <a href="#VCALENDAR">VCALENDAR</a>/<a href="#VJOURNAL">VJOURNAL</a> only</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setDescription( &quot;This is a description&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="DTEND"></a><h3>3.2.19 DTEND</h3>
<p class="quotes">
This property specifies the date and time that a <strong>calendar</strong> component ends.
The property is OPTIONAL and MUST NOT occur more than once in
<a href="#VFREEBUSY">VFREEBUSY</a> and <a href="#VEVENT">VEVENT</a>.
In <a href="#VEVENT">VEVENT</a>, it only occurs if <a href="#DURATION">DURATION</a> NOT occurs.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;Calendar Availability&quot;
</dt>
<dd>
DTEND may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>,
only if <a href="#DURATION">DURATION</a> NOT occurs.
<a href="#VAVAILABILITY">VAVAILABILITY</a> / <a href="#AVAILABLE">AVAILABLE</a>
may NOT be supported by all calendaring software.
</dd>
<dd>
<p class="quotes">
If specified, DTEND MUST be "DATE-TIME" value specified as either the date with UTC time or
the date with local time and a time zone reference.
</p>
</dd>
</dl>
<p>
The default value type for DTEND is DATE-TIME, can be set to a DATE value type.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::DTEND<br>
- Kigkonsult\Icalcreator\Vcalendar::VALUE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE_TIME<br>
- Kigkonsult\Icalcreator\Vcalendar::TZID<br>
are available.
</p>
<p class="quotes">
The value type of the "DTEND" or "DUE" properties MUST match the value type of "DTSTART" property as defined in [RFC5545])
</p>
<p>
Notice that an end date without a time is in effect midnight of the day before the date,
so for timeless dates, use the date following the event date for it to be correct.
For an &quot;all-day event&quot; and using timeless dates, the DTEND is equal DTSTART plus one day,
example all-day event (2007-12-01)<br>DTSTART;VALUE=DATE:20071201<br> DTEND;VALUE=DATE:20071202.
</p>
<h5>Create DTEND</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createDtend()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createDtend();
</p>
<h5>Delete DTEND</h5>
<p>Remove DTEND from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteDtend()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteDtend();
</p>
<h5>Get DTEND</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getDtend()</p>
<p class="comment">output = dtendDate<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getDtend( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; dtendDate<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$dtend = $vevent-&gt;getDtend();
</p>
<h5>is DTEND set</h5>
<p>Return bool true if DTEND is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isDtendSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isDtendSet();
</p>
<a id="tzidparam"><h5>Set DTEND</h5></a>
<p>
Set property value. If DATE value type is expected, &quot;VALUE&quot; = &quot;DATE&quot; <b>must</b> be set
(in params<sup>2</sup>) otherwise DATE-TIME (default) value type is set.
</p>
<p>
Within the "VFREEBUSY" <strong>calendar</strong> component,
the time MUST be specified in the <a href="#DATE_WITH_UTC_TIME">UTC</a> datetime zone.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
Exception on DateTime error.
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setDtend( dtendDate [, params<sup>2</sup> ] )
<p class="comment">
dtendDate = (object) DateTimeInterface instance
dtendDate = (string) date/datetime string<sup>*</sup>
params<sup>2</sup> = (array) ([ tzidparam/datetimeparam/dateparam ] *[,xparams])
tzidparam = Vcalendar::TZID =&gt; (string) &lt;timezone identifier&gt;
// <span class="comment">output as local date-time with timezone identifier</span>
// <span class="comment">if tzidparam is &quot;UTC&quot; then output date-time is suffixed by 'Z'</span>
datetimeparam = Vcalendar::VALUE =&gt; Vcalendar::DATE_TIME // <span class="comment">default, output as date-time</span>
dateparam = Vcalendar::VALUE =&gt; Vcalendar::DATE // <span class="comment">output as DATE, ex. all-day event</span>
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
<br>
<sup>*</sup> please notice <a href="#date_restraints">date restraints</a>.
</p>
<p class="label">Example 1</p>
<p class="example">
try {
$vevent-&gt;setDtend( new DateTime( '2006-08-11 16:30:00' ));
<span class="comment">// 11 august 2006 16.30.00 local date</span>
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 2</p>
<p>End of an all-day event.<p>
<p class="example">use Kigkonsult\Icalcreator\Vcalendar;
try {
$vevent-&gt;setDtend(
'20060811',
[ Vcalendar::VALUE =&gt; Vcalendar::DATE ]
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 3</p>
<p>Will output: DTEND;TZID=Europe/Stockholm:20060811T093000</p>
<p class="example">
try {
$vevent-&gt;setDtend(
new DateTime( '2006-08-11 09:30:00', new DateTImeZone( 'Europe/Stockholm' ));
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="DTSTAMP"></a><h3>3.2.20 DTSTAMP</h3>
<p class="quotes">
The property indicates the date/time the Vcalendar instance was created and is OPTIONAL and
MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
DTSTAMP is <b>AUTOMATICALLY GENERATED</b> in iCalcreator at instance creation.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
DTSTAMP MUST occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>
and may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
DTSTAMP may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
DTSTAMP may be required when importing iCal formatted information
into some <strong>calendar</strong> software<br>(MS etc.),
as well as (<strong>calendar</strong>) <a href="#X-PROPERTY">x-properties</a> "X-WR-CALNAME",
"X-WR-CALDESC" and<br>"X-WR-TIMEZONE",
<a href="#METHOD">METHOD</a> property (value PUBLISH etc.)
and the (also auto created) <a href="#UID">UID</a> property.
</p>
<p>The value type for DTSTAMP is <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) DTSTAMP values.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::DTSTAMP is available.
</p>
<p>
For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.
Note, NO deleteDtstamp() method, use setDtstamp() to recreate.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="DTSTART"></a><h3>3.2.21 DTSTART</h3>
<p class="quotes">
This property specifies when the <strong>calendar</strong> component begins.
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
The property is REQUIRED, but MUST NOT occur more than once in
<a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;Calendar Availability&quot;
</dt>
<dd>
DTSTART may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and
MUST occur once in <a href="#AVAILABLE">AVAILABLE</a>.<br>
<a href="#VAVAILABILITY">VAVAILABILITY</a> / <a href="#AVAILABLE">AVAILABLE</a>
may NOT be supported by all calendaring software.
</dd>
<dd>
If specified in <a href="#VAVAILABILITY">VAVAILABILITY</a> / <a href="#AVAILABLE">AVAILABLE</a>,
DTSTART MUST be "DATE-TIME" value specified as either the date with UTC time or
the date with local time and a time zone reference.
</dd>
</dl>
<p>The default value type for DTSTART is DATE-TIME, can be set to a DATE value type.</p>
<p>
For an &quot;all-day event&quot; and using timeless dates, example (2007-12-01)<br>
DTSTART;VALUE=DATE:20071201<br>
DTEND;VALUE=DATE:20071202. // <span class="comment">opt., in effect midnight of the day <u>before</u> the date!!</span>
</p>
<p>For methods and formatting, explore the <a href="#DTEND">DTEND</a> property.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::DTSTART<br>
- Kigkonsult\Icalcreator\Vcalendar::VALUE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE_TIME<br>
- Kigkonsult\Icalcreator\Vcalendar::TZID<br>
are available.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="DUE"></a><h3>3.2.22 DUE</h3>
<p class="quotes">
This property defines the date and time when a <a href="#VTODO">VTODO</a> is expected to be completed
and is OPTIONAL and MUST NOT occur more than once and only if DURATION NOT occurs.
</p>
<p>
The default value type for DUE is DATE-TIME, can be set to a DATE value type.
</p>
<p class="quotes">
The value type of the "DTEND" or "DUE" properties MUST match the value type of "DTSTART" property as defined in [RFC5545])
</p>
<p>For methods and formatting, explore the <a href="#DTEND">DTEND</a> property.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::DUE<br>
- Kigkonsult\Icalcreator\Vcalendar::VALUE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE_TIME<br>
- Kigkonsult\Icalcreator\Vcalendar::TZID<br>
are available.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="DURATION"></a><h3>3.2.23 DURATION</h3>
<p class="quotes">
The property specifies a positive duration of time.
</p>
<dl>
<dt>In a <a href="#VEVENT">VEVENT</a>
<dd>it is OPTIONAL and MUST NOT occur more than once and MUST NOT occur in pair with DTEND. If one occurs, so MUST NOT the other.<br>
<dt>In a <a href="#VTODO">VTODO</a>
<dd>it is OPTIONAL and MUST NOT occur more than once and MUST NOT occur in pair with DUE. If one occurs, so MUST NOT the other.<br>
<dt>In a <a href="#VFREEBUSY">VFREEBUSY</a>
<dd>it is OPTIONAL and MUST NOT occur more than once. ([RFC5545])<br>
<dd>it can not appear. ([RFC5545])<br>
<dt>In a <a href="#VALARM">VALARM</a>
<dd>it is OPTIONAL and MUST NOT occur more than once and MUST occur in pair with TRIGGER. If one occurs, so MUST the other.
</dl>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;Calendar Availability&quot;
</dt>
<dd>
Either <a href="#DTEND">DTEND</a> or DURATION MAY appear in
<a href="#VAVAILABILITY">VAVAILABILITY</a> / <a href="#AVAILABLE">AVAILABLE</a>,
but <a href="#DTEND">DTEND</a> and DURATION MUST NOT occur in the same
<a href="#VAVAILABILITY">VAVAILABILITY</a> / <a href="#AVAILABLE">AVAILABLE</a>.<br>
<a href="#VAVAILABILITY">VAVAILABILITY</a> / <a href="#AVAILABLE">AVAILABLE</a>
may NOT be supported by all calendaring software.
</dd>
<dd>
The <a href="#VAVAILABILITY">VAVAILABILITY</a> DURATION MUST NOT be present if
<a href="#DTSTART">DTSTART</a> is not present
</dd>
</dl>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::DURATION is available.
</p>
<h5>Create DURATION</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createDuration()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createDuration();
</p>
<h5>Delete DURATION</h5>
<p>Remove DURATION from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteDuration()</p>
<p class="label">Example</p>
<p class="example">
$valarm-&gt;deleteDuration();
</p>
<h5>Get DURATION</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getDuration()</p>
<p class="comment">output = duration<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getDuration( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; duration<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$duration = $vtodo-&gt;getDuration();
</p>
<p class="label">option</p>
<p>
If (1st) argument is true and a 2nd is used and set to true, returned output is in a DATE-TIME
output format (like <a href="#DTEND">DTEND</a> / <a href="#DUE">DUE</a>), based on
<a href="#DTSTART">DTSTART</a> value with the added DURATION value (incl. opt. timezone).
</p>
<h5>is DURATION set</h5>
<p>Return bool true if DURATION is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isDurationSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isDurationSet();
</p>
<h5>Set DURATION</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
Exception on DateInterval error.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setDuration( duration [, xparams ] )</p>
<p class="comment">
duration = (object) DateInterval class instance
duration = (string) dur-value = [&quot;+&quot;] &quot;P&quot; (dur-date/dur-time/dur-week) like &quot;P15DT5H0M20S&quot;
dur-date = dur-day [dur-time]
dur-time = &quot;T&quot; (dur-hour / dur-minute / dur-second)
dur-week = 1*DIGIT &quot;W&quot;
dur-hour = 1*DIGIT &quot;H&quot; [dur-minute]
dur-minute = 1*DIGIT &quot;M&quot; [dur-second]
dur-second = 1*DIGIT &quot;S&quot;
dur-day = 1*DIGIT &quot;D&quot;
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example 1</p>
<p>One day duration.</p>
<p class="example">
try {
$vtodo-&gt;setDuration( new DateInterval( "P1D" ));
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 2</p>
<p>Four hours duration.</p>
<p class="example">
try {
$vtodo-&gt;setDuration( &quot;PT4H&quot; );
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="EXDATE"></a><h3>3.2.24 EXDATE</h3>
<p class="quotes">
This property defines the list of date/time exceptions for a recurring <strong>calendar</strong> component
and is OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>The default value type for EXDATE is DATE-TIME, can be set to a DATE value type.</p>
<p>
</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
EXDATE may occur more than once in <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::EXDATE<br>
- Kigkonsult\Icalcreator\Vcalendar::VALUE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE_TIME<br>
are available.
</p>
<h5>Create EXDATE</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createExdate()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createExdate();
</p>
<h5>Delete EXDATE</h5>
<p>Remove EXDATE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteExdate()</p>
<p class="label">Example 1</p>
<p class="example">
$vtodo-&gt;deleteExdate();
</p>
<p class="label">Example 2</p>
<P>Delete EXDATE property no 2.</p>
<p class="example">
$vjournal-&gt;deleteExdate( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all EXDATE properties.</p>
<p class="example">
while( $vjournal-&gt;deleteExdate()) {
continue;
}
</p>
<h5>Get ALL EXDATE</h5>
<p>Returns array : all EXDATE, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllExdate( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get EXDATE</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getExdate()<p>
<p class="comment">output = exdates<sup>1</sup> (with date<sup>1</sup>)</p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getExdate( propOrderNo/null, true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; exdates<sup>1</sup> (with date<sup>1</sup>),
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$exdate = $vtodo-&gt;getExdate();
</p>
<h5>is EXDATE set</h5>
<p>Return bool true if EXDATE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isExdateSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isExdateSet();
</p>
<h5>Set EXDATE</h5>
<p>Set property value.</p>
<p>The value type for EXDATE should match the <a href="#DTSTART">DTSTART</a> value type.</p>
<p>
If no &quot;VALUE&quot; value type is set, DATE-TIME (default) value type is set.
</p>
<p>
If timezone in 1st date, all remaining dates are within this timezone and param &quot;TZID&quot; is set.<br>
</p>
<p>EXDATEs are automatically sorted in ascending order (Y-m-d[-H-i-s]).</p>
<p>
In spite of the fact that EXDATE may contain a (comma separated) list of values,
a strong recommendation is to split an EXDATE &quot;list&quot; into multiple single EXDATE entries.
(But if you do, don't mix timezones, may result in incorrect date values.)
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
Exception on DateTime error.
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setExdate( exdates [, params [, propOrderNo ]] )</p>
<p class="comment">exdates<sup>1</sup> = date / (array) ( date *[, date ] )
date = (object) DateTimeInterface instance
date = (string) date/datetime string<sup>*</sup>
params<sup>2</sup> = (array) ([(datetimeparam/dateparam)&nbsp;/ tzidparam] *[,xparams])
// <span class="comment">default, output as date-time</span>
datetimeparam = Vcalendar::VALUE =&gt; Vcalendar::DATE_TIME
// <span class="comment">output as DATE</span>
dateparam = Vcalendar::VALUE =&gt; Vcalendar::DATE
tzidparam = Vcalendar::TZID =&gt; (string) &lt;timezone identifier&gt;
// <span class="comment">key prefix &quot;X-&quot;</span>
xparams = (string) key =&gt; (string) value
// <span class="comment">1=1st, 2=2nd etc</span>
propOrderNo = (int) order number
<br>
<sup>*</sup> please notice <a href="#date_restraints">date restraints</a>.
</p>
<p class="label">Example</p>
<p>Exclude 2006-08-11 from the recurrence pattern.</p>
<p class="example">use Kigkonsult\Icalcreator\Vcalendar;
try {
$vevent-&gt;setExdate(
[ new DateTime( '2006-08-11' ) ],
[ Vcalendar::VALUE =&gt; Vcalendar::DATE ]
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="EXRULE"></a><h3>3.2.25 EXRULE</h3>
<p class="quotes">
This property defines a rule or repeating pattern for an exception to a recurrence set and is OPTIONAL
and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>EXRULE is deprecated in [RFC5545]!</p>
<p>
Uses the methods and formats as <a href="#RRULE">RRULE</a>.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="FREEBUSY_PROP"></a><h3>3.2.26 FREEBUSY</h3>
<p class="quotes">
The property defines one or more free or busy time intervals in a <a href="#VFREEBUSY">VFREEBUSY</a>
<strong>calendar</strong> component.
<p>
<p>The value type for FREEBUSY is PERIOD. A PERIOD is DATE-TIME/DATE-TIME or DATE-TIME/duration and in the <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::FREEBUSY<br>
- Kigkonsult\Icalcreator\Vcalendar::FBTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::FREE<br>
- Kigkonsult\Icalcreator\Vcalendar::BUSY<br>
- Kigkonsult\Icalcreator\Vcalendar::BUSY_UNAVAILABLE<br>
- Kigkonsult\Icalcreator\Vcalendar::BUSY_TENTATIVE<br>
are available.
</p>
<h5>Create FREEBUSY</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createFreebusy()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createfreebusy();
</p>
<h5>Delete FREEBUSY</h5>
<p>Remove FREEBUSY from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteFreebusy()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) FREEBUSY property</p>
<p class="example">
$vfreebusy-&gt;deleteFreebusy();
</p>
<p class="label">Example 2</p>
<p>Delete FREEBUSY property no 2.</p>
<p class="example">
$vfreebusy-&gt;deleteFreebusy( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all FREEBUSY properties.</p>
<p class="example">
while( $vfreebusy-&gt;deleteFreebusy()) {
continue;
}
</p>
<h5>Get ALL FREEBUSY</h5>
<p>Returns array : all FREEBUSY, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllFreebusy( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get FREEBUSY</h5>
<p>If set, returns property value, otherwise bool false. Note, NO freebusytype!</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getFreebusy()</p>
<p class="comment">
output = (array) periods<sup>2</sup> with (array) startdate, enddate/duration<sup>2</sup> below
</p>
<p class="label">Format 2</p>
<p>If set, returns property value and params, otherwise bool false. Freebusytype in params.</p>
<p class="format">calendarComponent::getFreebusy( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">
output = [
&quot;value&quot; =&gt; array( periods),
&quot;params&quot; =&gt; [ &quot;FBTYPE&quot; =&gt; freebusytype, *xparams<sup>3</sup> ]
]
periods = (array) periods<sup>2</sup> with (array) startdate, enddate/duration<sup>2</sup> below
</p>
<p class="label">Example</p>
<p class="example">
$freebusy = $vfreebusy-&gt;getFreebusy();
</p>
<h5>is FREEBUSY set</h5>
<p>Return bool true if FREEBUSY is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isFreebusySet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vfreebusy-&gt;isFreebusySet();
</p>
<h5>Set FREEBUSY</h5>
<p>
Set property value. FREEBUSY date is always a <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME
in pair with another <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME or a DateInteval.
Set dates within the same timezone, otherwise it may lead to unpredictable result;
</p>
<p>
In spite of the fact that FREEBUSYs may contain a (comma separated) list of values,
a strong recommendation is to split a FREEBUSYs &quot;list&quot; into multiple single FREEBUSY entries.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
Exception on DateTime/DateInterval error.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setFreebusy( freebusytype, periods<sup>2</sup> [,xparams [,propOrderNo ]] )</p>
<p class="comment">freebusytype = one of Vcalendar::FREE
/ Vcalendar::BUSY <b>Default</b>
/ Vcalendar::BUSY-UNAVAILABLE
/ Vcalendar::BUSY-TENTATIVE
/ x-name
periods<sup>2</sup> = (array) ( period [, period... ] )
period = (array) ( startdate, enddate/duration )
startdate/enddate = (object) DateTimeInterface instance, will be set to UTC if not UTC timezone
startdate/enddate = (string) datetime string<sup>*</sup>
duration = (object) DateInterval class instance
duration = (string) dur-value = (&quot;+&quot;)&quot;P&quot;(dur-date/dur-time/dur-week) like &quot;P15DT5H0M20S&quot;
dur-date = dur-day [dur-time]
dur-time = &quot;T&quot; (dur-hour / dur-minute / dur-second)
dur-week = 1*DIGIT &quot;W&quot;
dur-hour = 1*DIGIT &quot;H&quot; [dur-minute]
dur-minute = 1*DIGIT &quot;M&quot; [dur-second]
dur-second = 1*DIGIT &quot;S&quot;
dur-day = 1*DIGIT &quot;D&quot;
xparams<sup>3 </sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
<br>
<sup>*</sup> please notice <a href="#date_restraints">date restraints</a>.
</p>
<p class="label">Example 1</p>
<p>
See rules in detail in <a href="https://tools.ietf.org/html/rfc5545" title="RFC5545" target="_blank">RFC5545</a>
&quot;Internet Calendaring and Scheduling Core Object Specification (iCalendar)&quot;.
The recommended way :
</p>
<p class="label">Example 1</p>
<p>Single FREEBUSY entries</p>
<p class="example">
try {
$freebusy1->setFreebusy(
Vcalendar::FREE,
[
new DateTime( "2001-01-01 01:01:01 UTC" ),
new DateTime( "2002-02-02 02:02:02 UTC" )
]
);
$freebusy1->setFreebusy(
Vcalendar::FREE,
[
new DateTime( "2003-03-03 03:03:03 UTC" ),
new DateInterval( "P5DT5H5M5S" )
],
);
$freebusy1->setFreebusy(
Vcalendar::FREE,
[
"4 April 2005 4:4:4 UTC",
"P2D"
]
)
->setFreebusy(
Vcalendar::BUSY,
[
new DateTime( "2001-01-01 01:01:01 UTC" ),
new DateTime( "2002-02-02 02:02:02 UTC" )
],
)
->setFreebusy(
Vcalendar::BUSY,
[
new DateTime( "2003-03-03 03:03:03 UTC" ),
"P2D"
],
)
->setFreebusy(
Vcalendar::BUSY,
[
"4 April 2005 4:4:4 UTC",
new DateInterval( "PT5H" )
],
)
->setFreebusy(
Vcalendar::BUSY,
[
new DateTime( "2001-01-01 01:01:01 UTC" ),
new DateTime( "2003-03-03 03:03:03 UTC" )
]
);
}
catch( Exception $e ) {
die( $e->getMessage());
}
</p>
<p class="label">Example 2</p>
<p>FREEBUSY entries as <i>list</i> of entries</p>
<p class="example">
try {
$freebusy2-&gt;setFreebusy(
Vcalendar::FREE,
[
[
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; ),
new DateTime( &quot;2002-02-02 02:02:02 UTC&quot; )
],
[
new DateTime( &quot;2003-03-03 03:03:03 UTC&quot; ),
new DateInterval( &quot;P5DT5H5M5S&quot; )
],
[
&quot;4 April 2005 4:4:4 UTC&quot;,
&quot;P2D&quot;
]
]
)
-&gt;setFreebusy(
Vcalendar::BUSY,
[
[
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; ),
new DateTime( &quot;2002-02-02 02:02:02 UTC&quot; )
],
[
new DateTime( &quot;2003-03-03 03:03:03 UTC&quot; ),
&quot;P2D&quot;
],
[
&quot;4 April 2005 4:4:4 UTC&quot;,
new DateInterval( &quot;PT5H&quot; )
],
[
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; ),
new DateTime( &quot;2003-03-03 03:03:03 UTC&quot; )
]
]
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="GEO"></a><h3>3.2.27 GEO</h3>
<p class="quotes">
This property specifies information related to the global position for the activity specified by
<a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a> components
and is OPTIONAL and MUST NOT occur more than once.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
GEO may occur once in
<a href="#PARTICIPANT">PARTICIPANT</a>,
<a href="#VRESOURCE">VRESOURCE</a>and
<a href="#VLOCATION">VLOCATION</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>Value type for latitude and longitude is FLOAT.</p>
<p class="quotes">Values for latitude and longitude shall be expressed as decimal
fractions of degrees. Whole degrees of latitude shall be represented by
a two-digit decimal number ranging from 0 through 90. Whole degrees
of longitude shall be represented by a decimal number ranging from 0
through 180. When a decimal fraction of a degree is specified, it shall
be separated from the whole number of degrees by a decimal point.</p>
<p>The output (float) latitude and longitude values are presented up to six decimals.</p>
<p>Using the non-standard directive &quot;GEOLOCATION&quot;, iCalcreator returns output
by combining the <a href="#LOCATION">LOCATION</a> and <a href="#GEO">GEO</a> property values,
(separated by "/") and only if <a href="#GEO">GEO</a> is set).
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::GEO<br>
- Kigkonsult\Icalcreator\Vcalendar::LATITUDE<br>
- Kigkonsult\Icalcreator\Vcalendar::LONGITUDE<br>
are available.
</p>
<h5>Create GEO</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createGeo()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createGeo();
</p>
<h5>Delete GEO</h5>
<p>Remove GEO from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteGeo()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteGeo();
</p>
<h5>Get GEO</h5>
<p>If set, returns GEO property value (latitude/longitude) as prescribed in [RFC5545], otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getGeo()</p>
<p class="comment">output = array( &quot;latitude&quot; =&gt; &lt;latitude&gt;
, &quot;longitude&quot; =&gt; &lt;longitude&gt;))</p>
<p class="label">Format 2</p>
<p class="format">calendarComponent::getGeo( true )</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="comment">output = [
&quot;value&quot; =&gt; array ( &quot;latitude&quot; =&gt; &lt;latitude&gt;, &quot;longitude&quot; =&gt; &lt;longitude&gt; ),
&quot;params&quot; =&gt; xparams<sup>1</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$geo = $vevent-&gt;getGeo();
</p>
<h5>is GEO set</h5>
<p>Return bool true if GEO is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isGeoSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isGeoSet();
</p>
<h5>Set GEO</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty values and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setGeo( latitude, longitude [, xparams ] )</p>
<p class="comment">latitude = (float) latitude
longitude = (float) longitude
xparams<sup>1</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setGeo( 11.23456, -23.45678 );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="IMAGE"></a><h3>3.2.28 IMAGE</h3>
<p class="quotes">
<p>IMAGE specifies an image associated with the calendar or a calendar component.</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
IMAGE may be specified multiple times in <a href="#VCALENDAR">VCALENDAR</a> and in
<a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is URI.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::IMAGE<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::DISPLAY<br>
- Kigkonsult\Icalcreator\Vcalendar::URI<br>
- Kigkonsult\Icalcreator\Vcalendar::BINERY<br>
- Kigkonsult\Icalcreator\Vcalendar::ENCODING<br>
- Kigkonsult\Icalcreator\Vcalendar::FMTTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::BASE64<br>
are available.
</p>
<p>
Methods and usage, below, applies also to Vcalendar instance.
</p>
<h5>Create IMAGE</h5>
<p>If set, returns [RFC7986] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createImage()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createImage();
</p>
<h5>Delete IMAGE</h5>
<p>Remove IMAGE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteImage()</p>
<p class="label">Example 1</p>
<p class="example">
$vevent-&gt;deleteImage();
</p>
<p class="label">Example 2</p>
Delete IMAGE property no 2.
<p class="example">
$vevent-&gt;deleteImage( 2 );
</p>
<p class="label">Example 3</p>
Deleting all IMAGE properties.
<p class="example">
while( $vevent-&gt;deleteImage()) {
continue;
}
</p>
<h5>Get ALL IMAGE</h5>
<p>Returns array : all IMAGE, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllImage( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get IMAGE</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getImage()</p>
<p class="comment">output = imageValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getImage( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value,
<p class="comment">output = [
&quot;value&quot; =&gt; imageValue<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getImage( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value order number</p>
<p class="comment">Get propOrderNo IMAGE</p>
<p class="label">Example</p>
<p class="example">
$image = $valarm-&gt;getImage();
</p>
<h5>is IMAGE set</h5>
<p>Return bool true if IMAGE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isImageSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isImageSet();
</p>
<h5>Set IMAGE</h5>
<p>
Set property value. Parameters will be ordered as prescribed in [RFC7986].
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setImage( imageValue<sup>1</sup> [, params [, propOrderNo ]] )</p>
<p class="comment">imageValue<sup>1</sup> = (string) URI / inline binary encoded content
params<sup>2</sup> 1 = [ // value is URI
Vcalendar::VALUE =&gt; Vcalendar::URI ], imageParams
]
params<sup>2</sup> 2 = [ // value is binary
Vcalendar::ENCODING =&gt; Vcalendar::BASE64,
Vcalendar::VALUE =&gt; Vcalendar::BINARY,
imageParams
]
imageParams = [
Vcalendar::FMTTYPE =&gt; contentType,
Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;,
Vcalendar::DISPLAY =&gt; displayVal,
xparams
]
contentType = (string) The parameter value MUST be the TEXT for either an IANA
registered content type or a non-standard content type.
displayval = one or more (comma separated)
Vcalendar::BADGE // image inline with the title of the event, DEFAULT
Vcalendar::GRAPHIC // a full image replacement for the event itself
Vcalendar::FULLSIZE // an image that is used to enhance the event
Vcalendar::THUMBNAIL // a smaller variant of "FULLSIZE" to be used
// when space for the image is constrained
x-name // Experimental type
iana-token // Other IANA-registered type
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setImage(
&quot;ftp://domain.com/pub/docs/agenda.doc&quot;,
[ Vcalendar::FMTTYPE =&gt; &quot;application/binary&quot; ]
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="LAST-MODIFIED"></a><h3>3.2.29 LAST-MODIFIED</h3>
<p class="quotes">
The property specifies the date and time that the information associated with the <strong>calendar</strong>
component was last revised in the <strong>calendar</strong> store.
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a>
and <a href="#VTIMEZONE">VTIMEZONE</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
LAST-MODIFIED may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>
and may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
LAST-MODIFIED may occur once in <a href="#VCALENDAR">VCALENDAR</a>
and may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
LAST-MODIFIED may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for LAST-MODIFIED is <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::LAST_MODIFIED is available.
</p>
<p>For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="LOCATION"></a><h3>3.2.30 LOCATION</h3>
<p class="quotes">
The property defines the intended venue for the activity defined by a <strong>calendar</strong> component.
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>
and <a href="#VTODO">VTODO</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
LOCATION may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
LOCATION may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
<dd>
<br>
the <a href="#VCALENDAR">VCALENDAR</a> / <a href="#VEVENT">VEVENT</a> / <a href="#VTODO">VTODO</a> method
<i>vlocationNames2Location()</i><br>
may be used to create a new LOCATION from (first found)
<a href="#VLOCATION">VLOCATION</a> (sub-)component
and the <a href="#NAME">NAME</a> property value
with X-parameters for <a href="#VLOCATION">VLOCATION</a> properties
<a href="#UID">UID</a> and <a href="#LOCATION-TYPE">LOCATION-TYPE</a>.<br>
Another option is to set LOCATION and <a href="#VLOCATION">VLOCATION</a> in pairs.
</dd>
</dl>
<p>The value type for LOCATION is TEXT.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) LOCATION values.</p>
<p>
Using the non-standard directive &quot;GEOLOCATION&quot;, iCalcreator returns output
by combining the <a href="#LOCATION">LOCATION</a> and <a href="#GEO">GEO</a> property values,
(separated by "/") and only if <a href="#GEO">GEO</a> is set).
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::LOCATION<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create LOCATION</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createLocation()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createLocation();
</p>
<h5>Delete LOCATION</h5>
<p>Remove LOCATION from component.</p>
<p>
For LOCATION in <a href="#PARTICIPANT">PARTICIPANT</a> (may occur more than once),
review <a href="#CATEGORIES">CATEGORIES</a> delete-method with &quot;propOrderNo&quot; argument.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteLocation()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteLocation();
</p>
<h5>Get ALL LOCATION</h5>
<p>Returns array : all LOCATION, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllLocation( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get LOCATION</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p>
For LOCATION in <a href="#PARTICIPANT">PARTICIPANT</a> (may occur more than once),
review <a href="#CATEGORIES">CATEGORIES</a> get-method with &quot;propOrderNo&quot; argument.
</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getLocation()</p>
<p class="comment">output = location<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getLocation( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; location<sup>1</sup>,
&quot;params&quot; =&gt; param<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$location = $vevent-&gt;getLocation();
</p>
<h5>is LOCATION set</h5>
<p>Return bool true if LOCATION is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isLocationSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isLocationSet();
</p>
<h5>Set LOCATION</h5>
<p>Set property value.</p>
<p>
For LOCATION in <a href="#PARTICIPANT">PARTICIPANT</a> (may occur more than once),
review <a href="#CATEGORIES">CATEGORIES</a> set-method with &quot;propOrderNo&quot; argument.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setLocation( location [, param [, propOrderNo]] )</p>
<p class="comment">location<sup>1</sup> = (string) Value type TEXT
params<sup>2</sup> = (array) (
[ Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;]
[, Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;]
*[, xparams ]
)
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
lang<sup>*</sup> = as defined in [RFC5546]
propOrderNo = (int) order number // <span class="comment">opt, 1=1st, 2=2nd etc, <a href="#PARTICIPANT">PARTICIPANT</a> only</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setLocation( &quot;Buckingham Palace&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="LOCATION-TYPE"></a><h3>3.2.31 LOCATION-TYPE</h3>
<p class="quotes">LOCATION-TYPE specifies the type(s) of a location</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
LOCATION-TYPE specifies the type(s) of a location
and may occur once in <a href="#VLOCATION">VLOCATION</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is TEXT.</p>
<p>
Values are taken from the values defined in Section 3 of
<a href="https://tools.ietf.org/html/rfc4589" title="Download rfc4589" target="_blank">rfc4589</a>.
</p>
<p>
To ease up usage, constants Kigkonsult\Icalcreator\Vcalendar::LOCATION-TYPE is available.
</p>
<p>For methods and formatting, explore the <a href="#NAME">NAME</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="NAME"></a><h3>3.2.32 NAME</h3>
<p class="quotes">
NAME specifies the name of the calendar.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
NAME may occur more than once in <a href="#VCALENDAR">VCALENDAR</a> and may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
NAME may occur once in <a href="#VLOCATION">VLOCATION</a> and <a href="#VRESOURCE">VRESOURCE</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is TEXT.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::NAME<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create NAME</h5>
<p>If set, returns [RFC7986] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::createDescription()</p>
<p class="label">Example</p>
<p class="example">
$str = $calendar-&gt;createName();
</p>
<h5>Delete NAME</h5>
<p>Remove NAME from calendar.</p>
<p>
For NAME in <a href="#VCALENDAR">VCALENDAR</a> (may occur more than once),
review <a href="#CATEGORIES">CATEGORIES</a> delete-method with &quot;propOrderNo&quot; argument.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::deleteName()</p>
<p class="label">Example</p>
<p>Delete (single/first) NAME property.</p>
<p class="example">
$calendar-&gt;deleteName();
</p>
<h5>Get ALL NAME</h5>
<p>Returns array : all NAME, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllName( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get NAME</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p>
For NAME in <a href="#VCALENDAR">VCALENDAR</a> (may occur more than once),
review <a href="#CATEGORIES">CATEGORIES</a> get-method with &quot;propOrderNo&quot; argument.
</p>
<p class="label">Format 1</p>
<p class="format">Vcalendar::getName()</p>
<p class="comment">output = nameValue<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">Vcalendar::getName( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; nameValue<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$name = $calendar-&gt;getName();
</p>
<h5>is NAME set</h5>
<p>Return bool true if NAME is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isNameSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vcalendar-&gt;isNameSet();
</p>
<h5>Set NAME</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC7986].
<p class="label">Format</p>
<p class="format">Vcalendar::setName( nameValue [, params [, propOrderNo ]] )</p>
<p class="comment">nameValue<sup>1</sup> = (string) Value type TEXT
params<sup>2</sup> = [
Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;,
Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;
],
*xparams
lang<sup>*</sup> = as defined in [RFC5546]
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">opt, 1=1st, 2=2nd etc, <a href="#VCALENDAR">VCALENDAR</a> only</span>
</p>
<p class="label">Example</p>
<p class="example">
$calendar-&gt;setName( &quot;This is a name&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="ORGANIZER"></a><h3>3.2.33 ORGANIZER</h3>
<p class="quotes">
The property defines the organizer for a <strong>calendar</strong> component and is OPTIONAL
and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
ORGANIZER may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a>,
may NOT be supported by all calendaring software.
</dd>
</dl>
<p>This value type for ORGANIZER is URI, a <strong>calendar</strong> user address.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) ORGANIZER values.</p>
<p>You can export <strong>calendar</strong> ORGANIZER values as <a href="#iCal2vCards">vCards</a>.
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::ORGANIZER<br>
- Kigkonsult\Icalcreator\Vcalendar::CN<br>
- Kigkonsult\Icalcreator\Vcalendar::DIR<br>
- Kigkonsult\Icalcreator\Vcalendar::SENT_BY<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create ORGANIZER</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createOrganizer()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createOrganizer();
</p>
<h5>Delete ORGANIZER</h5>
<p>Remove ORGANIZER from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteOrganizer()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteOrganizer();
</p>
<h5>Get ORGANIZER</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getOrganizer()</p>
<p class="comment">output = organizer<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getOrganizer( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; organizer<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$organizer = $vevent-&gt;getOrganizer();
</p>
<h5>is ORGANIZER set</h5>
<p>Return bool true if ORGANIZER is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isOrganizerSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isOrganizerSet();
</p>
<h5>Set ORGANIZER</h5>
<p>Set property value.
Property value must be prefixed by protocol
(&quot;ftp://&quot;, &quot;https://&quot;, &quot;mailto:&quot;, &quot;file://&quot; etc,
ref. <a href="https://tools.ietf.org/html/rfc1738" title="Download 1738" target="_blank">rfc1738</a>),
&quot;mailto:&quot; is prefixed if missing.
Also DIR parameter must be prefixed by protocol.
SENT-BY parameter must use protocol &quot;mailto:&quot;, prefixed if missing.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setOrganizer( organizer [, params] )</p>
<p class="comment">organizer<sup>1</sup> = (string) a <strong>calendar</strong> user address (cal-address), a URI as defined by
[RFC 1738] or any other IANA registered form for a URI.
params<sup>2</sup> = (array) Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;, // applies to the CN parameter value
Vcalendar::CN =&gt; (string) &quot;common name to be associated with the
<strong>calendar</strong> user specified by the property&quot;,
Vcalendar::DIR =&gt; (string) &quot;reference to a directory entry associated
with the <strong>calendar</strong> user specified by the property&quot;,
Vcalendar::SENT_BY =&gt; (string) (cal-address, above)
&quot;single <strong>calendar</strong> user that is acting on behalf
of the <strong>calendar</strong> user specified by the property&quot;,
*xparams
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$dir = &quot;ldap://domain.com:6666/o=3DDC%20Comp,c=3DUS??(cn=3DJohn%20Doe)&quot;;
$vevent-&gt;setOrganizer(
&quot;ical@domain.com&quot;,
[
Vcalendar::CN =&gt; &quot;John Doe&quot;,
Vcalendar::DIR =&gt; $dir,
Vcalendar::SENT_BY =&gt; &quot;secretary@domain.com&quot;,
&quot;X-Key1&quot; =&gt; &quot;X-Value1&quot;,
&quot;X-Key2&quot; =&gt; &quot;X-Value2&quot;
]
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="PARTICIPANT-TYPE"></a><h3>3.2.34 PARTICIPANT-TYPE</h3>
<p class="quotes">PARTICIPANT-TYPE specifies the type of participant.</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
PARTICIPANT-TYPE specifies the type of participant
and may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is TEXT.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::PARTICIPANT_TYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::ACTIVE<br>
- Kigkonsult\Icalcreator\Vcalendar::INACTIVE<br>
- Kigkonsult\Icalcreator\Vcalendar::SPONSOR<br>
- Kigkonsult\Icalcreator\Vcalendar::CONTACT<br>
- Kigkonsult\Icalcreator\Vcalendar::BOOKING_CONTACT<br>
- Kigkonsult\Icalcreator\Vcalendar::EMERGENCY_CONTACT<br>
- Kigkonsult\Icalcreator\Vcalendar::PUBLICITY_CONTACT<br>
- Kigkonsult\Icalcreator\Vcalendar::PLANNER_CONTACT<br>
- Kigkonsult\Icalcreator\Vcalendar::PERFORMER<br>
- Kigkonsult\Icalcreator\Vcalendar::SPEAKER<br>
are available.
</p>
<p>For methods and formatting, explore the <a href="#CLASS">CLASS</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="PERCENT-COMPLETE"></a><h3>3.2.35 PERCENT-COMPLETE</h3>
<p class="quotes">
This property is used by an assignee or delegatee of a <a href="#VTODO">VTODO</a> to
convey the percent completion of a <a href="#VTODO">VTODO</a> to the Organizer and is
OPTIONAL and MUST NOT occur more than once.
</p>
<p>
The property value is a positive integer between zero and one hundred.
A value of "0" indicates the <a href="#VTODO">VTODO</a> has not yet been started.
A value of "100" indicates that the <a href="#VTODO">VTODO</a> has been completed.
Integer values in between indicate the percent partially complete.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::PERCENT_COMPLETE is available.
</p>
<h5>Create PERCENT-COMPLETE</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createPercentComplete()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createPercentComplete();
</p>
<h5>Delete PERCENT-COMPLETE</h5>
<p>Remove PERCENT-COMPLETE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deletePercentcomplete()</p>
<p class="label">Example</p>
<p class="example">
$vtodo-&gt;deletePercentcomplete()
</p>
<h5>Get PERCENT-COMPLETE</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getPercentcomplete()</p>
<p class="comment">output = percent<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getPercentcomplete( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; percent<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$percent = $vtodo-&gt;getPercentcomplete();
</p>
<h5>is PERCENT-COMPLETE set</h5>
<p>Return bool true if PERCENT-COMPLETE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isPercentcompleteSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vtodo-&gt;isPercentcompleteSet();
</p>
<h5>Set PERCENT-COMPLETE</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty (non-zero) value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setPercentcomplete( percent [, xparams ] )</p>
<p class="comment">percent<sup>1</sup> = (int) Value type INTEGER
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vtodo-&gt;setPercentcomplete( 90 );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="PRIORITY"></a><h3>3.2.36 PRIORITY</h3>
<p class="quotes">
The property defines the relative priority for a <strong>calendar</strong> component and is OPTIONAL
and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
PRIORITY may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
PRIORITY may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
The priority is specified as an integer in the range zero to nine.<br>
A value of zero (US-ASCII decimal 48) specifies an undefined priority.<br>
A value of one (US-ASCII decimal 49) is the highest priority.<br>
A value of two (US-ASCII decimal 50) is the second highest priority.<br>
Subsequent numbers specify a decreasing ordinal priority.<br>
A value of nine (US-ASCII decimal 58) is the lowest priority.
</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) PRIORITY values.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::PRIORITY is available.
</p>
<h5>Create PRIORITY</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createPriority()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createPriority();
</p>
<h5>Delete PRIORITY</h5>
<p>Remove PRIORITY from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deletePriority()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deletePriority();
</p>
<h5>Get PRIORITY</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getPriority()</p>
<p class="comment">output = priority<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getPriority( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; priority<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$priority = $vevent-&gt;getPriority();
</p>
<h5>is PRIORITY set</h5>
<p>Return bool true if PRIORITY is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isPrioritySet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isPrioritySet();
</p>
<h5>Set PRIORITY</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true)
and if value is not an integer.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setPriority( priority [, xparams ] )</p>
<p class="comment">priority<sup>1</sup> = (int) Value type INTEGER
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setPriority( 3 );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="PROXIMITY"></a><h3>3.2.37 PROXIMITY</h3>
<p class="quotes">PROXIMITY indicates that a location-based trigger is applied to an <a href="#VALARM">VALARM</a></p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank">rfc9074</a>
&quot;VALARM Extensions for iCalendar&quot;
</dt>
<dd>
PROXIMITY is OPTIONAL but MUST NOT occur more than once in <a href="#VALARM">VALARM</a>
and may NOT be supported by all calendaring software.<br>
The <a href="#VALARM">VALARM</a> subcomponent <a href="#VLOCATION">VLOCATION</a> is OPTIONAL
and MAY occur more than once
but only when a PROXIMITY property is also present.
</dd>
</dl>
<p> The value type is TEXT.</p>
<p>
To ease up usage, constant<br>
- Kigkonsult\Icalcreator\Vcalendar::PROXIMITY<br>
- Kigkonsult\Icalcreator\Vcalendar::ARRIVE<br>
- Kigkonsult\Icalcreator\Vcalendar::DEPART<br>
- Kigkonsult\Icalcreator\Vcalendar::CONNECT<br>
- Kigkonsult\Icalcreator\Vcalendar::DISCONNECT<br>
are available.
</p>
<p>For methods and formatting, explore the <a href="#ACTION">ACTION</a> property, opt with usage of constants above</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="RDATE"></a><h3>3.2.38 RDATE</h3>
<p class="quotes">
This property defines the list of date/times for a recurrence set and is OPTIONAL and MAY occur
more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a>,
<a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
RDATE may occur more than once in <a href="#AVAILABLE">AVAILABLE</a>
</dd>
<dd>
may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
The default value type for RDATE is DATE-TIME, can be set to DATE or PERIOD (params<sup>2</sup>).
In <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components,
RDATE MUST be specified as a date-time value type with local time value.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::RDATE<br>
- Kigkonsult\Icalcreator\Vcalendar::VALUE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE_TIME<br>
- Kigkonsult\Icalcreator\Vcalendar::PERIOD<br>
are available.
</p>
<h5>Create RDATE</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createRdate()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createRdate();
</p>
<h5>Delete RDATE</h5>
<p>Remove RDATE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteRdate()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) RDATE property.</p>
<p class="example">
$vtodo-&gt;deleteRdate();
</p>
<p class="label">Example 2</p>
<p>Delete RDATE property no 2.</p>
<p class="example">
$vjournal-&gt;deleteRdate( 2 );
</p>
<p class="label">Example 3</p>
<p>Delete all RDATE properties.</p>
<p class="example">
while( $vjournal-&gt;deleteRdate()) {
continue;
}
</p>
<h5>Get ALL RDATE</h5>
<p>Returns array : all RDATE, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllRdate( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get RDATE</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getRdate()</p>
<p class="comment">output = dates<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getRdate( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; dates<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getRdate( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo RDATE</p>
<p class="label">Example</p>
<p class="example">
$rdates = $vevent-&gt;getRdate();
</p>
<h5>is RDATE set</h5>
<p>Return bool true if RDATE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isRdateSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isRdateSet();
</p>
<h5>Set RDATE</h5>
<p>Set property value.</p>
<p>The value type for RDATE should match the <a href="#DTSTART">DTSTART</a> value type.</p>
<p>
If no &quot;VALUE&quot; value type is set, DATE-TIME (default) value type is set.
</p>
<p>
If no &quot;TZID&quot; is set in params and timezone in 1st date, all remaining dates are within this timezone and param &quot;TZID&quot; is set.<br>
</p>
<p>RDATEs are automatically sorted in ascending order (Y-m-d[-H-i-s]).</p>
<p>
A RDATE may contain a (comma separated) list of date values, BUT,
a strong recommendation is to split a RDATE &quot;list&quot; into multiple single RDATE entries.
(But if you do, don't mix timezones, may result in incorrect date values.)
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
Exception on DateTime/DateInterval error.
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setRdate( dates [, params [, propOrderNo ]] )</p>
<p class="comment">dates<sup>1</sup> = singledate / (array) ( *singledate ) / (array) ( date2 *[, date2 ] )
date2 = (array) ( startdate, enddate/duration )
singledate = date
startdate = date
enddate = date
date = (object) DateTimeInterface instance
date = (string) date/datetime string<sup>*</sup>
duration = (object) DateInterval class instance
duration = (string) dur-value = (&quot;+&quot;)&quot;P&quot;(dur-date/dur-time/dur-week) like &quot;P15DT5H0M20S&quot;
dur-date = dur-day [dur-time]
dur-time = &quot;T&quot; (dur-hour / dur-minute / dur-second)
dur-week = 1*DIGIT &quot;W&quot;
dur-day = 1*DIGIT &quot;D&quot;
dur-hour = 1*DIGIT &quot;H&quot; [dur-minute]
dur-minute = 1*DIGIT &quot;M&quot; [dur-second]
dur-second = 1*DIGIT &quot;S&quot;
params<sup>2</sup> = ([tzidparam ( / datetimeparam / dateparam / periodparam )] *[, xparams ] )
tzidparam = Vcalendar::TZID =&gt; (string) &lt;timezone identifier&gt;
// <span class="comment">output as local DATE-TIME with timezone identifier</span>
// <span class="comment">if tzidparam=&quot;GMT&quot;/&quot;UTC&quot; then</span>
// <span class="comment">output date-time is suffixed by 'Z'</span>
datetimeparam = Vcalendar::VALUE =&gt; Vcalendar::DATE_TIME // <span class="comment">default, DATE-TIME</span>
dateparam = Vcalendar::VALUE =&gt; Vcalendar::DATE // <span class="comment">required if DATE</span>
periodparam = Vcalendar::VALUE =&gt; Vcalendar::PERIOD
// <span class="comment">required if PERIOD (datetime - datetime/duration)</span>
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
<br>
<sup>*</sup> please notice <a href="#date_restraints">date restraints</a>.
</p>
<p class="label">Example</p>
See rules in detail in <a href="https://tools.ietf.org/html/rfc5545" title="RFC5545" target="_blank">RFC5545</a>
&quot;Internet Calendaring and Scheduling Core Object Specification (iCalendar)&quot;.<br>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
try {
$vevent = $vcalendar-&gt;newVevent()
<span class="comment">// one recurrence date, if param VALUE is missing, DATE-TIME default</span>
-&gt;setRdate(
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; )
)
<span class="comment">// two or more recurrence dates</span>
-&gt;setRdate(
[
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; )
new DateTime( &quot;2002-02-02 02:02:02 UTC&quot; )
]
[ Vcalendar::VALUE =&gt; Vcalendar::DATE_TIME ]
)
<span class="comment">// one PERIOD, startdate-duration, VALUE &quot;PERIOD&quot; required</span>
-&gt;setRdate(
[
[
new DateTime( &quot;2002-02-02 02:02:02 UTC&quot; ),
new DateInterval( &quot;PT5H5M5S&quot; )
]
],
[ Vcalendar::VALUE =&gt; Vcalendar::PERIOD ]
)
<span class="comment">// one PERIOD, start- and endDate (accepted format for ONE period)</span>
-&gt;setRdate(
[
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; ),
new DateTime( &quot;2002-02-02 02:02:02 UTC&quot; )
],
[ Vcalendar::VALUE =&gt; Vcalendar::PERIOD ]
)
<span class="comment">// PERIOD, pairs of start- and endDates</span>
-&gt;setRdate(
[
[
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; ),
new DateTime( &quot;2002-02-02 02:02:02 UTC&quot; )
],
[
&quot;3 March 2003 03.03.03 UTC&quot;,
new DateTime( &quot;2004-04-04 04:04:04 UTC&quot; )
]
],
[ Vcalendar::VALUE =&gt; Vcalendar::PERIOD ]
)
<span class="comment">// PERIOD, pairs of start-/enddate and startdate-duration</span>
-&gt;setRdate(
[
[
new DateTime( &quot;2001-01-01 01:01:01 UTC&quot; ),
new DateTime( &quot;2002-02-02 02:02:02 UTC&quot; )
],
[
&quot;3 March 2003 03.03.03 UTC&quot;,
new DateInterval( &quot;PT7H&quot; )
]
],
[ Vcalendar::VALUE =&gt; Vcalendar::PERIOD ]
)
<span class="comment">// start- and enddate as DATE</span>
-&gt;setRdate(
[
[
new DateTime( &quot;2005-10-05 05:05:05 UTC&quot; ),
&quot;2008-08-08 08:08:08 UTC&quot; )
]
],
[ Vcalendar::VALUE =&gt; Vcalendar::DATE ]
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="RECURRENCE-ID"></a><h3>3.2.39 RECURRENCE-ID</h3>
<p class="quotes">
This property is used in conjunction with the <a href="#UID">UID</a> and <a href="#SEQUENCE">SEQUENCE</a>
property to identify a specific instance of a recurring <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>
or <a href="#VJOURNAL">VJOURNAL</a> <strong>calendar</strong> component and is OPTIONAL and MAY NOT occur more than once.
</p>
<p>
</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
RECURRENCE-ID may occur once in <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
The property value is the effective value of the <a href="#DTSTART">DTSTART</a> property of the recurrence instance.
The default value type is DATE-TIME, can be set to DATE (params<sup>2</sup>).
</p>
<p>For methods and formatting, explore the <a href="#DTEND">DTEND</a> property.</p>
<p>
The calendar method <a href="#sort2">SORT</a> with argument <a href="#UID">UID</a>
also use RECURRENCE-ID / <a href="#SEQUENCE">SEQUENCE</a> as sort parameters.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::RECURRENCE_ID<br>
- Kigkonsult\Icalcreator\Vcalendar::VALUE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE_TIME<br>
- Kigkonsult\Icalcreator\Vcalendar::TZID<br>
are available.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="REFRESH-INTERVAL"></a><h3>3.2.40 REFRESH-INTERVAL</h3>
<p class="quotes">
REFRESH-INTERVAL specifies a suggested minimum interval for
polling for changes of the calendar data from the original source
of that data.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
REFRESH-INTERVAL may occur once in <a href="#VCALENDAR">VCALENDAR</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is DURATION.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::REFRESH_INTERVAL is available.
</p>
<p>
For methods and usage, see <a href="#DURATION">3.2.23 DURATION</a> but applied on a Vcalendar instance.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="RELATED-TO"></a><h3>3.2.41 RELATED-TO</h3>
<p class="quotes">
The property is used to represent a relationship or reference
between one <strong>calendar</strong> component and another
and is OPTIONAL and MAY occur more than once in
<a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and
<a href="#VALARM">VALARM</a>
(<a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank">rfc9074</a>)
components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
RELATED-TO may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
The property value consists of the persistent, globally unique identifier of another <strong>calendar</strong> component.
This value would be represented in a <strong>calendar</strong> component by the <a href="#UID">UID</a> property.
</p>
<p>
The value type for RELATED-TO is TEXT.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::RELATED_TO<br>
- Kigkonsult\Icalcreator\Vcalendar::RELTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::PARENT<br>
- Kigkonsult\Icalcreator\Vcalendar::CHILD<br>
- Kigkonsult\Icalcreator\Vcalendar::SIBLING<br>
- available.
</p>
<h5>Create RELATED-TO</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createRelatedTo()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createRelatedTo();
</p>
<h5>Delete RELATED-TO</h5>
<p>Remove RELATED-TO from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteRelatedto()</p>
<p class="label">Example 1</p>
<p>Delete /single/first) RELATED-TO property</p>
<p class="example">
$vtodo-&gt;deleteRelatedto()
</p>
<p class="label">Example 2</p>
<p>Delete RELATED-TO property no 2.</p>
<p class="example">
$vjournal-&gt;deleteRelatedto( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all RELATED-TO properties.</p>
<p class="example">
while( $vjournal-&gt;deleteRelatedto()) {
continue;
}
</p>
<h5>Get ALL RELATED-TO</h5>
<p>Returns array : all RELATED-TO, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllRelatedto( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get RELATED-TO</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getRelatedto()</p>
<p class="comment">output = relid<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getRelatedto( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; relid<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getRelatedto(propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo RELATED-TO</p>
<p class="label">Example</p>
<p class="example">
$relatedId = $vtodo-&gt;getRelatedto();
</p>
<h5>is RELATED-TO set</h5>
<p>Return bool true if RELATED-TO is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isRelatedtoSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isRelatedtoSet();
</p>
<h5>Set RELATED-TO</h5>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setRelatedto( relid [, params [, propOrderNo ]] )</p>
<p class="comment">relid<sup>1</sup> = (string) Value type TEXT.
params<sup>2</sup> = (array) ( [ reltype ] *[, xparams] )
reltype = Vcalendar::RELTYPE =&gt;
Vcalendar::PARENT (Default)
/ Vcalendar::CHILD
/ Vcalendar::SIBLING
/ (string) iana-token
/ (string) x-name
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
</p>
<p class="label">Example</p>
<p class="example">
$vtodo-&gt;setRelatedto( &quot;19960401-080045-4000F192713@host.com&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="REPEAT"></a><h3>3.2.42 REPEAT</h3>
<p class="quotes">
This property defines the number of time the <a href="#VALARM">ALARM</a> should be repeated,
after the initial trigger.
If the <a href="#VALARM">ALARM</a> triggers more than once,
then this property MUST be specified along with the <a href="#DURATION">DURATION</a> property.
</p>
<p>The value type for REPEAT is INTEGER.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::REPEAT is available.
</p>
<h5>Create REPEAT</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createRepeat()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createRepeat();
</p>
<h5>Delete REPEAT</h5>
<p>Remove REPEAT from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteRepeat()</p>
<p class="label">Example</p>
<p class="example">
$valarm-&gt;deleteRepeat();
</p>
<h5>Get REPEAT</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getRepeat()</p>
<p class="comment">output = repeatTimes<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getRepeat( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; repeatTimes<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$repeat = $valarm-&gt;getRepeat();
</p>
<h5>is REPEAT set</h5>
<p>Return bool true if REPEAT is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isRepeatSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $valarm-&gt;isRepeatSet();
</p>
<h5>Set REPEAT</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true)
and if value is not an integer.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setRepeat( , repeatTimes [, xparams ] )</p>
<p class="comment">repeatTimes<sup>1</sup> = (int) Value type INTEGER
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$valarm-&gt;setRepeat( 2 );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="REQUEST-STATUS"></a><h3>3.2.43 REQUEST-STATUS</h3>
<p class="quotes">
This property defines the status code returned for a scheduling request and is OPTIONAL and
MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a>
and <a href="#VFREEBUSY">VFREEBUSY</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
REQUEST-STATUS may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for REQUEST-STATUS is TEXT and consists of</p>
<dl>
<dt>a short return status component,
<dd>(in output) a PERIOD character separated 3-tuple of integers, ex 3.11
<dt>a longer return status description component
<dt>optionally a statusspecific data component
</dl>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::REQUEST_STATUS<br>
- Kigkonsult\Icalcreator\Vcalendar::STATCODE<br>
- Kigkonsult\Icalcreator\Vcalendar::STATDESC<br>
- Kigkonsult\Icalcreator\Vcalendar::EXTDATA<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create REQUEST-STATUS</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createRequestStatus()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createRequestStatus();
</p>
<h5>Delete REQUEST-STATUS</h5>
<p>Remove REQUEST-STATUS from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteRequeststatus()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) REQUEST-STATUS property.</p>
<p class="example">
$vtodo-&gt;deleteRequeststatus();
</p>
<p class="label">Example 2</p>
<p>Delete REQUEST-STATUS property no 2.</p>
<p class="example">
$vjournal-&gt;deleteRequeststatus( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all REQUEST-STATUS properties.</p>
<p class="example">
while( $vjournal-&gt;deleteRequeststatus()) {
continue;
}
</p>
<h5>Get ALL REQUEST-STATUS</h5>
<p>Returns array : all REQUEST-STATUS, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllRequeststatus( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get REQUEST-STATUS</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getRequeststatus()</p>
<p class="comment">output = [
Vcalendar::STATCODE =&gt; statcode<sup>1</sup>,
Vcalendar::STATDESC =&gt; statdesc<sup>2</sup>,
Vcalendar::EXTDATA =&gt; extdata<sup>3</sup> // opt
]
</p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getRequeststatus( propOrderNo/null, true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output =
[
&quot;value&quot; =&gt;
[
Vcalendar::STATDESC =&gt; statcode<sup>1</sup>,
Vcalendar::STATDESC =&gt; errtext<sup>2</sup>,
Vcalendar::EXTDATA =&gt; extdata<sup>3</sup> // opt
),
&quot;params&quot; =&gt; params<sup>4</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getRequeststatus( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo REQUEST-STATUS</p>
<p class="label">Example</p>
<p class="example">
$requestStatus = $vtodo-&gt;getRequeststatus();
</p>
<h5>is REQUEST-STATUS set</h5>
<p>Return bool true if REQUEST-STATUS is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isRequeststatusSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isRequeststatusSet();
</p>
<h5>Set REQUEST-STATUS</h5>
<p>Set property value.</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setRequeststatus(
statcode<sup>1</sup>,
statdesc<sup>2</sup>
[,extdata<sup>3</sup>
[,params<sup>4</sup> [,propOrderNo]]]
)
</p>
<p class="comment">statcode<sup>1</sup> = Hierarchical, numeric return status code (1*DIGIT &quot;.&quot; 1*DIGIT 1*DIGIT)
statdesc<sup>2</sup> = (string) Textual status description
extdata<sup>3</sup> = (string) Textual exception data.
For example, the offending property name and value
or complete property line.
params<sup>4</sup> = (array) ( Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;] *xparams )
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$vfreebusy-&gt;setRequeststatus(
2.00,
&quot;Invalid property value&quot;,
&quot;DTSTART:96-Apr-31&quot;
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="RESOURCE-TYPE"></a><h3>3.2.44 RESOURCE-TYPE</h3>
<p class="quotes">RESOURCE-TYPE specifies the type of resource</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
RESOURCE-TYPE specifies the type of participant
and may occur once in <a href="#VRESOURCE">VRESOURCE</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is TEXT.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::RESOURCE<br>
- Kigkonsult\Icalcreator\Vcalendar::ROOM<br>
- Kigkonsult\Icalcreator\Vcalendar::PROJECTOR<br>
- Kigkonsult\Icalcreator\Vcalendar::REMOTE_CONFERENCE_AUDIO<br>
- Kigkonsult\Icalcreator\Vcalendar::REMOTE_CONFERENCE_VIDEOSPEAKER<br>
are available.
</p>
<p>For methods and formatting, explore the <a href="#CLASS">CLASS</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="RESOURCES"></a><h3>3.2.45 RESOURCES</h3>
<p class="quotes">
This property defines the equipment or resources anticipated for an activity specified by a
<strong>calendar</strong> entity and is OPTIONAL and MAY occur more than once in
<a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
RESOURCES may occur more than once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
<dd>
<br>
the <a href="#VCALENDAR">VCALENDAR</a> / <a href="#VEVENT">VEVENT</a> / <a href="#VTODO">VTODO</a> method
<i>vresourceNames2Resources()</i><br>
may be used to create new RESOURCES from
<a href="#VRESOURCE">VRESOURCE</a> (sub-)components
and the <a href="#NAME">NAME</a> property value
with X-parameters for <a href="#VRESOURCE">VRESOURCE</a> properties
<a href="#UID">UID</a> and <a href="#RESOURCE-TYPE">RESOURCE-TYPE</a>.<br>
Another option is to set RESOURCES and <a href="#VRESOURCE">VRESOURCE</a> in pairs.
</dd>
</dl>
<p>The value type for RESOURCES is TEXT.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) RESOURCES values.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::RESOURCES<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create RESOURCES</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createResources()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createResources();
</p>
<h5>Delete RESOURCES</h5>
<p>Remove RESOURCES from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteResources()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) RESOURCES property.</p>
<p class="example">
$vevent-&gt;deleteResources();
</p>
<p class="label">Example 2</p>
<p>Delete RESOURCES property no 2.</p>
<p class="example">
$vevent-&gt;deleteResources( 2 );
</p>
<p class="label">Example 3</p>
<p>Delete all RESOURCES properties.<p>
<p class="example">
while( $vevent-&gt;deleteResources()) {
continue;
}
</p>
<h5>Get ALL RESOURCES</h5>
<p>Returns array : all RESOURCES, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllResources( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get RESOURCES</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getResources()</p>
<p class="comment">output = resources<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getResources( propOrderNo/null, true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; resources<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getResources( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo RESOURCES</p>
<p class="label">Example</p>
<p class="example">
$resources = $vtodo-&gt;getResources();
</p>
<h5>is RESOURCES set</h5>
<p>Return bool true if RESOURCES is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isResourcesSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isResourcesSet();
</p>
<h5>Set RESOURCES</h5>
<p>Set property value.</p>
<p>
In spite of the fact that RESOURCES may contain a (comma separated) list of values,
a strong recommendation is to split a RESOURCES &quot;list&quot; into multiple single RESOURCES entries.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setResources( resources [, params [, propOrderNo ]] )</p>
<p class="comment">resources<sup>1</sup> = (string) textual resources or subtypes of the <strong>calendar</strong> component,
can be specified as a list of resources
separated by the COMMA character.
params<sup>2</sup> = (array) (
Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;,
Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;,
*xparams )
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setResources( &quot;COMPUTER PROJECTOR&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="RRULE"></a><h3>3.2.46 RRULE</h3>
<p class="quotes">
This property defines a rule or repeating pattern
for recurring <a href="#VEVENT">EVENTs</a>, <a href="#VTODO">TODOs</a>,
<a href="#VTIMEZONE">STANDARD</a> or <a href="#VTIMEZONE">DAYLIGHT</a> definitions
and is OPTIONAL and MAY occur more than once ([RFC2445]),
SHOULD NOT occur more than once ([RFC5545]). iCalcreator allows only one in component.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
RRULE may occur once in <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::RRULE<br>
- Kigkonsult\Icalcreator\Vcalendar::EXRULE<br>
- Kigkonsult\Icalcreator\Vcalendar::FREQ<br>
- Kigkonsult\Icalcreator\Vcalendar::UNTIL<br>
- Kigkonsult\Icalcreator\Vcalendar::COUNT<br>
- Kigkonsult\Icalcreator\Vcalendar::INTERVAL<br>
- Kigkonsult\Icalcreator\Vcalendar::BYSECOND<br>
- Kigkonsult\Icalcreator\Vcalendar::BYMINUTE<br>
- Kigkonsult\Icalcreator\Vcalendar::BYHOUR<br>
- Kigkonsult\Icalcreator\Vcalendar::BYDAY<br>
- Kigkonsult\Icalcreator\Vcalendar::BYMONTHDAY<br>
- Kigkonsult\Icalcreator\Vcalendar::BYYEARDAY<br>
- Kigkonsult\Icalcreator\Vcalendar::BYWEEKNO<br>
- Kigkonsult\Icalcreator\Vcalendar::BYMONTH<br>
- Kigkonsult\Icalcreator\Vcalendar::BYSETPOS<br>
- Kigkonsult\Icalcreator\Vcalendar::WKST<br>
- Kigkonsult\Icalcreator\Vcalendar::SECONDLY<br>
- Kigkonsult\Icalcreator\Vcalendar::MINUTELY<br>
- Kigkonsult\Icalcreator\Vcalendar::HOURLY<br>
- Kigkonsult\Icalcreator\Vcalendar::DAILY<br>
- Kigkonsult\Icalcreator\Vcalendar::WEEKLY<br>
- Kigkonsult\Icalcreator\Vcalendar::MONTHLY<br>
- Kigkonsult\Icalcreator\Vcalendar::YEARLY<br>
- Kigkonsult\Icalcreator\Vcalendar::DAY<br>
- Kigkonsult\Icalcreator\Vcalendar::SU<br>
- Kigkonsult\Icalcreator\Vcalendar::MO<br>
- Kigkonsult\Icalcreator\Vcalendar::TU<br>
- Kigkonsult\Icalcreator\Vcalendar::WE<br>
- Kigkonsult\Icalcreator\Vcalendar::TH<br>
- Kigkonsult\Icalcreator\Vcalendar::FR<br>
- Kigkonsult\Icalcreator\Vcalendar::SA<br>
are available.
</p>
<h5>Create RRULE</h5>
<p>If set, returns iCal formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createRrule()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createRrule();
</p>
<h5>Delete RRULE</h5>
<p>Remove RRULE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteRrule()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) RRULE property.</p>
<p class="example">
$vevent-&gt;deleteRrule();
</p>
<p class="label">Example 2</p>
<p>Delete RRULE property no 2.</p>
<p class="example">
$vevent-&gt;deleteRrule( 2 );
</p>
<p class="label">Example 3</p>
<p>Delete all RRULE properties.</p>
<p class="example">
while( $vevent-&gt;deleteRrule()) {
continue;
}
</p>
<h5>Get RRULE</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getRrule()</p>
<p class="comment">output = recur<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getRrule( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; recur<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$rrules = $vtodo-&gt;getRrule();
</p>
<h5>is RRULE set</h5>
<p>Return bool true if RRULE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isRruleSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isRruleSet();
</p>
<h5>Set RRULE</h5>
<p>
Set property single value, &quot;RECUR&quot;, multiple values not allowed.
</p>
<p class="quotes">
The &quot;RECUR&quot; property SHOULD NOT occur more than once in a component.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws
</p>
<ul>
<li>InvalidArgumentException on
<ul>
<li>empty value and config ALLOWEMPTY is set to false (default true)</li>
<li>basic recur rule errors (<a href="https://tools.ietf.org/html/rfc5545" title="RFC5545" target="_blank">RFC5545</a>)</li>
</ul>
</li>
</ul>
<ul>
<li>Exception on
<ul>
<li>DateTime error</li>
</ul>
</li>
</ul>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setRrule( recur [, xparams [, propOrderNo ]] )</p>
<p>
See rules in detail in <a href="https://tools.ietf.org/html/rfc5545" title="RFC5545" target="_blank">RFC5545</a>
&quot;Internet Calendaring and Scheduling Core Object Specification (iCalendar)&quot;.
</p>
<p class="comment">recur<sup>1</sup> = (array) (
Vcalendar::FREQ =&gt; freq,
// <span class="comment">either UNTIL or COUNT may appear in a &quot;recur&quot;,
but UNTIL and COUNT MUST NOT occur in the same &quot;recur&quot;</span>
Vcalendar::UNTIL &quot;=&gt;&quot; >enddate,
Vcalendar::COUNT &quot;=&gt;&quot; 1*DIGIT,
// <span class="comment">the rest of these keywords are optional,
but MUST NOT occur more than once</span>
Vcalendar::INTERVAL &quot;=&gt;&quot; 1*DIGIT,
Vcalendar::BYSECOND &quot;=&gt;&quot; byseclist,
Vcalendar::BYMINUTE &quot;=&gt;&quot; byminlist,
Vcalendar::BYHOUR &quot;=&gt;&quot; byhrlist,
Vcalendar::BYDAY &quot;=&gt;&quot; bywdaylist,
Vcalendar::BYMONTHDAY &quot;=&gt;&quot; bymodaylist,
Vcalendar::BYYEARDAY &quot;=&gt;&quot; byyrdaylist,
Vcalendar::BYWEEKNO &quot;=&gt;&quot; bywknolist,
Vcalendar::BYMONTH &quot;=&gt;&quot; bymolist,
Vcalendar::BYSETPOS &quot;=&gt;&quot; bysplist,
Vcalendar::WKST &quot;=&gt;&quot; weekday ]
x-name &quot;=&gt;&quot; (string) text ]
)
freq =
Vcalendar::SECONDLY&quot; /
Vcalendar::MINUTELY /
Vcalendar::HOURLY /
Vcalendar::DAILY /
Vcalendar::WEEKLY /
Vcalendar::MONTHLY /
Vcalendar::YEARLY
enddate = date // <span class="comment">a DATE value or a <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME value</span>
date = (object) DateTimeInterface instance, will be set to UTC if not UTC timezone
date = (string) date/datetime string<sup>*</sup>
byseclist = seconds
byseclist = (array) (seconds *(, seconds ))
seconds = 1DIGIT / 2DIGIT ;0 to 59
byminlist = minutes
byminlist = (array) ( minutes *(, minutes ))
minutes = 1DIGIT / 2DIGIT ;0 to 59
byhrlist = hour
byhrlist = (array) ( hour *(, hour ))
hour = 1DIGIT / 2DIGIT ;0 to 23
bywdaylist = weekdaynum
bywdaylist = (array) ( weekdaynum *("," weekdaynum ))
weekdaynum = (array) ( [([plus] ordwk / minus ordwk)], &quot;DAY&quot; =&gt; weekday )
plus = &quot;+&quot;
minus = &quot;-&quot;
ordwk = 1DIGIT / 2DIGIT ;1 to 53
// Vcalander::SU etc available
weekday = &quot;SU&quot; / &quot;MO&quot; / &quot;TU&quot; / &quot;WE&quot; / &quot;TH&quot; / &quot;FR&quot; / &quot;SA&quot;
; Corresponding to
; SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
; FRIDAY and SATURDAY days of the week.
bymodaylist = monthdaynum
bymodaylist = (array) ( monthdaynum *(, monthdaynum ))
monthdaynum = ( [plus] ordmoday ) / ( minus ordmoday )
ordmoday = 1DIGIT / 2DIGIT ;1 to 31
byyrdaylist = yeardaynum
byyrdaylist = (array) ( yeardaynum *(, yeardaynum ))
yeardaynum = ( [plus] ordyrday ) / ( minus ordyrday )
ordyrday = 1DIGIT / 2DIGIT / 3DIGIT ;1 to 366
bywknolist = weeknum
bywknolist = (array) ( weeknum *(, weeknum ))
weeknum = ( [plus] ordwk ) / ( minus ordwk )
bymolist = monthnum
bymolist = (array) ( monthnum *(, monthnum ))
monthnum = 1DIGIT / 2DIGIT ;1 to 12
bysplist = setposday
bysplist = (array) ( setposday *(, setposday ))
setposday = yeardaynum
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
<br>
<sup>*</sup> please notice <a href="#date_restraints">date restraints</a>.
</p>
<p class="label">Example</p>
<p class="example">
try {
$vevent-&gt;setRrule( [
Vcalendar::FREQ =&gt; Vcalendar::MONTHLY,
Vcalendar::UNTIL =&gt; new DateTime( &quot;20060831&quot; ),
// DATE, if DATE-TIME, UTC timezone
Vcalendar::INTERVAL =&gt; 2,
Vcalendar::WKST =&gt; Vcalendar::SU,
Vcalendar::BYSECOND =&gt; 2,
Vcalendar::BYMINUTE =&gt; [ 2, -4, 6 ], // (*)
Vcalendar::BYHOUR =&gt; [ 2, 4, -6 ], // (*)
Vcalendar::BYMONTHDAY =&gt; -2, // (*)
Vcalendar::BYYEARDAY =&gt; 2, // (*)
Vcalendar::BYWEEKNO =&gt; [ 2, -4, 6 ], // (*)
Vcalendar::BYMONTH =&gt; 2, // (*)
Vcalendar::BYSETPOS =&gt; [ 2, -4, 6 [, // (*)
Vcalendar::BYDAY =&gt; [ //
[ -1, Vcalendar::DAY =&gt; Vcalendar::WE ], // last WE
[ 3, Vcalendar::DAY =&gt; Vcalendar::TH ], // third TH
[ 5, Vcalendar::DAY =&gt; Vcalendar::FR ], // fifth FR
[ Vcalendar::DAY =&gt; Vcalendar::MO ] // every MO
],
[ &quot;x-key&quot; =&gt; &quot;xparamValue&quot; ]
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
$vtodo-&gt;setRrule(
[
Vcalendar::FREQ =&gt; Vcalendar::WEEKLY,
Vcalendar::COUNT =&gt; 2,
Vcalendar::INTERVAL =&gt; 2,
Vcalendar::WKST =&gt; Vcalendar::SU,
Vcalendar::BYSECOND =&gt; [ -2, 4, 6 ], // (*)
Vcalendar::BYMINUTE =&gt; -2, // (*)
Vcalendar::BYHOUR =&gt; 2, // (*)
Vcalendar::BYMONTHDAY =&gt; [ 2, -4, 6 ], // (*)
Vcalendar::BYYEARDAY =&gt; [ -2, 4, 6 ], // (*)
Vcalendar::BYWEEKNO =&gt; -2, // (*)
Vcalendar::BYMONTH =&gt; [ 2, 4, -6 ], // (*)
Vcalendar::BYSETPOS =&gt; -2, // (*)
// Vcalendar::BYday =&gt; Vcalendar::WE // one day
// Vcalendar::BYday =&gt; [ Vcalendar::WE, Vcalendar::TH ], // days
Vcalendar::BYday =&gt; [ 5, Vcalendar::DAY =&gt; Vcalendar::WE ], // pos. day
],
[ &quot;x-key&quot; =&gt; &quot;xparamValue&quot; ]
);
// <span class="comment">(*) single value/array of values</span>
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="SEQUENCE"></a><h3>3.2.47 SEQUENCE</h3>
<p class="quotes">
This property defines the revision sequence number of the <strong>calendar</strong> component
within a sequence of revisions.
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
SEQUENCE may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
SEQUENCE may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p class="quotes">
It is monotonically incremented by the <a href="#ORGANIZER">ORGANIZER's</a> CUA (Calendar
User Agent) each time the <a href="#ORGANIZER">ORGANIZER</a> makes a significant revision
to the <strong>calendar</strong> component.
<br><br>
When the <a href="#ORGANIZER">ORGANIZER</a> makes changes to one of the following
properties, the sequence number MUST be incremented: <a href="#DTSTART">DTSTART</a>,
<a href="#DTEND">DTEND</a>, <a href="#DUE">DUE</a>, <a href="#RDATE">RDATE</a>, <a href="#RRULE">RRULE</a>,
<a href="#EXDATE">EXDATE</a>, <a href="#EXRULE">EXRULE</a>, <a href="#STATUS">STATUS</a>. In addition,
changes made by the <a href="#ORGANIZER">ORGANIZER</a> to other properties can also force
the sequence number to be incremented. The <a href="#ORGANIZER">ORGANIZER</a> CUA MUST
increment the sequence number when ever it makes changes to
properties in the <strong>calendar</strong> component that the <a href="#ORGANIZER">ORGANIZER</a>
deems will jeopardize the validity of the participation status of the
<a href="#ATTENDEE">Attendees</a>. For example, changing the location
of a meeting from one locale to another distant locale could
effectively impact the participation status of the <a href="#ATTENDEE">Attendees</a>.
</p>
<p>The value type of SEQUENCE is INTEGER.</p>
<p>The calendar method <a href="#sort2">SORT</a> with argument <a href="#UID">UID</a> also use <a href="#RECURRENCE-ID">RECURRENCE-ID</a> / SEQUENCE as
sort parameters.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::SEQUENCE is available.
</p>
<h5>Create SEQUENCE</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createSequence()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createSequence();
</p>
<h5>Delete SEQUENCE</h5>
<p>Remove SEQUENCE from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteSequence()</p>
<p class="label">Example</p>
<p class="example">
$vtodo-&gt;deleteSequence();
</p>
<h5>Get SEQUENCE</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getSequence()</p>
<p class="comment">output = sequence<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getSequence( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; sequence<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$sequence = $vtodo-&gt;getSequence();
</p>
<h5>is SEQUENCE set</h5>
<p>Return bool true if SEQUENCE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isSequenceSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isSequenceSet();
</p>
<h5>Set SEQUENCE</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true)
and if value is not an integer.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setSequence( [, sequence [, xparams ]] )</p>
<p class="comment">sequence<sup>1</sup> = (int) Value type INTEGER
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example 1</p>
<p class="example">
$vevent-&gt;setSequence( 2 ); <span class="comment">// set sequence number to 2</span>
</p>
<p class="label">Example 2</p>
<p class="example">
$vevent-&gt;setSequence();
<span class="comment">// force sequence number to be set to 0
// or, if sequence exists, incremented by 1</span>
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="SOURCE"></a><h3>3.2.48 SOURCE</h3>
<p class="quotes">SOURCE identifies a URI where calendar data can be refreshed from</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
SOURCE may occur once in <a href="#VCALENDAR">VCALENDAR</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is URI.
</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::SOURCE is available.
</p>
<h5>Create SOURCE</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::createSource()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createSource();
</p>
<h5>Delete SOURCE</h5>
<p>Remove URL from Vcalendar.</p>
<p class="label">Format</p>
<p class="format">Vcalendar::deleteSource()</p>
<p class="label">Example</p>
<p class="example">
$calendar-&gt;deleteSource();
</p>
<h5>Get SOURCE</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">Vcalendar::getSource()</p>
<p class="comment">output = url<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">Vcalendar::getSource( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; source<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$url = $calendar-&gt;getSource();
</p>
<h5>is SOURCE set</h5>
<p>Return bool true if SOURCE is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isSourceSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vcalendar-&gt;isSourceSet();
</p>
<h5>Set SOURCE</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
InvalidArgumentException on url error.
</p>
<p class="label">Format</p>
<p class="format">Vcalendar::setSource( source [, xparams ] )</p>
<p class="comment">source<sup>1</sup> = (string) Value type URI
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
try {
$calendar-&gt;setSource( &quot;https://www.icaldomain.net&amp;q=1&quot; );
}
catch( InvalidArgumentException $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="STATUS"></a><h3>3.2.49 STATUS</h3>
<p class="quotes">
This property defines the overall status or confirmation for the <strong>calendar</strong> component.
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>
and <a href="#VJOURNAL">VJOURNAL</a> components.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
STATUS may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) STATUS values.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::STATUS<br>
- Kigkonsult\Icalcreator\Vcalendar::COMPLETED<br>
- Kigkonsult\Icalcreator\Vcalendar::CANCELLED<br>
- Kigkonsult\Icalcreator\Vcalendar::CONFIRMED<br>
- Kigkonsult\Icalcreator\Vcalendar::DRAFT<br>
- Kigkonsult\Icalcreator\Vcalendar::F_NAL // note FINAL<br>
- Kigkonsult\Icalcreator\Vcalendar::IN_PROCESS<br>
- Kigkonsult\Icalcreator\Vcalendar::NEEDS_ACTION<br>
- Kigkonsult\Icalcreator\Vcalendar::TENTATIVE<br>
are available.
</p>
<h5>Create STATUS</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createStatus()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createStatus();
</p>
<h5>Delete STATUS</h5>
<p>Remove STATUS from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteStatus()</p>
<p class="label">Example</p>
<p class="example">
$vtodo-&gt;deleteStatus();
</p>
<h5>Get STATUS</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getStatus()</p>
<p class="comment">output = status<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getStatus( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; status<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$status = $vtodo-&gt;getStatus();
</p>
<h5>is STATUS set</h5>
<p>Return bool true if STATUS is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isStatusSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isStatusSet();
</p>
<h5>Set STATUS</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on<br>
- empty value and config ALLOWEMPTY is set to false (default true),<br>
- invalid value (below).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setStatus( status [, xparams ] )</p>
<p class="comment"> // <span class="comment">Status values for a <a href="#VEVENT">VEVENT</a></span>
status<sup>1</sup> = Vcalendar::TENTATIVE // <span class="comment">Indicates event is tentative</span>
/ Vcalendar::CONFIRMED // <span class="comment">Indicates event is definite</span>
/ Vcalendar::CANCELLED // <span class="comment">Indicates event was cancelled</span>
// <span class="comment">Status values for <a href="#VTODO">VTODO</a></span>
status<sup>1</sup> = Vcalendar::NEEDS_ACTION // <span class="comment">Indicates to-do needs action</span>
/ Vcalendar::COMPLETED // <span class="comment">Indicates to-do completed</span>
/ Vcalendar::IN_PROCESS // <span class="comment">Indicates to-do in process of</span>
/ Vcalendar::CANCELLED // <span class="comment">Indicates to-do was cancelled</span>
// <span class="commsnt">Status values for <a href="#VJOURNAL">VJOURNAL</a></span>
status<sup>1</sup> = Vcalendar::DRAFT // <span class="comment">Indicates journal is draft</span>
/ Vcalendar::F_NAL; // <span class="comment">Indicates journal is final</span>
/ Vcalendar::CANCELLED // <span class="comment">Indicates journal is removed</span>
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setStatus( &quot;COMPLETED&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="STRUCTURED-DATA"></a><h3>3.2.50 STRUCTURED-DATA</h3>
<p class="quotes">
STRUCTURED-DATA specifies ancillary data associated with the calendar component
</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
STRUCTURED-DATA is OPTIONAL and MAY occur more than once in
<a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>,
<a href="#PARTICIPANT">PARTICIPANT</a>,
<a href="#VLOCATION">VLOCATION</a> and
<a href="#VRESOURCE">VRESOURCE</a><br>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is TEXT, BINARY, or URI.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::STRUCTURED_DATA<br>
- Kigkonsult\Icalcreator\Vcalendar::BASE64<br>
- Kigkonsult\Icalcreator\Vcalendar::BINARY<br>
- Kigkonsult\Icalcreator\Vcalendar::ENCODING<br>
- Kigkonsult\Icalcreator\Vcalendar::FMTTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::TEXT<br>
- Kigkonsult\Icalcreator\Vcalendar::URI<br>
are available.
</p>
<h5>Create STRUCTURED-DATA</h5>
<p>If set, returns [RFC9073] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createStructureddata()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createStructureddata();
</p>
<h5>Delete STRUCTURED-DATA</h5>
<p>Remove STRUCTURED-DATA from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteStructureddata()</p>
<p class="label">Example 1</p>
<p class="example">
$vevent-&gt;deleteStructureddata();
</p>
<p class="label">Example 2</p>
Delete STRUCTURED-DATA property no 2.
<p class="example">
$vevent-&gt;deleteStructureddata( 2 );
</p>
<p class="label">Example 3</p>
Deleting all STRUCTURED-DATA properties.
<p class="example">
while( $vevent-&gt;deleteStructureddata()) {
continue;
}
</p>
<h5>Get ALL STRUCTURED-DATA</h5>
<p>Returns array : all STRUCTURED-DATA, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllStructureddata( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get STRUCTURED-DATA</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getStructureddata()</p>
<p class="comment">output = structureddataValue</p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getStructureddata( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value,
<p class="comment">output = [
&quot;value&quot; =&gt; structureddataValue,
&quot;params&quot; =&gt; params
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getStructureddata( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo ATTACH</p>
<p class="label">Example</p>
<p class="example">
$structureddata = $vevent-&gt;getStructureddata();
</p>
<h5>is STRUCTURED-DATA set</h5>
<p>Return bool true if STRUCTURED-DATA is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isStructureddataSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isStructureddataSet();
</p>
<h5>Set STRUCTURED-DATA</h5>
<p>
Set property value.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setStructureddata( structureddataValue [, params [, propOrderNo ]] )</p>
<p class="comment">structureddataValue = (string) TEXT/ URI / inline BINARY encoded content
params = [ &quot;VALUE&quot; =&gt; &quot;TEXT&quot; ] /
[ &quot;VALUE&quot; =&gt; &quot;BINARY&quot;, &quot;ENCODING&quot; =&gt; &quot;BASE64&quot; ] /
[ &quot;VALUE&quot; =&gt; &quot;URI&quot; ]
[, &quot;FMTTYPE&quot; =&gt; contentType ] // <span class="comment">opt. for URI, req. otherwise</span>
[, &quot;SCHEMAE&quot; =&gt; schema ] // <span class="comment">opt. for URI, req. otherwise</span>
*[,&nbsp;xparams ] )
contentType = (string) The parameter value MUST be the TEXT for either an IANA
registered content type or a non-standard content type.
schema = &quot;uri&quot;
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setStructureddata(
&quot;https://dir.example.com/vcard/aviolinist.vcf&quot;,
[ Vcalendar::VALUE =&gt; Vcalendar::URI ]
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="STYLED-DESCRIPTION"></a><h3>3.2.51 STYLED-DESCRIPTION</h3>
<p class="quotes">
STYLED-DESCRIPTION provides for one or more rich-text
descriptions to replace that provided by the "DESCRIPTION"
property.
</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
STYLED-DESCRIPTION is OPTIONAL and MAY occur more than once in
<a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>,
<a href="#VJOURNAL">VJOURNAL</a>,
<a href="#VFREEBUSY">VFREEBUSY</a>,
<a href="#PARTICIPANT">PARTICIPANT</a> and
<a href="#VALARM">VALARM</a><br>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type can be set to TEXT or URI but no default.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::STYLED_DESCRIPTION<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::DERIVED<br>
- Kigkonsult\Icalcreator\Vcalendar::FMTTYPE<br>
- Kigkonsult\Icalcreator\Vcalendar::LANG<br>
- Kigkonsult\Icalcreator\Vcalendar::TEXT<br>
- Kigkonsult\Icalcreator\Vcalendar::URI<br>
are available.
</p>
<h5>Create STYLED-DESCRIPTION</h5>
<p>If set, returns [RFC9073] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createStyleddescription()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createStyleddescription();
</p>
<h5>Delete STYLED-DESCRIPTION</h5>
<p>Remove STYLED-DESCRIPTION from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteStyleddescription()</p>
<p class="label">Example 1</p>
<p class="example">
$vevent-&gt;deleteStyleddescription();
</p>
<p class="label">Example 2</p>
Delete STYLED-DESCRIPTION property no 2.
<p class="example">
$vevent-&gt;deleteStyleddescription( 2 );
</p>
<p class="label">Example 3</p>
Deleting all STYLED-DESCRIPTION properties.
<p class="example">
while( $vevent-&gt;deleteStyleddescription()) {
continue;
}
</p>
<h5>Get ALL STYLED-DESCRIPTION</h5>
<p>Returns array : all STYLED-DESCRIPTION, value/params OR only values</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::getAllStyleddescription( [ valueOnly ] )</p>
<p class="comment">valueOnly = (bool) default false, value/params OR only values (true)
</p>
<h5>Get STYLED-DESCRIPTION</h5>
<p>If set, returns property value(-s), otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getStyleddescription()</p>
<p class="comment">output = styleddescriptionValue</p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getStyleddescription( propOrderNo/null , true )</p>
<p class="comment">propOrderNo = (int) specific property value,
<p class="comment">output = [
&quot;value&quot; =&gt; styleddescriptionValue,
&quot;params&quot; =&gt; params
]
</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getStyleddescription( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo ATTACH</p>
<p class="label">Example</p>
<p class="example">
$structureddata = $vevent-&gt;getStyleddescription();
</p>
<h5>is STYLED-DESCRIPTION set</h5>
<p>Return bool true if STYLED-DESCRIPTION is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isStyleddescriptionSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isStyleddescriptionSet();
</p>
<h5>Set STYLED-DESCRIPTION</h5>
<p>
Set property value.
</p>
<p>
The method returns the class instance (static).
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setStyleddescription( tyleddescriptionValue [, params [, propOrderNo ]] )</p>
<p class="comment">styleddescriptionValue = (string) TEXT/ URI / inline BINARY encoded content
params = [ &quot;VALUE&quot; =&gt; &quot;TEXT&quot; ] /
[ &quot;VALUE&quot; =&gt; &quot;URI&quot; ]
[, &quot;ALTREP&quot; =&gt; altrep ] // <span class="comment">optional</span>
[, &quot;LANG&quot; =&gt; lang ] // <span class="comment">optional</span>
[, &quot;FMTTYPE&quot; =&gt; contentType ] // <span class="comment">optional</span>
[, &quot;DERIVED&quot; =&gt; derived ] // <span class="comment">optional</span>
*[,&nbsp;xparams ] )
altrep = (string) an alternate text representation, URI
lang = (string) as defined in [RFC5546]
contentType = (string) The parameter value MUST be the TEXT for either an IANA
registered content type or a non-standard content type.
derived = &quot;true&quot; / &quot;false&quot; default is false
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
</p>
<p class="label">Examples</p>
<p class="example">
$vevent-&gt;setStyleddescription(
&quot;&lt;html&gt;...&lt;/html&gt;&quot;,
[ Vcalendar::FMTTYPE =&gt; &quot;text/html;&quot; ]
);
</p>
<p class="example">
$vevent-&gt;setStyleddescription(
&quot;https://example.org/desc001.html&quot;,
[ Vcalendar::VALUE =&gt; Vcalendar::URI ]
);
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="SUMMARY"></a><h3>3.2.52 SUMMARY</h3>
<p class="quotes">
This property defines a short (&quot;one line&quot;) summary or subject for the <strong>calendar</strong> component.
(In &quot;[RFC5545], Recommended Practices&quot;, up to 255 characters) (, analogous to a mail SUBJECT).
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>
and <a href="#VJOURNAL">VJOURNAL</a> components.
The property is REQUIRED and MUST occur once in <a href="#VALARM">VALARM</a> (EMAIL) <strong>calendar</strong> component.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
SUMMARY may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
SUMMARY may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for SUMMARY is TEXT.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) SUMMARY values.</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::SUMMARY<br>
- Kigkonsult\Icalcreator\Vcalendar::ALTREP<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create SUMMARY</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createSummary()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createSummary();
</p>
<h5>Delete SUMMARY</h5>
<p>Remove SUMMARY from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteSummary()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteSummar();
</p>
<h5>Get SUMMARY</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getSummary()</p>
<p class="comment">output = summary<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getSummary( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; summary<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$summary = $vtodo-&gt;getSummary();
</p>
<h5>is SUMMARY set</h5>
<p>Return bool true if SUMMARY is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isSummarySet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isSummarySet();
</p>
<h5>Set SUMMARY</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>Parameters will be ordered as prescribed in [RFC5545].</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setSummary( summary [, params ] )</p>
<p CLASS="comment">summary<sup>1</sup> = (string) Value type TEXT,
a short, one line summary about the activity or journal entry.
params<sup>2</sup> = array( Vcalendar::ALTREP =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;,
Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;,
*xparams
)
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setSummary( &quot;This is a summary&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TRANSP"></a><h3>3.2.53 TRANSP</h3>
<p class="quotes">
This property defines whether an <a href="#VEVENT">EVENT</a> is transparent or not to busy time searches and is OPTIONAL and MUST NOT occur more than once.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::TRANSP<br>
- Kigkonsult\Icalcreator\Vcalendar::OPAQUE<br>
- Kigkonsult\Icalcreator\Vcalendar::TRANSPARENT<br>
are available.
</p>
<h5>Create TRANSP</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createTransp()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createTransp();
</p>
<h5>Delete TRANSP</h5>
<p>Remove TRANSP from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteTransp()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteTransp();
</p>
<h5>Get TRANSP</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getTransp( )</p>
<p class="comment">output = transp<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getTransp( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; transp<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$transp = $vtodo-&gt;getTransp();
</p>
<h5>is TRANSP set</h5>
<p>Return bool true if TRANSP is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isTranspSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isTranspSet();
</p>
<h5>Set TRANSP</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setTransp( transp [, xparams ] )</p>
<p class="comment">transp<sup>1</sup> = Vcalendar::OPAQUE / Vcalendar::TRANSPARENT
xparams<sup>2</sup> = (array) *( (string) key =&gt; (string) value ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setTransp( &quot;TRANSPARENT&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TRIGGER"></a><h3>3.2.54 TRIGGER</h3>
<p class="quotes">
This property specifies when an <a href="#VALARM">ALARM</a> will trigger and is REQUIRED and MUST NOT occur more than once.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc9074" title="Download rfc9074" target="_blank">rfc9074</a>
&quot;VALARM Extensions for iCalendar&quot;
</dt>
<dd>
Typically, when a <a href="#PROXIMITY">PROXIMITY</a> property is used, there is no need to
specify a time-based trigger using the <a href="#TRIGGER">TRIGGER</a> property. However,
since <a href="#TRIGGER">TRIGGER</a> is defined as a required property for a <a href="#VALARM">VALARM</a>
component, for backwards compatibility, it has to be present but
ignored. To indicate a <a href="#TRIGGER">TRIGGER</a> that is to be ignored, clients
SHOULD use a value a long time in the past. A value of
"19760401T005545Z" has been commonly used for this purpose.
</dd>
</dl>
<p>
The default value type is DURATION. The value type can be set to a DATE-TIME value type,
in which case the value MUST specify an <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME value.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::TRIGGER<br>
- Kigkonsult\Icalcreator\Vcalendar::VALUE<br>
- Kigkonsult\Icalcreator\Vcalendar::DURATION<br>
- Kigkonsult\Icalcreator\Vcalendar::DATE_TIME<br>
- Kigkonsult\Icalcreator\Vcalendar::RELATED<br>
- Kigkonsult\Icalcreator\Vcalendar::START<br>
- Kigkonsult\Icalcreator\Vcalendar::END<br>
are available.
</p>
<h5>Create TRIGGER</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">valarm::createTrigger()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createTrigger();
</p>
<h5>Delete TRIGGER</h5>
<p>Remove TRIGGER from component.</p>
<p class="label">Format</p>
<p class="format">valarm::deleteTrigger()</p>
<p class="label">Example</p>
<p class="example">
$valarm-&gt;deleteTrigger();
</p>
<h5>Get TRIGGER</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">valarm::getTrigger()</p>
<p class="comment">output = duration<sup>1</sup>/date<sup>3</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">valarm::getTrigger( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; duration<sup>1</sup>/date<sup>3</sup> ),
&quot;params&quot; =&gt; params<sup>4</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$trigger = $valarm-&gt;getTrigger();
</p>
<h5>is TRIGGER set</h5>
<p>Return bool true if TRIGGER is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isTriggerSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $valarm-&gt;isTriggerSet();
</p>
<h5>Set TRIGGER</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true)
and on DateTime/DateInterval error.
</p>
<p class="label">Format 1</p>
<p class="format">valarm::setTrigger( duration<sup>1</sup> [, params<sup>4</sup> ] )</p>
<p class="label">Format 2</p>
<p class="format">valarm::setTrigger( duration<sup>2</sup> [, params<sup>4</sup> ] )</p>
<p class="label">Format 3</p>
<p class="format">valarm::setTrigger( date<sup>3</sup> [, params<sup>4</sup> ] )</p>
<p class="comment">
duration<sup>1</sup> = (object) DateInterval class instance
duration<sup>1</sup> = (string) dur-value = ([&quot;+&quot;]/&quot;-&quot;)&quot;P&quot;(dur-date/dur-time/dur-week) like &quot;P1DT2H3M4S&quot;
dur-date = dur-day [dur-time]
dur-time = &quot;T&quot; (dur-hour / dur-minute / dur-second)
dur-week = 1*DIGIT &quot;W&quot;
dur-day = 1*DIGIT &quot;D&quot;
dur-hour = 1*DIGIT &quot;H&quot; [dur-minute]
dur-minute = 1*DIGIT &quot;M&quot; [dur-second]
dur-second = 1*DIGIT &quot;S&quot;
date<sup>3</sup> = (object) DateTimeInterface instance, will be set to UTC if not UTC timezone
date<sup>3</sup> = (string) datetime string<sup>*</sup>
params<sup>4</sup> = (array) ( [[ reltype [, trigRelparam ]] / datetimeparam ] *[, xparams ] )
reltyp = Vcalendar::RELATED =&gt; Vcalendar::START / Vcalendar::END
// default Vcalendar::START
trigRelparam = Vcalendar::VALUE =&gt; Vcalendar::DURATION // default Vcalendar::DURATION
datetimeparam = Vcalendar::VALUE =&gt; Vcalendar::DATE_TIME // <span class="comment">mandatory if DATE-TIME</span>
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
<br>
<sup>*</sup> please notice <a href="#date_restraints">date restraints</a>.
</p>
<p class="label">Example 1</p>
<p>A fix date duration</p>
<p class="example">
try {
$valarm-&gt;setTrigger( new DateTime( '2007-06-05 02:02:03 UTC' ));
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 2</p>
<p>A duration, 1 hour 2 min 3 sec, before start (before default)</p>
<p class="example">
try {
$dateInterval = new DateInterval( &quot;PT1H2M3S&quot; );
$dateInterval->invert = 1;
$valarm-&gt;setTrigger( $dateInterval );
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 3</p>
<p>A duration, 1 week after end.</p>
<p class="example">
try {
$valarm-&gt;setTrigger(
&quot;P1W&quot;,
[ Vcalendar::RELATED =&gt; Vcalendar::END ]
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 4</p>
<p>A duration, 1 hour 2 min 3 sec, before start (before default)</p>
<p class="example">
try {
$valarm-&gt;setTrigger( &quot;-PT1H2M3S&quot; );
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 5</p>
<p>A duration, 1 hour 2 min 3 sec, before start (before default).<br>Subject for removal in future versions.</p>
<p class="example">
try {
$valarm-&gt;setTrigger(
null, null, null, null, 1, 2, 3
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 6</p>
<p>A duration, 1 hour 2 min 3 sec, before start (before default).<br>Subject for removal in future versions.</p>
<p class="example">
try {
$valarm-&gt;setTrigger(
[ &quot;hour&quot;=&gt; 1, &quot;min&quot;=&gt; 2, &quot;sec&quot;=&gt; 3 ]
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<p class="label">Example 7</p>
<p>A duration, 1 week before start (before default).<br>Subject for removal in future versions.</p>
<p class="example">
try {
$valarm-&gt;setTrigger(
null, null, null, 1
);
}
catch( Exception $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TZID"></a><h3>3.2.55 TZID</h3>
<p class="quotes">
This property specifies the text value that uniquely identifies the <a href="#VTIMEZONE">VTIMEZONE</a>
<strong>calendar</strong> component and is REQUIRED, but MUST NOT occur more than once.
</p>
<p>The value type for TZID is TEXT.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::TZID is available.
</p>
<h5>Create TZID</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">vtimezone::createTzid()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createTzid();
</p>
<h5>Delete TZID</h5>
<p>Remove TZID from component.</p>
<p class="label">Format</p>
<p class="format">vtimezone::deleteTzid()</p>
<p class="label">Example</p>
<p class="example">
$vtimezone-&gt;deleteTzid();
</p>
<h5>Get TZID</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">vtimezone::getTzid()</p>
<p class="comment">output = tzid<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">vtimezone::getTzid( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; tzid<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$tzid = $vtimezone-&gt;getTzid();
</p>
<h5>is TZID set</h5>
<p>Return bool true if TZID is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isTzidSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vtimezone-&gt;isTzidSet();
</p>
<h5>Set TZID</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">vtimezone::setTzid( tzid [, xparams ] )</p>
<p class="comment">tzid<sup>1</sup> = (string) Value type TEXT
xparams<sup>2</sup> = (array)( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = $vcalendar-&gt;newVtimezone()
-&gt;setTzid( &quot;US-Eastern&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TZID-ALIAS-OF"></a><h3>3.2.56 TZID-ALIAS-OF</h3>
<p class="quotes">
This property specifies a time zone identifier for which the main time zone identifier is an alias.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7808" title="Download rfc7808" target="_blank">rfc7808</a>
&quot;Time Zone Data Distribution Service&quot;
</dt>
<dd>
TZID-ALIAS-OF may occur zero or more times in <a href="#VTIMEZONE">VTIMEZONE</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for TZID-ALIAS-OF is TEXT.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::TZID-ALIAS-OF is available.
</p>
<p>For methods and formatting, explore the <a href="#TZID">TZID</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TZNAME"></a><h3>3.2.57 TZNAME</h3>
<p class="quotes">
This property specifies the customary designation for a <a href="#VTIMEZONE">STANDARD</a> or <a href="#VTIMEZONE">DAYLIGHT</a> description
and is OPTIONAL and MAY occur more than once.
</p>
<p>The value type for TZNAME is TEXT.</p>
<p>
To ease up usage, constants <br>
- Kigkonsult\Icalcreator\Vcalendar::TZNAME<br>
- Kigkonsult\Icalcreator\Vcalendar::LANGUAGE<br>
are available.
</p>
<h5>Create TZNAME</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">vtimezone::createTzname()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createTzname();
</p>
<h5>Delete TZNAME</h5>
<p>Remove TZNAME from component.</p>
<p class="label">Format</p>
<p class="format">vtimezone::deleteTzname()</p>
<p class="label">Example 1</p>
<p>Delete (single/first) TZNAME property.</p>
<p class="example">
$vtimezonestd-&gt;deleteTzname();
</p>
<p class="label">Example 2</p>
<p>Delete TZNAME property no 2.</p>
<p class="example">
$vtimezonestd-&gt;deleteTzname( 2 );
</p>
<p class="label">Example 3</p>
<p>Deleting all TZNAME properties.</p>
<p class="example">
while( $vtimezonestd-&gt;deleteTzname()) {
continue;
}
</p>
<h5>Get TZNAME</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">vtimezone::getTzname()</p>
<p class="comment">output = tzname<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">vtimezone::getTzname( propOrderNo/null, true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
&quot;value&quot; =&gt; tzname<sup>1</sup>,
&quot;params&quot; =&gt; params<sup>2</sup>
]
</p>
<p class="label">Format 3</p>
<p class="format">vtimezone::getTzname( propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo TZNAME</p>
<p class="label">Example</p>
<p class="example">
$tzname = $timezonestandard-&gt;getTzname();
</p>
<h5>is TZNAME set</h5>
<p>Return bool true if TZNAME is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isTznameSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $daylight-&gt;isTznameSet();
</p>
<h5>Set TZNAME</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true)
or invalid offset value;.
</p>
<p class="label">Format</p>
<p class="format">vtimezone::setTzname( tzname [, params [, propOrderNo ]] )</p>
<p class="comment">tzname<sup>1</sup> = (string) Value type TEXT
params<sup>2</sup> = (array) ( Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;, *xparams )
xparams = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
propOrderNo = (int) order number // <span class="comment">1=1st, 2=2nd etc</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = $vcalendar-&gt;newVtimezone()
-&gt;setTzid( &quot;AKST&quot; );
$standard = $vtimezone-&gt;newStandard()
-&gt;setTzname( &quot;AKST&quot; );
$daylight = $vtimezone-&gt;newDaylight()
-&gt;setTzname( &quot;AKDT&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TZOFFSETFROM"></a><h3>3.2.58 TZOFFSETFROM</h3>
<p class="quotes">
This property specifies the offset which is in use prior to this <a href="#VTIMEZONE">TIMEZONE</a> observance.
The property is REQUIRED, but MUST NOT occur more than once in <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
</p>
<p>The value type is UTC-OFFSET, &quot;+&quot; / &quot;-&quot; time-hour (2*DIGIT) time-minute (2*DIGIT) [time-second (2*DIGIT)].</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::TZOFFSETFROM is available.
</p>
<h5>Create TZOFFSETFROM</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">vtimezone::createTzoffsetfrom()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createTzoffsetfrom();
</p>
<h5>Delete TZOFFSETFROM</h5>
<p>Remove TZOFFSETFROM from component.</p>
<p class="label">Format</p>
<p class="format">vtimezone::deleteTzoffsetfrom()</p>
<p class="label">Example</p>
<p class="example">
$vtimezonestd-&gt;deleteTzoffsetfrom();
</p>
<h5>Get TZOFFSETFROM</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">vtimezone::getTzoffsetfrom()</p>
<p class="comment">output = tzoffsetfrom<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">vtimezone::getTzoffsetfrom( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; tzoffsetfrom<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$tzoffsetfrom = $tzstandard-&gt;getTzoffsetfrom();
</p>
<h5>is TZOFFSETFROM set</h5>
<p>Return bool true if TZOFFSETFROM is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isTzoffsetfromSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $daylight-&gt;isTzoffsetfromSet();
</p>
<h5>Set TZOFFSETFROM</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true)
and on invalid offset value.
</p>
<p class="label">Format</p>
<p class="format">vtimezone::setTzoffsetfrom( tzoffsetfrom [, xparams ] )</p>
<p class="comment">tzoffsetfrom<sup>1</sup> = (int) (+/-)HHmm[ss] // <span class="comment">UTC offset</span>
xparams<sup>2</sup> = (array) ( *[ /string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = $vcalendar-&gt;newVtinezone()
-&gt;setTzid( &quot;US-Eastern&quot; )
-&gt;setLastmodified( &quot;19870101&quot; );
$standard = $vtimezone-&gt;newStandard()
-&gt;setTzname( &quot;EST&quot; )
-&gt;setTzoffsetfrom( &quot;-0500&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TZOFFSETTO"></a><h3>3.2.59 TZOFFSETTO</h3>
<p class="quotes">
This property specifies the offset which is in use in this <a href="#VTIMEZONE">TIMEZONE</a> observance.
The property is REQUIRED, but MUST NOT occur more than once in <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
</p>
<p>The value type is UTC-OFFSET, &quot;+&quot; / &quot;-&quot; time-hour (2*DIGIT) time-minute (2*DIGIT) [time-second (2*DIGIT)].</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::TZOFFSETTO is available.
</p>
<h5>Create TZOFFSETTO</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">vtimezone::createTzoffsetto()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createTzoffsetto();
</p>
<h5>Delete TZOFFSETTO</h5>
<p>Remove TZOFFSETTO from component.</p>
<p class="label">Format</p>
<p class="format">vtimezone::deleteTzoffsetto()</p>
<p class="label">Example</p>
<p class="example">
$daylight-&gt;deleteTzoffsetto();
</p>
<h5>Get TZOFFSETTO</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">vtimezone::getTzoffsetto()</p>
<p class="comment">output = tzoffsetto<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">vtimezone::getTzoffsetto( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; tzoffsetto<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$tzoffsetto = $tztandard-&gt;getTzoffsetto();
</p>
<h5>is TZOFFSETTO set</h5>
<p>Return bool true if TZOFFSETTO is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isTzoffsettoSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $daylight-&gt;isTzoffsettoSet();
</p>
<h5>Set TZOFFSETTO</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true)
and on invalid offset value.
</p>
<p class="label">Format</p>
<p class="format">vtimezone::setTzoffsetto(tzoffsetto [, xparams ] )</p>
<p class="comment">tzoffsetto<sup>1</sup> = (int) (+/-)HHmm[ss] // <span class="comment">UTC offset</span>
xparams<sup>2</sup> = array( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = $vcalendar-&gt;newVtimezone()
-&gt;setTzid( &quot;US-Eastern&quot; )
-&gt;setLastmodified( &quot;19870101&quot; );
$standard = $vtimezone-&gt;newStandard();
.. .
$daylight = $vtimezone-&gt;newDaylight()
-&gt;setTzoffsetto( &quot;1345&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TZUNTIL"></a><h3>3.2.60 TZUNTIL</h3>
<p class="quotes">
This property specifies an upper bound for the validity period of data
within a <a href="#VTIMEZONE">VTIMEZONE</a> component.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7808" title="Download rfc7808" target="_blank">rfc7808</a>
&quot;Time Zone Data Distribution Service&quot;
</dt>
<dd>
TZUNTIL may occur once in <a href="#VTIMEZONE">VTIMEZONE</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>The value type for TZUNTIL is <a href="#DATE_WITH_UTC_TIME">UTC</a> timezone DATE-TIME.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::TZUNTIL is available.
</p>
<p>For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="TZURL"></a><h3>3.2.61 TZURL</h3>
<p class="quotes">
The TZURL provides a means for a <a href="#VTIMEZONE">VTIMEZONE</a> component to point to
a network location that can be used to retrieve an up-to-date version of itself. The property
is OPTIONAL and MUST NOT occur more than once.
</p>
<p> The value type is URI.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::TZURL is available.
</p>
<h5>Create TZURL</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">vtimezone::createTzurl()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createTzurl();
</p>
<h5>Delete TZURL</h5>
<p>Remove TZURL from component.</p>
<p class="label">Format</p>
<p class="format">vtimezone::deleteTzurl()</p>
<p class="label">Example</p>
<p class="example">
$vtimezone-&gt;deleteTzurl();
</p>
<h5>Get TZURL</h5>
<p>If set, returns property value, otherwise bool false.</p>.
<p class="label">Format 1</p>
<p class="format">vtimezone::getTzurl()</p>
<p class="comment">output = tzurl<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">vtimezone::getTzurl( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; tzurl<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$tzurl = $timezonestandard-&gt;getTzurl();
</p>
<h5>is TZURL set</h5>
<p>Return bool true if TZURL is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isTzurlSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vtimezone-&gt;isTzurlSet();
</p>
<h5>Set TZURL</h5>
<p>Set property value.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p>
The method throws InvalidArgumentException on url error.
</p>
<p class="label">Format</p>
<p class="format">vtimezone::setTzurl(tzurl [, xparams ] )</p>
<p class="comment">tzurl<sup>1</sup> = (string) Value type URI
xparams<sup>2</sup> = array( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$vtimezone = $vcalendar-&gt;newVtimezone()
-&gt;setTzid( &quot;US-Eastern&quot; );
try {
$vtimezone-&gt;setTzuntil( &quot;19870101T000000&quot; )
}
catch( Exception $e ) {
die( $e-&gt;getMessage();
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="UID"></a><h3>3.2.62 UID</h3>
<p class="quotes">
The persistent, globally <b>U</b>nique <b>ID</b>entifier for the <strong>calendar</strong> / component.
The property (is OPTIONAL and) MUST NOT occur more than once in
<a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a> and
<a href="#VJOURNAL">VJOURNAL</a>, <a href="#VFREEBUSY">VFREEBUSY</a>
components.<br>
However, UID is <u>automatically</u> generated in iCalcreator when creating component.
</p>
<p>Note, as described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
UID MUST occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a> and <a href="#AVAILABLE">AVAILABLE</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
UID (may) occur once in <a href="#VCALENDAR">VCALENDAR</a> and may NOT be supported by all calendaring software.
Calendar UID is <u>automatically</u> generated at instance creation.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
UID may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>,
<a href="#VLOCATION">VLOCATION</a> and <a href="#VRESOURCE">VRESOURCE</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p>
UID is (auto set to) a hex-encoded random Universally Unique Identifier (UUID) value
as defined in Sections 4.4 and 4.5 of
<a href="https://tools.ietf.org/html/rfc4122" title="Download rfc4122" target="_blank">rfc4122</a>.
Note, NO deleteUid() method, use setUid() to recreate.
</p>
<p class="label">Example</p>
<p class="example">
UID:5FC53010-1267-4F8E-BC28-1D7AE55A7C99</p>
<p>
UID may be required when importing iCal formatted information into some <strong>calendar</strong> software (MS etc.),
as well as (<strong>calendar</strong>) properties <a href="#X-PROPERTY">x-properties</a> "X-WR-CALNAME",
"X-WR-CALDESC" and "X-WR-TIMEZONE",
<a href="#METHOD">METHOD</a> (value PUBLISH etc.)
and the (also automatically created) <a href="#DTSTAMP">DTSTAMP</a> property.
</p>
<p>The value type for UID is TEXT.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::UID is available.
</p>
<h5>Create UID</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createUid()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createUid();
</p>
<h5>Delete UID</h5>
<p>
Use component::setUid() to recreate.
</p>
<h5>Get UID</h5>
<p>If set, returns property, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getUid()</p>
<p class="comment">output = uid<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getUid( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; uid<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$uid = $vevent-&gt;getUid();
</p>
<h5>is UID set</h5>
<p>Return bool true.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isUidSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isUidSet();
</p>
<h5>Set UID</h5>
<p>Insert property value, overrides any previously set or auto-created UID.</p>
<p>
Do <b>NOT</b> use an integer UID or only a component name as UID (ex. &quot;vevent&quot;),
this may cause malfunction in ex. Vcalendar method <a href="#setComponent">setComponent</a> with index or UID argument.
</p>
<p>
The method throws InvalidArgumentException on empty (non-zero) value.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setUid( uid [, xparams ] )</p>
<p class="comment">uid<sup>1</sup> = (string) Value type TEXT
xparams<sup>2</sup> = array( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setUid( &quot;20070803T194810CEST-0123U3PXiX@kigkonsult.se&quot; );
</p>
<p>
BUT, due to poorly created iCal formatted information, a numeric UID is accepted in the setUid() and
<a href="#parse_merge">parse()</a> methods.
Do check for component digit UIDs and remove it (will force a (auto) UID recreation) or (re-)set it manually.
</p>
<p class="example">
if( ctype_digit( $vevent-&gt;getUid())) {
$vevent-&gt;deleteUid();
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="URL"></a><h3>3.2.63 URL</h3>
<p class="quotes">
This property defines a Uniform Resource Locator (URL) associated with the <strong>iCalendar</strong> object.
The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
<a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
</p>
<p>As described in</p>
<dl>
<dt>
<a href="https://tools.ietf.org/html/rfc5870" title="Download rfc5870" target="_blank">rfc5870</a>
&quot;A Uniform Resource Identifier for Geographic Locations (geo URI)&quot;,
</dt>
<dd>
URL now accepts a &quot;geo&quot; URI value (ex. &quot;geo:40.443,-79.945;u=10&quot;) but with no validation
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc7953" title="Download rfc7953" target="_blank">rfc7953</a>
&quot;New Properties for iCalendar&quot;
</dt>
<dd>
URL may occur once in <a href="#VAVAILABILITY">VAVAILABILITY</a>,
may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc7986" title="Download rfc7986" target="_blank">rfc7986</a>
&quot;iCalendar Property Extensions&quot;
</dt>
<dd>
URL may occur once in <a href="#VCALENDAR">VCALENDAR</a> and may NOT be supported by all calendaring software.
</dd>
<dt>
<a href="https://tools.ietf.org/html/rfc9073" title="Download rfc9073" target="_blank">rfc9073</a>
&quot;Event Publishing Extensions to iCalendar&quot;
</dt>
<dd>
URL may occur once in <a href="#PARTICIPANT">PARTICIPANT</a>
and may NOT be supported by all calendaring software.
</dd>
</dl>
<p> The value type is URI.</p>
<p>You can <a href="#sort2">SORT</a> <strong>calendar</strong> (components) on (asc) URL values.</p>
<p>
To ease up usage, constant Kigkonsult\Icalcreator\Vcalendar::URL is available.
</p>
<h5>Create URL</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::createUrl()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createUrl();
</p>
<h5>Delete URL</h5>
<p>Remove URL from component.</p>
<p class="label">Format</p>
<p class="format">calendarComponent::deleteUrl()</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;deleteUrl();
</p>
<h5>Get URL</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p class="format">calendarComponent::getUrl()</p>
<p class="comment">output = url<sup>1</sup></p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">calendarComponent::getUrl( true )</p>
<p class="comment">output = [
&quot;value&quot; =&gt; url<sup>1</sup>,
&quot;params&quot; =&gt; xparams<sup>2</sup>
]
</p>
<p class="label">Example</p>
<p class="example">
$url = $vevent-&gt;getUrl();
</p>
<h5>is URL set</h5>
<p>Return bool true if URL is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isUrlSet()</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isUrlSet();
</p>
<h5>Set URL</h5>
<p>Set property value.</p>
<p>
The non-rfc (opt urlencoded) value prefix/suffix &quot;&lt;&gt;&quot; (and parameter valuetype) is supported.
</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true),
InvalidArgumentException on url error.
</p>
<p class="label">Format</p>
<p class="format">calendarComponent::setUrl( url [, xparams ] )</p>
<p class="comment">url<sup>1</sup> = (string) Value type URI
xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
</p>
<p class="label">Example</p>
<p class="example">
try {
$vtodo-&gt;setUrl( &quot;https://www.icaldomain.net&quot; );
}
catch( InvalidArgumentException $e ) {
die( $e-&gt;getMessage());
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="X-PROPERTY"></a><h3>3.2.64 X-PROPERTY</h3>
<p class="quotes">
A <a href="#VCALENDAR">VCALENDAR</a>/component, non-standard property with a TEXT value
and a name with an &quot;<b>X-</b>&quot; prefix.
An x-property, with an unique name, can occur only once but the number of x-properties are unlimited.
</p>
<p>
In <a href="#VCALENDAR">VCALENDAR</a>, the X-properties "X-WR-CALNAME", "X-WR-CALDESC" and "X-WR-TIMEZONE"
may be required when importing iCal formatted information
into some calendaring software (MS etc.), as well as <a href="#METHOD">METHOD</a> property (value PUBLISH etc.)
and the (automatically created) <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties.
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_CALNAME<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_CALDESC<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_RELCALID<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_TIMEZONE<br>
- Kigkonsult\Icalcreator\Vcalendar::X_LIC_LOCATION<br>
are available.
</p>
<p>The value type is TEXT.</p>
<p>Component, below, stands for <a href="#VCALENDAR">VCALENDAR</a> or any calendarComponent.</p>
<p>
Note <a href="#propValueParam">Pc</a>::isXprefixed() / setXPrefix() / unsetXPrefix()
(last) key utility (static) methods.
</p>
<h5>Create X-PROPERTY</h5>
<p>If set, returns [RFC5545] formatted string, otherwise empty string.</p>
<p class="label">Format</p>
<p class="format">Component::createXprop()</p>
<p class="label">Example</p>
<p class="example">
$str = $component-&gt;createxProp();
</p>
<h5>Delete X-PROPERTY</h5>
<p>Remove X-PROPERTY from component.</p>
<p class="label">Format</p>
<p class="format">Component::deleteXprop( &quot;&lt;X-PROPERTY&gt;&quot; )</p>
<p class="label">Example 1</p>
<p>Deleting x-property named &quot;X-PROPERTY&quot;.</p>
<p class="example">
$vevent-&gt;deleteXprop( &quot;X-PROPERTY&quot; );
</p>
<p class="label">Example 2</p>
<p>Deleting all x-properties.</p>
<p class="example">
while( $vevent-&gt;deleteXprop()) {
continue;
}
</p>
<h5>Get X-property</h5>
<p>If set, returns property value, otherwise bool false.</p>
<p class="label">Format 1</p>
<p>
Get specific x-propery value.
</p>
<p class="format">Component::getXprop( &quot;&lt;X-PROPERTY-NANE&gt;&quot; )</p>
<p class="comment">output = [
propertyName<sup>1</sup>,
value<sup>2</sup> )
</p>
<p class="label">Format 2</p>
<p>
Get (next) x-property value.
</p>
<p class="format">Component::getXprop()</p>
<p class="comment">output = array( propertyName<sup>1</sup>
, value<sup>2</sup> )</p>
<p class="label">Format 3</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">Component::getXprop( null, propOrderNo/null, true )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">output = [
propertyName<sup>1</sup>,
[
&quot;value&quot; =&gt; value<sup>2</sup> ),
&quot;params&quot; =&gt; params<sup>3</sup>
]
]
</p>
<p class="label">Format 4</p>
<p class="format">Component::getXprop( null, propOrderNo )</p>
<p class="comment">propOrderNo = (int) specific property value</p>
<p class="comment">Get propOrderNo X-property</p>
<p class="label">Example 1</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
if( $vcalendar-&gt;isXpropSet( Vcalendar::X_WR_TIMEZONE )) {
$d = $vcalendar-&gt;getXprop( Vcalendar::X_WR_TIMEZONE );
echo $d[1];
<span class="comment">// $d = array( &quot;X-WR-TIMEZONE&quot;, value<sup>2</sup> )</span>
} // end if
</p>
<p class="label">Example 2</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
while( $xprop = $vcalendar-&gt;getXprop )) {
<span class="comment">// $xprop = [ propertyName<sup>1</sup>, value<sup>2</sup> ]</span>
.. .
} // end while
</p>
<p class="label">Example 3</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
if( $xprop = $vcalendar-&gt;getXprop( &quot;X-ABC-MMSUBJ&quot; )) {
<span class="comment">// $xprop = [ &quot;X-ABC-MMSUBJ&quot;, value<sup>2</sup> ]</span>
.. .
} // end if
</p>
<p class="label">Example 4</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
while( $xprop = $vcalendar-&gt;getXprop( null, null, true )) {
/*
<span class="comment"> $xprop = [
propertyName<sup>1</sup>,
[
&quot;value&quot; =&gt; value<sup>2</sup>,
&quot;params&quot; =&gt; params<sup>3</sup>
]
]</span>
*/
} // end while
</p>
<h5>Get all X-properties</h5>
<p>Returns array</p>
<p class="label">Format 1</p>
<p class="format">Component::getAllXprop()</p>
<p class="comment">output = [
*[
propertyName<sup>1</sup>,
value<sup>2</sup> )
]
]
</p>
<p class="label">Format 2</p>
<p>Note details about <a href="#propValueParam">property value/params</a>.</p>
<p class="format">Component::getAllXprop( true )</p>
<p class="comment">output = [
*[
propertyName<sup>1</sup>,
[
&quot;value&quot; =&gt; value<sup>2</sup>,
&quot;params&quot; =&gt; params<sup>3</sup>
]
]
]
</p>
<h5>is X-property set</h5>
<p>Return bool true if X-property (key) is set (i.e. non-empty).</p>
<p class="label">Format</p>
<p class="format">calendarComponent::isXpropSet( [key] )</p>
<p class="comment">key = (string) X-property name</p>
<p class="label">Example</p>
<p class="example">
$isPropSet = $vevent-&gt;isXpropSet();
</p>
<h5>Set X-property</h5>
<p>Insert property name and value. If an x-prop with the same name already exists, it will be replaced.</p>
<p>
The method throws InvalidArgumentException on empty value and config ALLOWEMPTY is set to false (default true).
</p>
<p class="label">Format</p>
<p class="format">Component::setXprop( propertyName, propertyData [, params ] )</p>
<p class="comment">propertyName<sup>1</sup> = (string) Any property name with a &quot;X-&quot; prefix
value<sup>2</sup> = (string) Value type TEXT
params<sup>3</sup> = (array) ( [Vcalendar::LANGUAGE =&gt; (string) &quot;lang<sup>*</sup>&quot;] *[, xparams] )
xparam = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
lang<sup>*</sup> = as defined in [RFC5546]</p>
<p class="label">Example</p>
<p class="example">
$component-&gt;setXprop( &quot;X-ABC-MMSUBJ&quot;, &quot;https://load.noise.org/mysubj.wav&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
<a id="iCalcreator_component_configuration_methods"></a><h2>3.3 iCalcreator Component configuration methods</h2>
<a id="Language_PROP"></a><h3>3.3.1 Language</h3>
<p class="quotes">Language for specific <strong>calendar</strong> component.</p>
<p>
Language set at component level can be overridden by specific component property parameter.<br>
A successful &quot;setConfig&quot; returns bool true.
</p>
<p>
There is a convenient config key constant available: Vcalendar::LANGUAGE.
</p>
<h5>Get language</h5>
Language for <strong>calendar</strong> (only if language is set at component level).
<p class="label">Format</p>
<p class="format">calendarComponent::getConfig( &quot;language&quot; )</p>
<p class="label">Example</p>
<p class="example">
$lang = $vevent-&gt;getConfig( Vcalendar::LANGUAGE );
</p>
<h5>Set LANGUAGE</h5>
<p class="label">Format</p>
<p class="format">calendarComponent::setConfig( &quot;language&quot;, lang )</p>
<p class="comment">lang = (string) language</p>
<p class="label">Example</p>
<p class="example">
$vevent-&gt;setConfig( Vcalendar::LANGUAGE, &quot;en&quot; );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_configuration_methods">[up]</a>
<a id="iCalcreator_misc_methods"></a><h2>3.4 iCalcreator misc. methods</h2>
<p>Calendar component subcomponent functions.</p>
<a id="deleteComponent_PROP"></a><h4>3.4.1 deleteComponent</h4>
Remove subcomponent from component.
<p class="label">Format</p>
<p class="format">calendarComponent::deleteComponent( orderNumber )</p>
<p class="comment">orderNumber = (int) component order Number</p>
<p class="comment">Remove component with order number (1st=1, 2nd=2).</p>
<p class="format">calendarComponent::deleteComponent( componentType [, componentSuborderNumber])</p>
<p class="comment">componentType = (string) component type
componentSuborderNumber = (int) component suborder number</p>
<p class="comment">Remove component with component type (ex. &quot;vevent&quot;)
and order 1 alt. suborder number.</p>
<p class="format">calendarComponent::deleteComponent( <a href="#UID">UID</a> )</p>
<p class="comment">Remove component with <a href="#UID">UID</a>.
N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">timezone</a> components.</p>
<p class="label">Example 1</p>
<p>Delete first subcomponent.</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$comp1 = $vcalendar-&gt;getComponent();
$comp1-&gt;deleteComponent( 1 );
</p>
<p class="label">Example 2</p>
<p>Delete all subcomponents.</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot;, ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$comp1 = $vcalendar-&gt;getComponent();
while( $comp1-&gt;deleteComponent( Vcalendar::VALARM ) {
continue;
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_misc_methods">[up]</a>
<a id="getComponent_PROP"></a><h4>3.4.2 getComponent</h4>
Get subComponent from component.
<p class="label">Format 1</p>
<p class="format">calendarComponent::getComponent()</p>
<p class="comment">Get next component until end-of-components.</p>
<p class="label">Format 2</p>
<p class="format">calendarComponent::getComponent( int orderNumber )</p>
<p class="comment">orderNumber = (int) component order number</p>
<p class="comment">Get component with order number (1st=1, 2nd=2).</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::getComponent( string componentType [, int componentSuborderNumber])</p>
<p class="comment">componentType = (string) component type
componentSuborderNumber = (int) component suborder number</p>
<p class="comment">Get (next) component with component type (until end-of-components)
alt. component with component type and suborder number (1st=1, 2nd=2..).</p>
<p class="label">Format 4</p>
<p class="format">calendarComponent::getComponent( <a href="#UID">UID</a> )</p>
<p class="comment">Get component with <a href="#UID">UID</a>.
N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">timezone</a> components.</p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
$comp1 = $vcalendar-&gt;getComponent());
while( $subComp = $comp1-&gt;getComponent()) {
.. .
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_misc_methods">[up]</a>
<a id="getComponents_PROP"></a><h4>3.4.3 getComponents</h4>
<p>Return (array) subComponents from component.</p>
<p class="label">format</p>
<p class="format">calendarComponent::getComponents( [ compType ] )</p>
<p class="comment">compType : (string) component type
<p class="label">Example</p>
<p>Return all Valarms</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$vcalendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$iCalContent = file_get_contents( &quot;calendar.ics&quot; );
$vcalendar-&gt;parse( $iCalContent );
foreach( $vcalendar-&gt;getComponents( Vcalendar::VEVENT ) as $component ) {
foreach( $component-&gt;getComponents( Vcalendar::VALARM ) as $subComponent ) {
.. .
}
.. .
}
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_misc_methods">[up]</a>
<a id="setComponent_PROP"></a><h4>3.4.4 setComponent</h4>
Add <strong>calendar</strong> component to the Vcalendar instance or replace/update component in the Vcalendar instance.
<p class="label">Format 1</p>
<p class="format">calendarComponent::setComponent( component )
addSubComponent( component ) // <span class="comment">alias</span></p>
<p class="comment">Insert last in component chain.</p>
<p class="label">Format 2</p>
<p class="format">calendarComponent::setComponent( component, int orderNumber )</p>
<p class="comment">orderNumber = (int) component order number</p>
<p class="comment">Replace component with order number(1st=1, 2nd=2).
If orderNumber is not found, component is inserted last in chain.</p>
<p class="label">Format 3</p>
<p class="format">calendarComponent::setComponent( component, componentType [,componentSuborderNumber])</p>
<p class="comment">componentType = (string) component type
componentSuborderNumber = (int) component suborder number</p>
<p class="comment">Replace component with component type and component order number.
if orderNumber is not found, component is inserted last in chain. </p>
<p class="label">Example</p>
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Vevent;
use Kigkonsult\Icalcreator\Valarm;
$config = [
Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot;,
];
$vcalendar = new Vcalendar( $config ); // <span class="comment">initiate new CALENDAR</span>
$vevent = new Vevent( $config );
// <span class="comment">add some <a class="ref" href="#VEVENT">EVENT</a> properties</span>
$vevent-&gt;setDtstart( new DateTime( &quot;2006-12-24 19:30:00&quot; );
$vevent-&gt;set...( ...
...
$valarm = new Valarm( $config );
$valarm-&gt;setTrigger( ...
$vevent-&gt;setComponent( $valarm );
$vcalendar-&gt;setComponent( $vevent );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_misc_methods">[up]</a>
<a id="vtimezone_populate"></a><h4>3.4.5 Vtimezone populate</h4>
<p>
The Util/VtimezonePopulateFactory::process (static) method,
applied on a Vcalendar instance,
return the Vcalendar instance with <a href="#VTIMEZONE">Vtimezone(s)</a>,
<a href="#VTIMEZONE">Standard</a> and <a href="#VTIMEZONE">Daylight</a> components,
using <em>PHP</em> DateTimeZone class and time zone transition (UTC) timestamps.
If <a href="#VTIMEZONE">Vtimezone(s)</a> exists in calendar, it is replaced.
</p>
<p>
Recommendation is to call the method <b>after</b> editing components
using arg timezone(s)
(and without (period) from/to arguments).
</p>
<p>
To ease up usage, constants<br>
- Kigkonsult\Icalcreator\Vcalendar::X_WR_TIMEZONE<br>
- Kigkonsult\Icalcreator\Vcalendar::X_LIC_LOCATION<br>
are available.
</p>
<p>
Throws Exception on invalid (<em>PHP</em>) timezone.
</p>
<p class="label">Format</p>
<p class="format">Util/VtimezonePopulateFactory::process::populate( calendar, [ timezone [, xprops, [, from [, to ]]]] )</p>
<p class="comment">calendar = (object) Vcalendar instance
timezone = (string|array) valid timezone(s), acceptable by <em>PHP</em> DateTimeZone<sup>*</sup>
xprops = (array) ( *[ x-propName =&gt; value ] ), timezone non-standard properties
from = DateTimeInterface | (int) timestamp, period start date<sup>**</sup>
to = DateTimeInterface | (int) timestamp, period end date<sup>**</sup>
<sup>*</sup> If no argument timezone, the argument xProps is searched for &quot;X-WR-TIMEZONE&quot; and &quot;X-LIC-LOCATION&quot; keys.
If not found then calendar are searched for the X-properties.
If still none found, &quot;UTC&quot; is used.
<sup>**</sup> If empty &quot;from&quot; and &quot;to&quot; arguments, the calendar components &quot;<a href="#DTSTART">DTSTART</a>&quot; values
are used to get the lowest (modified, minus 12 month) and
highest (modified, plus 18 month) dates.
</p>
<p class="label">Example</p>
Using the Util/VtimezonePopulateFactory::process (static) method.
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
use Kigkonsult\Icalcreator\Util\VtimezonePopulateFactory;
$calendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$timezone = 'Europe/Stockholm';
.. .
// <span class="comment">insert components or parse an iCal string</span>
.. .
$calendar = VtimezonePopulateFactory::process( $calendar, $timezone );
</p>
<p class="label">Example 2</p>
Using the shortcut The Vcalendar::<a href="#valendarVtimezonePopulate">vtimezonePopulate</a>() method.
<p class="example">
use Kigkonsult\Icalcreator\Vcalendar;
$calendar = new Vcalendar( [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ] );
$timezone = 'Europe/Stockholm';
.. .
// <span class="comment">insert components or parse an iCal string</span>
.. .
$calendar->VtimezonePopulate( $timezone );
</p>
<p>
Output example (when using Vcalendar createCalendar or returnCalendar methods):
</p>
<p class="example">
BEGIN:VTIMEZONE
TZID:Europe/Stockholm
X-LIC-LOCATION:Europe/Stockholm
BEGIN:STANDARD
DTSTART:20111030T003000
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20110327T002000
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
END:DAYLIGHT
END:VTIMEZONE
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_misc_methods">[up]</a>
<a id="msTimezone2PHPtz"></a><h4>3.4.6 Review timezones, opt alter to PHP timezone</h4>
<p>
RegulateTimezoneFactory (+RegulateTimezoneFactoryTest) is deprecated due to 2.41.60, GitHub#103 (non-PHP timezones).
</p>
<p>
The Vcalendar::<a href="#parse_merge">parse</a> or component::<a href="#componentParse">parse</a>
will throw exception when the input data contains PHP unknown timezones,
ex MS listed at https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-time-zones.
</p>
<p>
To support other (MS) timezones mapping to PHP timezones (ie timezones with the same or nearby UTC offset),
the RegulateTimezoneFactory::process method can be used before parse.
The factory review the <a href="#VTIMEZONE">Vtimezone</a> property <a href="#TZID">TZID</a>
and component date properties
<a href="#DTSTART">DTSTART</a>,
<a href="#DTEND">DTEND</a>,
<a href="#DUE">DUE</a>,
<a href="#RECURRENCE-ID">RECURRENCE-ID</a>,
<a href="#EXDATE">EXDATE</a> and
<a href="#RDATE">RDATE</a>
and parameter <a href="#tzidparam">&quot;TZID&quot;</a>.
</p>
<p>
The method throws Exception when unknown timezone not can be mapped.
</p>
<p>Return rfc5545 formatted calendar string.</p>
<p class="label">Format</p>
<p class="format">RegulateTimezoneFactory::process( iCalData )</p>
<p class="comment">iCalData = string|array $iCal strict rfc5545 formatted calendar</p>
<p class="example">
use Kigkonsult\Icalcreator\Util\RegulateTimezoneFactory;
$iCalStringToParse = RegulateTimezoneFactory::process( $iCalInput );
</p>
<p>
Any unknown timezone (ex MS "Customized Time Zone"),
if used in VTIMEZONE, will map to a PHP timezone (using TZOFFZETTO values)
with nearby offsets.
</p>
<p>
To specify a "direct" map for a PHP unknown timezone, use (in static style format)
</p>
<p class="format">RegulateTimezoneFactory::process( icalInput, [ *( &lt;otherTimezone&gt; => &lt;phpTimezone&gt; ) ] )</p>
<p>
or (as object oriented style example)
</p>
<p class="example">
use Kigkonsult\Icalcreator\Util\RegulateTimezoneFactory;
$iCalStringToParse =
RegulateTimezoneFactory::factory( $iCalInput )
->addOtherTzPhpRelation( $otherTimezone, $phpTimezone )
->processCalendar()
->getOutputiCal();
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_misc_methods">[up]</a>
<br>
<br>
<a id="TimezoneXMLjsonvCard"></a><h1>4 XML, json and vCard support</h1>
<a id="XMLhelpers"></a><h3>4.3 iCalcreator and (rfc6321) XML</h3>
<p>
Ical XML is defined by <a href="https://tools.ietf.org/html/rfc6321" title="Download rfc6321" target="_blank">rfc6321</a>,
&quot;xCal: The XML Format for <strong>iCalendar</strong>&quot;.
</p>
<a id="iCal2XML"></a><h4>4.3.1 iCal2XML</h4>
<p>The (static) XML\Formatter::iCal2XML method converts an Vcalendar instance to XML.</p>
<p>
The iCal2XML method uses the SimpleXML extension (and &quot;libxml&quot; <em>PHP</em> extension).
</p>
<p>An rfc6321 XML string is returned.</p>
<p class="label">Format</p>
<p class="format">XML\Formatter::iCal2XML( iCalobj )</p>
<p class="comment">iCalobj = (object) Vcalendar instance</p>
<p class="example">
use Kigkonsult\Icalcreator\Xml\Formatter as XmlFormatter;
$xmlString = XmlFormatter::iCal2XML( $vcalendar );
</p>
<br>
<a id="XML2iCal"></a><h4>4.3.2 XML2iCal</h4>
<p>
The (static) Xml\Parser::XML2iCal method accepts a well-formed (rfc6321) XML string as argument.
</p>
<p>
On success, an Vcalendar instance is returned, on error false.
</p>
<p class="label">Format</p>
<p class="format">Xml\Parser::XML2iCal( xmlstr [, config] )</p>
<p class="comment">xmlstr = (string) rfc6321 XML
config = (array) iCalcreator config array (opt)
</p>
<p class="example">
use Kigkonsult\Icalcreator\Xml\Parser as XmlParser;
$config = [ Vcalendar::UNIQUE_ID =&gt; &quot;kigkonsult.se&quot; ];
$vcalendar = XmlParser::XML2iCal( $xlmString, $config );
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#TimezoneXMLjsonvCard">[up]</a>
<a id="iCal2jSon"></a><h3>4.4 iCalcreator and json export</h3>
<p>
You can export and import
(<a href="https://tools.ietf.org/html/rfc8984" title="Download rfc8984" target="_blank">rfc8984</a>)
iCal json using
<a href="https://github.com/iCalcreator/PhpJsCalendar" title="PhpJsCalendar" target="_blank">PhpJsCalendar</a>.
</p>
<p>
You can also export iCal (XML) as json using a Vcalendar instance,
Xml\Formatter::<a href="#iCal2XML">iCal2XML()</a> (above),
simplexml_load_string and json_encode as follows:
</p>
<p class="example">
use Kigkonsult\Icalcreator\Xml\Formatter as XmlFormatter;
$xml = XmlFormatter::iCal2XML( $vcalendar );
$json = json_encode( simplexml_load_string( $xml ));
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#TimezoneXMLjsonvCard">[up]</a>
<a id="vCardhelpers"></a><h3>4.5 iCalcreator and iCalvCardFactory class</h3>
<p>
The Kigkonsult\Icalcreator\Util\IcalvCardFactory class has two methods to produce vCard string output.
</p>
<a id="iCal2vCard"></a><h4>4.5.1 iCal2vCard</h4>
<p>
The (static) method converts a single email (iCal &quot;cal-address&quot;) into (string) vCard.
</p>
<p>
Returns vCard string.
</p>
<p class="label">Format</p>
<p class="format">IcalvCard::iCal2vCard( email [, version ] )</p>
<p class="comment">
email = (string) email, ATTENDEE, ORGANIZER and opt CONTACT &quot;cal-address&quot;
version = (string) vCard version, &quot;2.1&quot; (default), &quot;3.0&quot;, &quot;4.0&quot;
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#TimezoneXMLjsonvCard">[up]</a>
<a id="iCal2vCards"></a><h4>4.5.2 iCal2vCards</h4>
<p>
The (static) method collects and converts all <a href="#ATTENDEE">ATTENDEE</a>s and <a href="#ORGANIZER">ORGANIZER</a>s
values (iCal &quot;cal-address&quot;) and <a href="#CONTACT">CONTACT</a>s
into simplified vCard (string) output using<br>
</p>
<ul>
<li><a href="#iCal2vCard">iCalvCardFactory::iCal2vCard</a>, above</li>
<li>Kigkonsult\Icalcreator\Util\CalAddressFactory::getCalAdresses( vcalendar [, properties [, inclParams ]] )<br>
- vcalendar = (object) Vcalendar instance<br>
- properties = array, default [<a href="#ATTENDEE">ATTENDEE</a>, <a href="#ORGANIZER">ORGANIZER</a>, <a href="#CONTACT">CONTACT</a>]<br>
- inclParams = (bool) default true: search property values and parameters, false: values only<br>
</li>
</ul>
<p class="label">Format</p>
<p class="format">IcalvCard::iCal2vCards( vcalendar [, version [, inclParams [, count ]]] )</p>
<p class="comment">
vcalendar = (object) Vcalendar instance
version = (string) vCard version, &quot;2.1&quot; (default), &quot;3.0&quot;, &quot;4.0&quot;
inclParams = (bool) default true: search property values and parameters, false: values only
count = (int) number of vCards in output
</p>
<p class="comment">
Return vCard(s) string.
</p>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#TimezoneXMLjsonvCard">[up]</a>
<a id="Copyright_and_Licence"></a><h1>5 COPYRIGHT AND LICENSE</h1>
<p>
In this document may exist quotes and/or extracts from
<a href="https://www.ietf.org/" target="_blank">IETF</a> <a href="#IETF_rfc">rfc</a> documents,
for copyright and licence, see the &quot;Copyright Notice&quot; content part
in top of each IETF <a href="#IETF_rfc">rfc</a> document.
</p>
<table>
<tr><td>Copyright<td>(c) 2007-2022 Kjell-Inge Gustafsson, kigkonsult, All rights reserved
<tr><td>Link <td>https://kigkonsult.se
<tr><td>Package <td>iCalcreator
<tr><td>Version <td>2.41.70
<tr><td class="top">License
<td>
Subject matter of licence is the software iCalcreator.<br>
The above copyright, link, package and version notices,<br>
this licence notice and the invariant [rfc5545] PRODID result use<br>
as implemented and invoked in iCalcreator shall be included in<br>
all copies or substantial portions of the iCalcreator.<br>
<br>
iCalcreator is free software: you can redistribute it and/or modify<br>
it under the terms of the GNU Lesser General Public License as published<br>
by the Free Software Foundation, either version 3 of the License,<br>
or (at your option) any later version.<br>
<br>
iCalcreator is distributed in the hope that it will be useful,<br>
but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>
GNU Lesser General Public License for more details.<br>
<br>
You should have received a copy of the GNU Lesser General Public License<br>
along with iCalcreator. If not, see &lt;https://www.gnu.org/licenses/&gt;.
</table>
<br>
<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Copyright_and_Licence">[up]</a>
</body>
</html>