value syntax, in which case * properties will automatically be created, or you can just pass a list of * Component and Property object. * * By default, a set of sensible values will be added to the component. For * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To * ensure that this does not happen, set $defaults to false. * * @param string $name * @param array $children * @param bool $defaults * * @return Component */ function createComponent($name, array $children = null, $defaults = true) { $name = strtoupper($name); $class = 'Sabre\\VObject\\Component'; if (isset(static::$componentMap[$name])) { $class = static::$componentMap[$name]; } if (is_null($children)) $children = []; return new $class($this, $name, $children, $defaults); } /** * Factory method for creating new properties. * * This method automatically searches for the correct property class, based * on its name. * * You can specify the parameters either in key=>value syntax, in which case * parameters will automatically be created, or you can just pass a list of * Parameter objects. * * @param string $name * @param mixed $value * @param array $parameters * @param string $valueType Force a specific valuetype, such as URI or TEXT * * @return Property */ function createProperty($name, $value = null, array $parameters = null, $valueType = null) { // If there's a . in the name, it means it's prefixed by a groupname. if (($i = strpos($name, '.')) !== false) { $group = substr($name, 0, $i); $name = strtoupper(substr($name, $i + 1)); } else { $name = strtoupper($name); $group = null; } $class = null; if ($valueType) { // The valueType argument comes first to figure out the correct // class. $class = $this->getClassNameForPropertyValue($valueType); } if (is_null($class)) { // If a VALUE parameter is supplied, we should use that. if (isset($parameters['VALUE'])) { $class = $this->getClassNameForPropertyValue($parameters['VALUE']); if (is_null($class)) { throw new InvalidDataException('Unsupported VALUE parameter for ' . $name . ' property. You supplied "' . $parameters['VALUE'] . '"'); } } else { $class = $this->getClassNameForPropertyName($name); } } if (is_null($parameters)) $parameters = []; return new $class($this, $name, $value, $parameters, $group); } /** * This method returns a full class-name for a value parameter. * * For instance, DTSTART may have VALUE=DATE. In that case we will look in * our valueMap table and return the appropriate class name. * * This method returns null if we don't have a specialized class. * * @param string $valueParam * @return string|null */ function getClassNameForPropertyValue($valueParam) { $valueParam = strtoupper($valueParam); if (isset(static::$valueMap[$valueParam])) { return static::$valueMap[$valueParam]; } } /** * Returns the default class for a property name. * * @param string $propertyName * * @return string */ function getClassNameForPropertyName($propertyName) { if (isset(static::$propertyMap[$propertyName])) { return static::$propertyMap[$propertyName]; } else { return 'Sabre\\VObject\\Property\\Unknown'; } } }