Browse Source

Added visitSimpleString function into the XmlSerializationVisitor. This method always serializes data into a text node.
DateTimeHandler supports that newly added feature.

Miha Vrhovnik 11 năm trước cách đây
mục cha
commit
efffbe24a1

+ 11 - 1
src/JMS/Serializer/Handler/DateHandler.php

@@ -24,11 +24,13 @@ use JMS\Serializer\XmlDeserializationVisitor;
 use JMS\Serializer\Exception\RuntimeException;
 use JMS\Serializer\VisitorInterface;
 use JMS\Serializer\GraphNavigator;
+use JMS\Serializer\XmlSerializationVisitor;
 
 class DateHandler implements SubscribingHandlerInterface
 {
     private $defaultFormat;
     private $defaultTimezone;
+    private $xmlCData;
 
     public static function getSubscribingMethods()
     {
@@ -55,14 +57,18 @@ class DateHandler implements SubscribingHandlerInterface
         return $methods;
     }
 
-    public function __construct($defaultFormat = \DateTime::ISO8601, $defaultTimezone = 'UTC')
+    public function __construct($defaultFormat = \DateTime::ISO8601, $defaultTimezone = 'UTC', $xmlCData = true)
     {
         $this->defaultFormat = $defaultFormat;
         $this->defaultTimezone = new \DateTimeZone($defaultTimezone);
+        $this->xmlCData = $xmlCData;
     }
 
     public function serializeDateTime(VisitorInterface $visitor, \DateTime $date, array $type, Context $context)
     {
+        if ($visitor instanceof XmlSerializationVisitor && false === $this->xmlCData) {
+            return $visitor->visitSimpleString($date->format($this->getFormat($type)), $type, $context);
+        }
         return $visitor->visitString($date->format($this->getFormat($type)), $type, $context);
     }
 
@@ -70,6 +76,10 @@ class DateHandler implements SubscribingHandlerInterface
     {
         $iso8601DateIntervalString = $this->format($date);
 
+        if ($visitor instanceof XmlSerializationVisitor && false === $this->xmlCData) {
+            return $visitor->visitSimpleString($iso8601DateIntervalString, $type, $context);
+        }
+
         return $visitor->visitString($iso8601DateIntervalString, $type, $context);
     }
 

+ 12 - 0
src/JMS/Serializer/XmlSerializationVisitor.php

@@ -117,6 +117,18 @@ class XmlSerializationVisitor extends AbstractVisitor
         return $doCData ? $this->document->createCDATASection($data) : $this->document->createTextNode((string) $data);
     }
 
+    public function visitSimpleString($data, array $type, Context $context)
+    {
+        if (null === $this->document) {
+            $this->document = $this->createDocument(null, null, true);
+            $this->currentNode->appendChild($this->document->createTextNode((string) $data));
+
+            return;
+        }
+
+        return $this->document->createTextNode((string) $data);
+    }
+
     public function visitBoolean($data, array $type, Context $context)
     {
         if (null === $this->document) {

+ 19 - 0
tests/JMS/Serializer/Tests/Serializer/XmlSerializationTest.php

@@ -18,7 +18,11 @@
 
 namespace JMS\Serializer\Tests\Serializer;
 
+use JMS\Serializer\Construction\UnserializeObjectConstructor;
+use JMS\Serializer\Handler\DateHandler;
+use JMS\Serializer\Handler\HandlerRegistry;
 use JMS\Serializer\SerializationContext;
+use JMS\Serializer\Serializer;
 use JMS\Serializer\Tests\Fixtures\InvalidUsageOfXmlValue;
 use JMS\Serializer\Exception\InvalidArgumentException;
 use JMS\Serializer\Tests\Fixtures\PersonCollection;
@@ -141,6 +145,21 @@ class XmlSerializationTest extends BaseSerializationTest
         $this->assertEquals($this->getContent('array_key_values'), $this->serializer->serialize(new ObjectWithXmlKeyValuePairs(), 'xml'));
     }
 
+    /**
+     * @dataProvider getDateTime
+     * @group datetime
+     */
+    public function testDateTimeNoCData($key, $value, $type)
+    {
+        $handlerRegistry = new HandlerRegistry();
+        $handlerRegistry->registerSubscribingHandler(new DateHandler(\DateTime::ISO8601, 'UTC', false));
+        $objectConstructor = new UnserializeObjectConstructor();
+
+        $serializer = new Serializer($this->factory, $handlerRegistry, $objectConstructor, $this->serializationVisitors, $this->deserializationVisitors);
+
+        $this->assertEquals($this->getContent($key . '_no_cdata'), $serializer->serialize($value, $this->getFormat()));
+    }
+
     /**
      * @expectedException JMS\Serializer\Exception\RuntimeException
      * @expectedExceptionMessage Unsupported value type for XML attribute map. Expected array but got object

+ 2 - 0
tests/JMS/Serializer/Tests/Serializer/xml/date_time_no_cdata.xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<result>2011-08-30T00:00:00+0000</result>