2008-08-09 06:38:44 +02:00
|
|
|
<?php
|
2009-03-22 23:59:14 +01:00
|
|
|
/**
|
|
|
|
* @package sapphire
|
|
|
|
* @subpackage formatters
|
|
|
|
*/
|
2008-08-09 06:38:44 +02:00
|
|
|
class JSONDataFormatter extends DataFormatter {
|
|
|
|
/**
|
|
|
|
* @todo pass this from the API to the data formatter somehow
|
|
|
|
*/
|
|
|
|
static $api_base = "api/v1/";
|
|
|
|
|
2008-08-09 09:03:24 +02:00
|
|
|
protected $outputContentType = 'application/json';
|
|
|
|
|
2008-08-09 06:38:44 +02:00
|
|
|
public function supportedExtensions() {
|
2008-08-09 09:03:24 +02:00
|
|
|
return array(
|
|
|
|
'json',
|
|
|
|
'js'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function supportedMimeTypes() {
|
|
|
|
return array(
|
|
|
|
'application/json',
|
|
|
|
'text/x-json'
|
|
|
|
);
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generate an XML representation of the given {@link DataObject}.
|
|
|
|
*
|
|
|
|
* @param DataObject $obj
|
|
|
|
* @param $includeHeader Include <?xml ...?> header (Default: true)
|
|
|
|
* @return String XML
|
|
|
|
*/
|
2008-10-09 16:47:25 +02:00
|
|
|
public function convertDataObject(DataObjectInterface $obj, $fields = null, $relations = null) {
|
2008-08-09 06:38:44 +02:00
|
|
|
$className = $obj->class;
|
|
|
|
$id = $obj->ID;
|
|
|
|
|
2010-02-25 01:00:24 +01:00
|
|
|
$json = "{\n \"className\" : \"$className\",\n";
|
2008-08-09 08:40:50 +02:00
|
|
|
foreach($this->getFieldsForObj($obj) as $fieldName => $fieldType) {
|
2008-09-16 14:10:58 +02:00
|
|
|
// Field filtering
|
|
|
|
if($fields && !in_array($fieldName, $fields)) continue;
|
|
|
|
|
2008-08-09 08:53:26 +02:00
|
|
|
$fieldValue = $obj->$fieldName;
|
|
|
|
if(is_object($fieldValue) && is_subclass_of($fieldValue, 'Object') && $fieldValue->hasMethod('toJSON')) {
|
2010-02-25 01:00:24 +01:00
|
|
|
$jsonParts[] = "\"$fieldName\" : " . $fieldValue->toJSON();
|
2008-08-09 06:38:44 +02:00
|
|
|
} else {
|
2010-02-25 01:00:24 +01:00
|
|
|
$jsonParts[] = "\"$fieldName\" : " . Convert::raw2json($fieldValue);
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-09 07:57:44 +02:00
|
|
|
if($this->relationDepth > 0) {
|
|
|
|
foreach($obj->has_one() as $relName => $relClass) {
|
2009-05-29 03:04:40 +02:00
|
|
|
if(!singleton($relClass)->stat('api_access')) continue;
|
|
|
|
|
2008-09-16 14:10:58 +02:00
|
|
|
// Field filtering
|
|
|
|
if($fields && !in_array($relName, $fields)) continue;
|
2008-10-09 16:47:25 +02:00
|
|
|
if($this->customRelations && !in_array($relName, $this->customRelations)) continue;
|
2008-09-16 14:10:58 +02:00
|
|
|
|
2008-08-09 07:57:44 +02:00
|
|
|
$fieldName = $relName . 'ID';
|
|
|
|
if($obj->$fieldName) {
|
|
|
|
$href = Director::absoluteURL(self::$api_base . "$relClass/" . $obj->$fieldName);
|
|
|
|
} else {
|
|
|
|
$href = Director::absoluteURL(self::$api_base . "$className/$id/$relName");
|
|
|
|
}
|
2010-02-25 01:00:24 +01:00
|
|
|
$jsonParts[] = "$relName : { \"className\" : \"$relClass\", \"href\" : \"$href.json\", \"id\" : \"{$obj->$fieldName}\" }";
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|
2008-08-09 07:57:44 +02:00
|
|
|
|
|
|
|
foreach($obj->has_many() as $relName => $relClass) {
|
2009-05-29 03:04:40 +02:00
|
|
|
if(!singleton($relClass)->stat('api_access')) continue;
|
|
|
|
|
2008-09-16 14:10:58 +02:00
|
|
|
// Field filtering
|
|
|
|
if($fields && !in_array($relName, $fields)) continue;
|
2008-10-09 16:47:25 +02:00
|
|
|
if($this->customRelations && !in_array($relName, $this->customRelations)) continue;
|
2008-09-16 14:10:58 +02:00
|
|
|
|
2008-08-09 07:57:44 +02:00
|
|
|
$jsonInnerParts = array();
|
|
|
|
$items = $obj->$relName();
|
|
|
|
foreach($items as $item) {
|
|
|
|
//$href = Director::absoluteURL(self::$api_base . "$className/$id/$relName/$item->ID");
|
|
|
|
$href = Director::absoluteURL(self::$api_base . "$relClass/$item->ID");
|
2010-02-25 01:00:24 +01:00
|
|
|
$jsonInnerParts[] = "{ \"className\" : \"$relClass\", \"href\" : \"$href.json\", \"id\" : \"{$obj->$fieldName}\" }";
|
2008-08-09 07:57:44 +02:00
|
|
|
}
|
|
|
|
$jsonParts[] = "$relName : [\n " . implode(",\n ", $jsonInnerParts) . " \n ]";
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|
2008-08-09 07:57:44 +02:00
|
|
|
|
|
|
|
foreach($obj->many_many() as $relName => $relClass) {
|
2009-05-29 03:04:40 +02:00
|
|
|
if(!singleton($relClass)->stat('api_access')) continue;
|
|
|
|
|
2008-09-16 14:10:58 +02:00
|
|
|
// Field filtering
|
|
|
|
if($fields && !in_array($relName, $fields)) continue;
|
2008-10-09 16:47:25 +02:00
|
|
|
if($this->customRelations && !in_array($relName, $this->customRelations)) continue;
|
2008-09-16 14:10:58 +02:00
|
|
|
|
2008-08-09 07:57:44 +02:00
|
|
|
$jsonInnerParts = array();
|
|
|
|
$items = $obj->$relName();
|
|
|
|
foreach($items as $item) {
|
|
|
|
//$href = Director::absoluteURL(self::$api_base . "$className/$id/$relName/$item->ID");
|
|
|
|
$href = Director::absoluteURL(self::$api_base . "$relClass/$item->ID");
|
2010-02-25 01:00:24 +01:00
|
|
|
$jsonInnerParts[] = " { \"className\" : \"$relClass\", \"href\" : \"$href.json\", \"id\" : \"{$obj->$fieldName}\" }";
|
2008-08-09 07:57:44 +02:00
|
|
|
}
|
|
|
|
$jsonParts[] = "$relName : [\n " . implode(",\n ", $jsonInnerParts) . "\n ]";
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return "{\n " . implode(",\n ", $jsonParts) . "\n}"; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generate an XML representation of the given {@link DataObjectSet}.
|
|
|
|
*
|
|
|
|
* @param DataObjectSet $set
|
|
|
|
* @return String XML
|
|
|
|
*/
|
2008-09-16 14:10:58 +02:00
|
|
|
public function convertDataObjectSet(DataObjectSet $set, $fields = null) {
|
2008-08-09 06:38:44 +02:00
|
|
|
$jsonParts = array();
|
|
|
|
foreach($set as $item) {
|
2008-09-16 14:10:58 +02:00
|
|
|
if($item->canView()) $jsonParts[] = $this->convertDataObject($item, $fields);
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|
2008-08-11 02:03:57 +02:00
|
|
|
$json = "{\n";
|
2010-10-13 03:10:53 +02:00
|
|
|
$json .= '"totalSize": ';
|
2008-08-11 02:03:57 +02:00
|
|
|
$json .= (is_numeric($this->totalSize)) ? $this->totalSize : 'null';
|
|
|
|
$json .= ",\n";
|
2010-02-25 01:00:24 +01:00
|
|
|
$json .= "\"items\": [\n" . implode(",\n", $jsonParts) . "\n]\n";
|
2008-08-11 02:03:57 +02:00
|
|
|
$json .= "}\n";
|
|
|
|
|
|
|
|
return $json;
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|
2008-08-09 09:03:24 +02:00
|
|
|
|
|
|
|
public function convertStringToArray($strData) {
|
|
|
|
return Convert::json2array($strData);
|
|
|
|
}
|
|
|
|
|
2008-08-09 06:38:44 +02:00
|
|
|
}
|