Skip to content

Commit cce628f

Browse files
committed
Handle natural serialization of DateInterval
1 parent 9526f7c commit cce628f

File tree

1 file changed

+39
-5
lines changed

1 file changed

+39
-5
lines changed

src/Jms/Handler/XmlSchemaDateHandler.php

+39-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<?php
2-
32
namespace GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler;
43

54
use JMS\Serializer\Context;
@@ -59,6 +58,12 @@ public static function getSubscribingMethods()
5958
'format' => 'xml',
6059
'method' => 'deserializeDateIntervalXml',
6160
),
61+
array(
62+
'type' => 'DateInterval',
63+
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
64+
'format' => 'xml',
65+
'method' => 'serializeDateInterval',
66+
),
6267
);
6368
}
6469

@@ -68,10 +73,9 @@ public function __construct($defaultTimezone = 'UTC')
6873

6974
}
7075

71-
public function deserializeDateIntervalXml(XmlDeserializationVisitor $visitor, $data, array $type)
72-
{
76+
public function deserializeDateIntervalXml(XmlDeserializationVisitor $visitor, $data, array $type){
7377
$attributes = $data->attributes('xsi', true);
74-
if (isset($attributes['nil'][0]) && (string)$attributes['nil'][0] === 'true') {
78+
if (isset($attributes['nil'][0]) && (string) $attributes['nil'][0] === 'true') {
7579
return null;
7680
}
7781

@@ -85,9 +89,39 @@ public function deserializeDateIntervalXml(XmlDeserializationVisitor $visitor, $
8589
return $dateInterval;
8690
}
8791

88-
public function serializeDate(XmlSerializationVisitor $visitor, \DateTime $date, array $type, Context $context)
92+
public function serializeDateInterval(XmlSerializationVisitor $visitor, \DateInterval $interval, array $type, Context $context)
8993
{
94+
$date = array_filter(array(
95+
'Y' => $interval->y,
96+
'M' => $interval->m,
97+
'D' => $interval->d
98+
));
99+
100+
// Reading all non-zero time parts.
101+
$time = array_filter(array(
102+
'H' => $interval->h,
103+
'M' => $interval->i,
104+
'S' => $interval->s
105+
));
106+
107+
$specString = 'P';
108+
109+
// Adding each part to the spec-string.
110+
foreach ($date as $key => $value) {
111+
$specString .= $value . $key;
112+
}
113+
if (count($time) > 0) {
114+
$specString .= 'T';
115+
foreach ($time as $key => $value) {
116+
$specString .= $value . $key;
117+
}
118+
}
90119

120+
return $visitor->visitSimpleString($specString, $type, $context);
121+
}
122+
123+
public function serializeDate(XmlSerializationVisitor $visitor, \DateTime $date, array $type, Context $context)
124+
{
91125
$v = $date->format('Y-m-d');
92126

93127
return $visitor->visitSimpleString($v, $type, $context);

0 commit comments

Comments
 (0)