diff --git a/api/JSONDataFormatter.php b/api/JSONDataFormatter.php index eb2eed9d3..bbc54119d 100644 --- a/api/JSONDataFormatter.php +++ b/api/JSONDataFormatter.php @@ -56,7 +56,7 @@ class JSONDataFormatter extends DataFormatter { // Field filtering if($fields && !in_array($fieldName, $fields)) continue; - $fieldValue = $obj->$fieldName; + $fieldValue = $obj->obj($fieldName)->forTemplate(); $serobj->$fieldName = $fieldValue; } diff --git a/api/XMLDataFormatter.php b/api/XMLDataFormatter.php index 1b6a338aa..29584613d 100644 --- a/api/XMLDataFormatter.php +++ b/api/XMLDataFormatter.php @@ -49,8 +49,7 @@ class XMLDataFormatter extends DataFormatter { foreach($this->getFieldsForObj($obj) as $fieldName => $fieldType) { // Field filtering if($fields && !in_array($fieldName, $fields)) continue; - - $fieldValue = $obj->$fieldName; + $fieldValue = $obj->obj($fieldName)->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')) { diff --git a/tests/api/XMLDataFormatterTest.php b/tests/api/XMLDataFormatterTest.php index 4aa8329de..098115fb6 100644 --- a/tests/api/XMLDataFormatterTest.php +++ b/tests/api/XMLDataFormatterTest.php @@ -28,6 +28,35 @@ class XMLDataFormatterTest extends SapphireTest { ); } + public function testShortcodesInDataObject() { + $formatter = new XMLDataFormatter(); + + $page1 = new Page(); + $page1->Title = 'Test page1'; + $page1->Content = '[sitetree_link,id=-1]'; + $page1->write(); + + $page2 = new Page(); + $page2->Title = 'Test page 2'; + $page2->Content = 'This is some test content [sitetree_link,id='.$page1->ID.']'; + $page2->write(); + + $page1->Content = '[bad_code,id=1]'; + $page1->write(); + + $xml = new SimpleXMLElement('' . $formatter->convertDataObjectWithoutHeader($page2)); + $this->assertContains('This is some test content '.$page1->Link(), $xml->Content); + + $xml = new SimpleXMLElement('' . $formatter->convertDataObjectWithoutHeader($page1)); + $this->assertEmpty('', $xml->Content); + + $xml = new SimpleXMLElement('' . $formatter->convertDataObjectWithoutHeader($page1)); + $this->assertContains('[bad_code,id=1]', $xml->Content); + + $page1->delete(); + $page2->delete(); + } + } class XMLDataFormatterTest_DataObject extends DataObject implements TestOnly {