:date: The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects

Overview

sabre/vobject

The VObject library allows you to easily parse and manipulate iCalendar and vCard objects using PHP.

The goal of the VObject library is to create a very complete library, with an easy to use API.

Installation

Make sure you have Composer installed, and then run:

composer require sabre/vobject "^4.0"

This package requires PHP 5.5. If you need the PHP 5.3/5.4 version of this package instead, use:

composer require sabre/vobject "^3.4"

Usage

Build status

branch status
master Build Status
3.5 Build Status
3.4 Build Status
3.1 Build Status
2.1 Build Status
2.0 Build Status

Support

Head over to the SabreDAV mailing list for any questions.

Made at fruux

This library is being developed by fruux. Drop us a line for commercial services or enterprise support.

Comments
  • Implement xCal support

    Implement xCal support

    Useful links:

    • RFC6321, xCal: The XML Format for iCalendar.

    To-do:

    • [x] require sabre/xml,
      • [x] update composer.json,
      • [x] sabre/xml requires PHP5.4, hence update sabre/vobject (done by Composer?),
        • [x] if requires PHP5.4, we can use the JsonSerializable everywhere (all top-classes having a jsonSerialize method),
        • [x] update code accordingly (e.g. short array syntax),
        • [ ] update documentation accordingly,
    • [x] create the helper in Sabre\VObject\Reader,
    • [x] add XML serializer helpers everywhere (e.g. in children of Sabre\VObject\Node),
    • [x] timezones used by xCal and xCard are differents, must check the compatibility,
    • [x] create the reader (parser):
      • [x] support properties:
        • [x] support all names,
        • [x] support all values (types of values):
          • [x] binary,
          • [x] boolean,
          • [x] cal-address,
          • [x] date,
          • [x] date-time,
          • [x] duration,
          • [x] float,
          • [x] integer,
          • [x] period,
            • [x] start,
            • [x] duration,
            • [x] end,
          • [x] recur,
            • [x] until,
            • [x] count,
            • [x] interval,
            • [x] bysecond,
            • [x] byminute,
            • [x] byhour,
            • [x] byday,
            • [x] bymonthday,
            • [x] byday,
            • [x] byyearday,
            • [x] byweekno,
            • [x] bymonth,
            • [x] bysetpos,
            • [x] wkst,
            • [x] freq,
          • [x] text,
          • [x] time,
          • [x] uri,
          • [x] utc-offset,
        • [x] support special cases:
          • [x] categories,
          • [x] resources,
          • [x] freebusy,
          • [x] exdate,
          • [x] rdate,
          • [x] geo,
            • [x] latitude,
            • [x] longitude,
          • [x] request-status,
            • [x] code,
            • [x] description,
        • [x] support all parameters:
          • [x] support the specific value iCalendar parameter,
      • [x] support all components:
        • [x] vevent,
        • [x] vtodo,
        • [x] vjournal,
        • [x] vfreebusy,
        • [x] vtimezone,
        • [x] standard,
        • [x] daylight,
        • [x] valarm,
      • [x] support XML extensions.

    Code review:

    • usage of iterators has been heighten (see https://github.com/fruux/sabre-vobject/pull/161),
    • clean code (https://github.com/fruux/sabre-vobject/pull/162),
    • better performance when possible (see https://github.com/fruux/sabre-vobject/pull/162).

    Left apart for now:

    To fix:

    • [x] rdate.
    enhancement 
    opened by Hywan 34
  • Property Serializer Escaping Issue

    Property Serializer Escaping Issue

    A property which requires comma or semi-colon escaping isn't being handled by the proerty serializer. For example:

    $entry->description = 'this; and, then that';
    

    gets pumped out as:

    DESCRIPTION: this; and, then that
    

    When it should be:

    DESCRIPTION: this\; and\, then that
    

    To add to the problem, I can't manually escape my text, as that just results in my user generated backslashes being escaped:

    $entry->description = addcslashes('this; and, then that', ',;');
    
    DESCRIPTION: this\\; and\\, then that
    

    To fix the problem, I changed the property serializer to use the same escape parameters as the parameter serializer (Property.php around line 176):

    $src = array(
                '\\',
                "\n",
                ';',
                ',',
            );
            $out = array(
                '\\\\',
                '\n',
                '\;',
                '\,',
            );
            $str.=':' . str_replace($src, $out, $this->value);
    

    That does it, but I'm not comfortable enough with the RCF to know if this has side effects when serializing other parameters.

    opened by michaelcaplan 24
  • Expanding calendars removes events that have no master event

    Expanding calendars removes events that have no master event

    Given the following VEVENT:

    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Example Corp.//RoundCube CalDAV Client//EN
    BEGIN:VEVENT
    CREATED:20110305T003637Z
    LAST-MODIFIED:20110305T003705Z
    DTSTAMP:20110305T003705Z
    UID:910fa9d0-b2a0-4c91-94f9-ccc088be7cae
    SUMMARY:My birthsday
    CATEGORIES:Birthday
    TRANSP:TRANSPARENT
    LOCATION:
    DESCRIPTION:
    DTSTART;VALUE=DATE:20140307
    DURATION:P1D
    RECURRENCE-ID;VALUE=DATE:20140307
    END:VEVENT
    END:VCALENDAR
    

    Which is the result of the following calendar-query to a CalDAV server:

    <?xml version="1.0" encoding="utf-8" ?>
    <C:calendar-query xmlns:D="DAV:"
                      xmlns:C="urn:ietf:params:xml:ns:caldav">
      <D:prop>
        <C:calendar-data>
        <C:expand start="20140101T000000Z"
                           end="20140401T000000Z"/>
        </C:calendar-data>
        <D:getetag/>
      </D:prop>
      <C:filter>
        <C:comp-filter name="VCALENDAR">
          <C:comp-filter name="VEVENT">
            <C:time-range start="20140101T000000Z"
                                 end="20140401T000000Z"/>
          </C:comp-filter>
        </C:comp-filter>
      </C:filter>
    </C:calendar-query>
    

    In the above query we are requesting the CalDAV server to expand recurring events to the given time-range which is a perfectly normal ting to do.

    Calling the method 'getBaseComponents' will return an empty array due to this statement: if (isset($component->{'RECURRENCE-ID'})) continue;

    If the above statement is commented out everything works as expected.

    bug version-3.x 
    opened by mir07 22
  • Fix possible infinite loop in RRuleIterator.php

    Fix possible infinite loop in RRuleIterator.php

    When the RRule FREQ is YEARLY and it uses BYYEARDAY only, an infinite loop could occur. $this->currentDate may be an DateTimeImmutable, so a reassignment is necessary.

    opened by mvdnes 19
  • vobject does not handle UTF-8 file with BOM

    vobject does not handle UTF-8 file with BOM

    I have a UTF-8 vcf-file which vobject appears unable to handle. vobject will flat out not recognize the file. The problem appears to be the Initial Byte Order Mark. http://en.wikipedia.org/wiki/Byte_order_mark. Removing the BOM enables vobject to parse the file.

    Seeing how I found an android utility which created this file, this is a real-world example.

    I have not found anything expressively prohibiting the use of a BOM in rfc 6350, but I'll admit to neither being a skilled reader of RFCs, nor a programmer. In any case, it does not appear to be a very hard thing to fix?

    bug 
    opened by dagbdagb 18
  • Reassign modified date in yearly rrule

    Reassign modified date in yearly rrule

    As the current date is immutable every modification needs a reassignment. If you use the following rrule, then the wile loop never ends because we always test with the same date and not the modified one. RRule to test:

    FREQ=YEARLY;COUNT=7;WKST=MO;BYDAY=MO;BYWEEKNO=13,15,50

    opened by laoneo 17
  • VCard Photo returns wrong valueType for some vCards

    VCard Photo returns wrong valueType for some vCards

    Discovered on Sabre/VObject 3.5.0 reproducible on Sabre/VObject 4.1.0

    PHP script to reproduce error:

    <?php
    
    include 'vendor/autoload.php';
    
    $data1 = "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG:http://example.org/photo.jpg\r\nEND:VCARD\r\n";
    $data2 = "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;MTIzNDU=\r\nEND:VCARD\r\n";
    
    $v1 = \Sabre\VObject\Reader::read($data1);
    $v2 = \Sabre\VObject\Reader::read($data2);
    
    echo "V1: " . $v1->PHOTO->getValueType();
    echo "\n-----------------\n";
    echo "V2: " . $v2->PHOTO->getValueType();
    

    results in ...

    V1: BINARY
    -----------------
    V2: URI
    

    expected ...

    V1: URI
    -----------------
    V2: BINARY
    
    question 
    opened by georgehrke 17
  • Multiple types for telephone

    Multiple types for telephone

    Is there an easy way to pull back multiple types for tel?

    Something like this, only pulls back the first:

    foreach($this->_vcard->TEL as $tel) { echo $tel['TYPE'] . ' : ' . $tel . "\n"; }

    If I var dump the object $tel, I can see them in parameters?

    Thanks Tom

    question 
    opened by tholder 17
  • Trim whitespaces from the value of the property, except the description

    Trim whitespaces from the value of the property, except the description

    Ical content from some event providers do contain white spaces after some properties like the DTSTAMP field. This is not valid ical content, but can be easily solved by trimming white spaces from the value of the property. It makes VObject more robust.

    invalid question 
    opened by laoneo 16
  • non-passthrough of double quotes

    non-passthrough of double quotes

    Hi,

    parsing an iCalendar file then serialising it gives me a diff. Among other things, double-quotes are now prefixed with a backslash because the incoming “"” is handled as backslash plus double-quote, instead of escaped double-quote (which is what KDE Kontact wrote):

    -DESCRIPTION:innerer•text\ngeht yber\n\nmehrere•zeilen\n\nab dem 
    - 10.09. 6x jede woche bis auf 17.09. also noch 24.09. und 01.10. und 
    - 08.10. und 15.10.\n\nescaping: ' \" \\ \; \, : & < > !\n\nund mit 
    - modifikation.
    +DESCRIPTION:innerer•text\ngeht yber\n\nmehrere•zeilen\n\nab dem 10.09. 
    + 6x jede woche bis auf 17.09. also noch 24.09. und 01.10. und 08.10. und 15
    + .10.\n\nescaping: ' \\" \\ \; \, : & < > !\n\nund mit modifikation.
    
    question version-3.x 
    opened by mirabilos 16
  • Property\Text should handle CHARSET encoding for VCARD v2.1

    Property\Text should handle CHARSET encoding for VCARD v2.1

    Now that we finally have a Property::getValue() (hooray) that returns the value in a datatype native to PHP without all the base64/quoted-printable encoding fuzz, I think it should also support (de)encoding according to its CHARSET parameter. Specifically MS outlook (and very likely others) usually uses the native system encoding and includes this in the CHARSET declaration only once special characters (outside of the standard ASCII range?) are included in the property value.

    Now that VObject v3 is right around the corner, I'd vote for including it before the feature freeze to avoid breaking the API once again.

    I'll see if I can contribute some patches, but I wanted to post this right away.

    enhancement 
    opened by clue 16
  • Fix unescaping of URIs in VCard4 and mime type of images in converter

    Fix unescaping of URIs in VCard4 and mime type of images in converter

    This PR fixes two issues encountered on a V4 VCard.

    1. RFC6350 allows escaping of semicolons in property values, but vobject did not unescape them in input. data URIs used for inline images in v4 VCard contain both semicolon and comma. When the semicolon is escaped (which is optional for the producer of the VCard), it must be unescaped by the consumer or the resulting URI will still contain the backslash and be malformed.
    2. Mime types are case insensitive (RFC2045). In the vcard converter in conversion from v4, the mime type is checked in a case sensitive manner and would thus fail to convert the mime type if it is not lowercase in the input. Changed the handling to treat this case-insensitive.

    Tests adapted / extended accordingly.

    opened by mstilkerich 2
  • RDATE PERIOD with TZID doesn't seem to be recognised

    RDATE PERIOD with TZID doesn't seem to be recognised

    Hello,

    For the AntennaPod project we're dynamically generating an ics file based on the events created on our website (https://github.com/AntennaPod/antennapod.github.io/pull/192). The ics file contains the following line: RDATE;VALUE=PERIOD;TZID=Europe/Brussels:20221022T160000/20221022T170000.

    When adding this to my Nextcloud calendar app as read-only calendar ('new subscription via link'), I get an error and the log shows this:

    [webdav] Fout: Sabre\VObject\InvalidDataException: The supplied iCalendar datetime value is incorrect: 20221022T160000/20221022T170000 at <<closure>>
    
     0. /var/www/html/3rdparty/sabre/vobject/lib/DateTimeParser.php line 205
        Sabre\VObject\DateTimeParser::parseDateTime("20221022T160000/20221022T170000", DateTimeZone {})
     1. /var/www/html/3rdparty/sabre/vobject/lib/Recur/RDateIterator.php line 99
        Sabre\VObject\DateTimeParser::parse("20221022T160000/20221022T170000", DateTimeZone {})
     2. /var/www/html/3rdparty/sabre/vobject/lib/Recur/EventIterator.php line 362
        Sabre\VObject\Recur\RDateIterator->next()
     3. /var/www/html/3rdparty/sabre/vobject/lib/Recur/EventIterator.php line 335
        Sabre\VObject\Recur\EventIterator->next()
     4. /var/www/html/3rdparty/sabre/vobject/lib/Recur/EventIterator.php line 190
        Sabre\VObject\Recur\EventIterator->rewind()
     5. /var/www/html/apps/dav/lib/CalDAV/CalDavBackend.php line 2763
        Sabre\VObject\Recur\EventIterator->__construct([Sabre\VObject\C ... }])
     6. /var/www/html/apps/dav/lib/CalDAV/CalDavBackend.php line 1220
        OCA\DAV\CalDAV\CalDavBackend->getDenormalizedData("BEGIN:VCALENDAR ... n")
     7. /var/www/html/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php line 132
        OCA\DAV\CalDAV\CalDavBackend->createCalendarObject(4, "d1cdc89d-ca91-4 ... s", "BEGIN:VCALENDAR ... n", 1)
    

    I'm wondering: why might this particular line throw an error? It seems to me based on the main error message that the VALUE=PERIOD (which is in the specs) might not be recognised. Would that be possible?

    (Also reported here: https://github.com/nextcloud/calendar/issues/4772)

    Many thanks in advance. And apologies if I'm at the wrong address here.

    opened by keunes 0
  •  Invalid vCard date-time string

    Invalid vCard date-time string

    DateTimeParser.php

    Replace Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) Into Z | (?: \+|-)(?: [0-9]{2}:?[0-9]{2})

    Because some timezone entries are without the :

    opened by the-djmaze 2
  • Type declarations to increase phpstan to level 6

    Type declarations to increase phpstan to level 6

    1. Bump dependencies in composer.json

    2. Bump phpstan to level 6

    3. WIP - fixup type declarations (test code)

    4. ToDo - fixup type declarations (real code)

    opened by phil-davis 3
  • Text Property `strtr(): Argument #1 ($string) must be of type string, array given`

    Text Property `strtr(): Argument #1 ($string) must be of type string, array given`

    KDE KAddressBook has <x-crypto><allowed> to select which kind of email encryptions are allowed for the contact.

    <?xml version=3D"1.0" encoding=3D"UTF-8" standalone=3D"no" ?>
    <vcards xmlns=3D"urn:ietf:params:xml:ns:vcard-4.0">
      <vcard>
        <x-crypto>
          <allowed>
            <text>PGP/INLINE</text>
            <text>PGP/MIME</text>
            <text>S/MIME</text>
            <text>S/MIMEOpaque</text>
          </allowed>
          <signpref>
            <text>Never</text>
          </signpref>
          <encryptpref>
            <text>Always</text>
          </encryptpref>
        </x-crypto>
      </vcard>
    </vcards>
    

    When VCard->validate() is called, Sabre\VObject\Property\Text::getRawMimeDirValue() throws warning: strtr(): Argument #1 ($string) must be of type string, array given

    https://github.com/sabre-io/vobject/blob/49dbd1bacba784025cc012fd7d908dd87a725914/lib/Property/Text.php#L142 Has an issue because $subItem is an array:

    $item = array (
      0 => 
      array (
        'name' => '{urn:ietf:params:xml:ns:vcard-4.0}text',
        'value' => 'PGP/INLINE',
        'attributes' => 
        array (
        ),
      ),
      1 => 
      array (
        'name' => '{urn:ietf:params:xml:ns:vcard-4.0}text',
        'value' => 'PGP/MIME',
        'attributes' => 
        array (
        ),
      ),
      2 => 
      array (
        'name' => '{urn:ietf:params:xml:ns:vcard-4.0}text',
        'value' => 'S/MIME',
        'attributes' => 
        array (
        ),
      ),
      3 => 
      array (
        'name' => '{urn:ietf:params:xml:ns:vcard-4.0}text',
        'value' => 'S/MIMEOpaque',
        'attributes' => 
        array (
        ),
      ),
    )
    

    VObject parsed structure in PHP:

                [X-CRYPTO] => Array
                    (
                        [0] => Sabre\VObject\Property\Unknown Object
                            (
                                [delimiter] => ,
                                [structuredValues:protected] => Array
                                    (
                                        [0] => N
                                        [1] => ADR
                                        [2] => ORG
                                        [3] => GENDER
                                        [4] => CLIENTPIDMAP
                                        [5] => REQUEST-STATUS
                                    )
    
                                [minimumPropertyValues:protected] => Array
                                    (
                                        [N] => 5
                                        [ADR] => 7
                                    )
    
                                [name] => X-CRYPTO
                                [group] => 
                                [parameters] => Array
                                    (
                                    )
    
                                [value:protected] => Array
                                    (
                                        [0] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [name] => {urn:ietf:params:xml:ns:vcard-4.0}text
                                                        [value] => PGP/INLINE
                                                        [attributes] => Array
                                                            (
                                                            )
    
                                                    )
    
                                                [1] => Array
                                                    (
                                                        [name] => {urn:ietf:params:xml:ns:vcard-4.0}text
                                                        [value] => PGP/MIME
                                                        [attributes] => Array
                                                            (
                                                            )
    
                                                    )
    
                                                [2] => Array
                                                    (
                                                        [name] => {urn:ietf:params:xml:ns:vcard-4.0}text
                                                        [value] => S/MIME
                                                        [attributes] => Array
                                                            (
                                                            )
    
                                                    )
    
                                                [3] => Array
                                                    (
                                                        [name] => {urn:ietf:params:xml:ns:vcard-4.0}text
                                                        [value] => S/MIMEOpaque
                                                        [attributes] => Array
                                                            (
                                                            )
    
                                                    )
    
                                            )
    
                                        [1] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [name] => {urn:ietf:params:xml:ns:vcard-4.0}text
                                                        [value] => Never
                                                        [attributes] => Array
                                                            (
                                                            )
    
                                                    )
    
                                            )
    
                                        [2] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [name] => {urn:ietf:params:xml:ns:vcard-4.0}text
                                                        [value] => Always
                                                        [attributes] => Array
                                                            (
                                                            )
    
                                                    )
    
                                            )
    
                                    )
    
    opened by the-djmaze 2
  • Release major version 5

    Release major version 5

    which will support PHP 7.4 8.0 8.1 8.2 and have type declarations on parameters and return values etc as far as possible with features available in PHP 7.4.

    If possible, increase the phpstan level to 6. That requires adding a lot of parameters and return type detail in PHPdoc (specially of the shape of arrays. When I do this locally, I get a longggg list of things reported. So it might take a while to sort all that out! I will try adjusting a few things and then report how it goes, and how big a job it seems.

    opened by phil-davis 0
Releases(4.5.1)
  • 4.5.1(Oct 9, 2022)

  • 4.5.0(Aug 17, 2022)

    4.5.0 (2022-08-17)

    • #579: Update .gitattributes (@cedric-anne)
    • #561: PHP 8.1 deprecated support for null values in its APIs (@mstilkerich)
    • #571: Fully ignore invalid lines (@heiglandreas)
    • #564: Fix infinite loop caused by yearly with bySetPos (@liurxliu)
    • #567: Endless loop problem in RRuleIterator::nextDaily (@KristofferFM)
    • #466: Add support for MEMBER in a VCard (@sash04ek)
    • #559: Handle Vobjects without closing tag (@sash04ek)
    • #582: Fix bug in by year day (@KAYLukas)
    Source code(tar.gz)
    Source code(zip)
  • 4.4.3(Jul 15, 2022)

  • 4.4.2(Jun 24, 2022)

    4.4.2 (2022-06-24)

    • #565: lowercase mailto:-addresses in getNormalizedValue() (@pk1234)
    • #568: Add NICKNAME fallback for VCards without FNs (@Evengard)
    • #573: Component/select: Before uppercasing $child->group, make sure it isn't null (@algernon)
    • #575: Fix encoding detection on PHP 8.1 (@come-nc)
    Source code(tar.gz)
    Source code(zip)
  • 4.4.1(Dec 7, 2021)

  • 4.4.0(Nov 16, 2021)

  • 4.3.8(Nov 14, 2021)

    4.3.8 (2021-11-14)

    • #538 fix EventIterator returns wrong end endTime (@floerke)
    • #541 Reordering of the attendees is not a significant change (@floerke)
    • #543 Reordering of vevent is not a significant change (@floerke)
    Source code(tar.gz)
    Source code(zip)
  • 4.3.7(Nov 4, 2021)

  • 4.3.6(Nov 4, 2021)

  • 4.3.5(Feb 12, 2021)

    4.3.5 (2021-02-12)

    • #523: Fix setting properties with group assignment (@mstilkerich)
    • #532: Make use of until parameter in nextMonthly function (@jaircuevajunior)
    Source code(tar.gz)
    Source code(zip)
  • 4.3.4(Feb 4, 2021)

  • 4.3.3(Nov 9, 2020)

  • 4.3.2(Oct 3, 2020)

  • 4.3.1(Jul 13, 2020)

    4.3.1 (2020-07-13)

    • #510: Fix an incomplete phpdoc type annotation (@mstilkerich)
    • #505: Refactor unit test code for phpunit9 (@phil-davis)
    • #500: Standardize CI (@phil-davis)
    • #496: CI tooling changes (@JeroenVanOort)
    Source code(tar.gz)
    Source code(zip)
  • 4.3.0(Jan 31, 2020)

    4.3.0 (2020-01-31)

    • Added support for PHP 7.4, dropped support for PHP 7.0 (@phil-davis)
    • #487: Added phpstan coverage, updated testsuite for phpunit8 (@phil-davis, @JeroenVanOort)
    • #495: refactored maps to use ::class notation (@JeroenVanOort)
    Source code(tar.gz)
    Source code(zip)
  • 4.2.2(Jan 14, 2020)

  • 4.2.1(Dec 18, 2019)

    4.2.1 (2019-12-18)

    • #469, #451: fix compat with php 7.4
    • #443: prevent running in indefinte loop
    • #449: Preventing creating a component for a root document
    • #450: Fix parse with option Forgiving with trailing equal
    • #459: fixed typo in VCalendar which resulting in usage of the wrong TimeZone
    • #462: Broker::parseEventForOrganizer copies DTSTAMP from $eventInfo that causes broken scheduling
    Source code(tar.gz)
    Source code(zip)
  • 4.2.0(Feb 19, 2019)

    4.2.0 (2019-02-19)

    • #432: DTSTAMP must be specified in UTC
    • #435: ORGANIZER e-mail address are case-insensitive
    • #441: Repairing BASE64 encoded vCard version 3
    Source code(tar.gz)
    Source code(zip)
  • 4.2.0-alpha1(Sep 26, 2018)

  • 4.1.6(Apr 20, 2018)

    • #406, #407, #408, #409: Another round of performance improvements in serialization of properties (@gharlan, @staabm)
    • #410: Fixes in iTip for handling BYDAY=SA,SO (@gharlan)
    • #381: Fixes in iTip handling of SCHEDULE-FORCE-SEND (@alecpl)
    Source code(tar.gz)
    Source code(zip)
  • 4.1.5(Mar 8, 2018)

  • 4.1.4(Dec 22, 2017)

    • #383: Fix possible infinite loop in RRuleIterator, when the RRule FREQ is YEARLY and it uses BYYEARDAY only (@mvdnes).
    • #392: Improved significant change detection. This should reduce the number of unneeded update emails in scheduling systems. (@alecpl).
    • #395: Removed Canada/East-Saskatchewan timezone, as it got removed from PHP as well. (@remicollet).
    Source code(tar.gz)
    Source code(zip)
  • 4.1.3(Oct 18, 2017)

    • #363: Repair script and de-duplicate properties that are only allowed once, but appear more than once. (@ddolcimascolo).
    • #377: Addes Pacific Time (US & Canada) as exchange timezone
    • #384: Added fallback for VCards without FN
    Source code(tar.gz)
    Source code(zip)
  • 4.1.2(Dec 6, 2016)

    • #340: Support for BYYEARDAY recurrence when FREQ=YEARLY. (@PHPGangsta)
    • #341: Support for BYWEEKNO recurrence when FREQ=YEARLY. (@PHPGangsta)
    • Updated to the latest windows timezone data mappings.
    • #344: Auto-detecting more Outlook 365-generated timezone identifiers. (@jpirkey)
    • #348: FreeBusyGenerator can now accept streams.
    • Support sabre/xml 1.5 and 2.0.
    • #355: Support DateTimeInterface in more places where only DateTime was supported. (@gharlan).
    • #351: Fixing an inclusive/exclusive problem with isInTimeRange and fastForward with all-day events. (@strokyl, thanks you are brilliant).
    Source code(tar.gz)
    Source code(zip)
  • 3.5.3(Oct 7, 2016)

  • 4.1.1(Jul 15, 2016)

    • #327: Throwing InvalidDataException in more cases where invalid iCalendar dates and times were provided. (@rsto)
    • #331: Fix dealing with multiple overridden instances falling on the same date/time (@afedyk-sugarcrm).
    • #333: Fix endless loop on invalid BYMONTH values in recurrence. (@PHPGangsta)
    • #339: Fixed a few validate() results when repair is off. (@PHPGangsta)
    • #338: Stripping invalid BYMONTH= rules during validate() (@PHPGangsta)
    • #336: Fix incorrect BYSECOND= validation. (@PHPGangsta)
    Source code(tar.gz)
    Source code(zip)
  • 3.5.2(Jul 15, 2016)

  • 4.1.0(Apr 7, 2016)

    • #309: When expanding recurring events, the first event should also have a RECURRENCE-ID property.
    • #306: iTip REPLYs to the first instance of a recurring event was not handled correctly.
    • Slightly better error message during validation of N and ADR properties.
    • #312: Correctly extracing timezone in the iTip broker, even when we don't have a master event. (@vkomrakov-sugar).
    • When validating a component's property that must appear once and which could automatically be repaired, make sure we report the change as 'repaired'.
    • Added a PHPUnitAssertions trait. This trait makes it easy to compare two vcards or iCalendar objects semantically.
    • Better error message when parsing objects with an invalid VALUE parameter.
    Source code(tar.gz)
    Source code(zip)
  • 3.5.1(Apr 7, 2016)

    • #309: When expanding recurring events, the first event should also have a RECURRENCE-ID property.
    • #306: iTip REPLYs to the first instance of a recurring event was not handled correctly.
    Source code(tar.gz)
    Source code(zip)
  • 4.0.3(Mar 12, 2016)

    • #300: Added VCard::getByType() to quickly get a property with a specific TYPE parameter. (@kbond)
    • #302: UNTIL was not encoded correctly when converting to jCal. (@GrahamLinagora)
    • #303: COUNT is now encoded as an int in jCal instead of a string. (@strokyl)
    • #295: RRULE now has more validation and repair rules.
    Source code(tar.gz)
    Source code(zip)
Allows generate class files parse from json and map json to php object, including multi-level and complex objects;

nixihz/php-object Allows generate class files parse from json and map json to php object, including multi-level and complex objects; Installation You

zhixin 2 Sep 9, 2022
PHP Project - Export your profile to vCard file

KamVCard PHP v1.00 Easy to have your own vCard file, fill in the form and hit the "Export" button UPDATE : Now you can add your picture too ! Preview

Med Reda Kamal 3 Nov 6, 2022
A set of classes to create and manipulate HTML objects abstractions

HTMLObject HTMLObject is a set of classes to create and manipulate HTML objects abstractions. Static calls to the classes echo Element::p('text')->cla

Emma Fabre 128 Dec 22, 2022
PHP package to make your objects strict and throw exception when you try to access or set some undefined property in your objects.

?? Yell PHP package to make your objects strict and throw exception when you try to access or set some undefined property in your objects. Requirement

Zeeshan Ahmad 20 Dec 8, 2018
Deeper is a easy way to compare if 2 objects is equal based on values in these objects. This library is heavily inspired in Golang's reflect.DeepEqual().

Deeper Deeper is a easy way to compare if 2 objects is equal based on values in these objects. This library is heavily inspired in Golang's reflect.De

Joubert RedRat 4 Feb 12, 2022
Do you want CronJob to follow the solar date?You need this package to solve this problem.

Shamsic Maybe it happened to you that you wanted to use CronJob in your project and you realized that you cannot manage the exact dates that are in th

Amin Ghaninia 5 Jul 19, 2022
Allows the date format for "created", "modified" and "published" columns to be set within a Lister.

Lister Native Date Format Allows the date format for "created", "modified" and "published" columns to be set within a Lister or Lister Pro instance. W

Robin Sallis 1 Jan 13, 2022
Creating data transfer objects with the power of php objects. No php attributes, no reflection api, and no other under the hook work.

Super Simple DTO Creating data transfer objects with the power of php objects. No php attributes, no reflection api, and no other under the hook work.

Mohammed Manssour 8 Jun 8, 2023
MOP is a php query handling and manipulation library providing easy and reliable way to manipulate query and get result in a fastest way

Mysql Optimizer mysql optimizer also known as MOP is a php query handling and manipulation library providing easy and reliable way to manipulate query

null 2 Nov 20, 2021
This package was created to provide simple way to manipulate arrays in PHP

PHP Collections This package was created to provide simple way to manipulate arrays in PHP. The package was inspired by the Laravel Collections.

Wojciech Mleczek 13 Jul 26, 2021
This component, based on the Symfony serializer and async-aws, is a human-readable and quick abstraction to easily store serialized objects in DynamoDB 🚀.

DynamoDB Storable This component, based on the Symfony serializer and async-aws, is a human-readable and quick abstraction to easily store serialized

Matthieu W. 2 Jun 19, 2022
A Symfony Feature Flag Bundle which easily allows you to configure and use your favorite feature flag provider.

Metro Markets FF Metro Markets FF is a Feature Flag Symfony Bundle. It easily allows you to configure and use your favorite feature flag provider. Ins

METRO Markets 14 May 23, 2022
Dobren Dragojević 6 Jun 11, 2023
This is an experiment to export all RFCs from the PHP wiki into Git, including the change history for each RFC (along with the date and author of each change). This is not meant to replace the wiki.

PHP Requests for Comments (RFCs) About This repository is an experiment to export all RFCs from the PHP wiki into Git, including the change history fo

Ben Ramsey 34 Jun 20, 2022
Keep your website up to date.

Deutsch English Svenska Update 0.8.88 Keep your website up to date. How to add extensions You can download extensions as ZIP files and copy them into

Anna 1 Oct 9, 2022
Parse your humble choice / monthly data and compile a CSV list for better overview

humbleparser Parse your humble choice / monthly data and compile a CSV list for better overview Requirements PHP CLI (>= 7.4)) php-curl Note I have ne

null 1 May 4, 2022
Talkino allows you to integrate multi social messengers and contact into your website and enable your users to contact you using multi social messengers' accounts.

Talkino Welcome to our GitHub Repository Talkino is a click to chat plugin to show your agents’ multiple social messengers, phone and emails on the ch

Traxconn 2 Sep 21, 2022
A bunch of general-purpose value objects you can use in your Laravel application.

Laravel Value Objects A bunch of general-purpose value objects you can use in your Laravel application. The package requires PHP ^8.0 and Laravel ^9.7

Michael Rubél 136 Jan 4, 2023