/**
* Update the specified attribute.
*
* @param string $name The name of the the
* attribute to be updated.
* @param array $attributes The data array that holds
* all attribute values.
* @param DOMNode $parent_node The parent node of the
* node that should be
* updated.
* @param Horde_Kolab_Format_Xml_Helper $helper A XML helper instance.
* @param array $params Additional parameters
* for this write operation.
*
* @return DOMNode|boolean The new/updated child node or false if this
* failed.
*
* @throws Horde_Kolab_Format_Exception If converting the data to XML failed.
*/
public function save($name, $attributes, $parent_node, Horde_Kolab_Format_Xml_Helper $helper, $params = array())
{
$children = $helper->findNodesRelativeTo('./' . $name, $parent_node);
if (!isset($attributes[$name])) {
if ($children->length == 0) {
if ($this->value == Horde_Kolab_Format_Xml::VALUE_MAYBE_MISSING || $this->value == Horde_Kolab_Format_Xml::VALUE_NOT_EMPTY && $this->isRelaxed($params)) {
return false;
}
} else {
if ($this->value == Horde_Kolab_Format_Xml::VALUE_MAYBE_MISSING) {
/** Client indicates that the value should get removed */
$helper->removeNodes($parent_node, $name);
return false;
} else {
return $children;
}
}
}
//@todo What is required to get around this overwriting of the old values?
$helper->removeNodes($parent_node, $name);
return $this->_writeMultiple($parent_node, $name, $this->generateWriteValue($name, $attributes, $params), $helper, $params);
}