getResponse(); if($response) { $response->addHeader("Content-Type", "text/xml"); } return "\n" . $this->convertDataObjectWithoutHeader($obj, $fields); } public function convertDataObjectWithoutHeader(DataObject $obj, $fields = null, $relations = null) { $className = $obj->class; $id = $obj->ID; $objHref = Director::absoluteURL($this->config()->api_base . "$obj->class/$obj->ID"); $xml = "<$className href=\"$objHref.xml\">\n"; foreach($this->getFieldsForObj($obj) as $fieldName => $fieldType) { // Field filtering if($fields && !in_array($fieldName, $fields)) { continue; } $fieldObject = $obj->obj($fieldName); $fieldValue = $fieldObject->forTemplate(); if(!mb_check_encoding($fieldValue, 'utf-8')) { $fieldValue = "(data is badly encoded)"; } if(is_object($fieldValue) && is_subclass_of($fieldValue, 'Object') && $fieldValue->hasMethod('toXML')) { $xml .= $fieldValue->toXML(); } else { if($fieldObject instanceof DBHTMLText) { // Escape HTML values using CDATA $fieldValue = sprintf('', str_replace(']]>', ']]]]>', $fieldValue)); } $xml .= "<$fieldName>$fieldValue\n"; } } if($this->relationDepth > 0) { foreach($obj->hasOne() as $relName => $relClass) { if(!singleton($relClass)->stat('api_access')) continue; // Field filtering if($fields && !in_array($relName, $fields)) continue; if($this->customRelations && !in_array($relName, $this->customRelations)) continue; $fieldName = $relName . 'ID'; if($obj->$fieldName) { $href = Director::absoluteURL($this->config()->api_base . "$relClass/" . $obj->$fieldName); } else { $href = Director::absoluteURL($this->config()->api_base . "$className/$id/$relName"); } $xml .= "<$relName linktype=\"has_one\" href=\"$href.xml\" id=\"" . $obj->$fieldName . "\">\n"; } foreach($obj->hasMany() as $relName => $relClass) { if(!singleton($relClass)->stat('api_access')) continue; // Field filtering if($fields && !in_array($relName, $fields)) continue; if($this->customRelations && !in_array($relName, $this->customRelations)) continue; $xml .= "<$relName linktype=\"has_many\" href=\"$objHref/$relName.xml\">\n"; $items = $obj->$relName(); if ($items) { foreach($items as $item) { $href = Director::absoluteURL($this->config()->api_base . "$relClass/$item->ID"); $xml .= "<$relClass href=\"$href.xml\" id=\"{$item->ID}\">\n"; } } $xml .= "\n"; } foreach($obj->manyMany() as $relName => $relClass) { if(!singleton($relClass)->stat('api_access')) continue; // Field filtering if($fields && !in_array($relName, $fields)) continue; if($this->customRelations && !in_array($relName, $this->customRelations)) continue; $xml .= "<$relName linktype=\"many_many\" href=\"$objHref/$relName.xml\">\n"; $items = $obj->$relName(); if ($items) { foreach($items as $item) { $href = Director::absoluteURL($this->config()->api_base . "$relClass/$item->ID"); $xml .= "<$relClass href=\"$href.xml\" id=\"{$item->ID}\">\n"; } } $xml .= "\n"; } } $xml .= ""; return $xml; } /** * Generate an XML representation of the given {@link SS_List}. * * @param SS_List $set * @param array $fields * @return String XML */ public function convertDataObjectSet(SS_List $set, $fields = null) { Controller::curr()->getResponse()->addHeader("Content-Type", "text/xml"); $className = get_class($set); $xml = "\n"; $xml .= (is_numeric($this->totalSize)) ? "<$className totalSize=\"{$this->totalSize}\">\n" : "<$className>\n"; foreach($set as $item) { $xml .= $this->convertDataObjectWithoutHeader($item, $fields); } $xml .= ""; return $xml; } public function convertStringToArray($strData) { return Convert::xml2array($strData); } }