Generator.php in Commerce Braintree 7
File
braintree_php/lib/Braintree/Xml/Generator.php
View source
<?php
class Braintree_Xml_Generator {
public static function arrayToXml($aData) {
$writer = new XMLWriter();
$writer
->openMemory();
$writer
->setIndent(true);
$writer
->setIndentString(' ');
$writer
->startDocument('1.0', 'UTF-8');
$aKeys = array_keys($aData);
$rootElementName = $aKeys[0];
$writer
->startElement(Braintree_Util::camelCaseToDelimiter($rootElementName));
self::_createElementsFromArray($writer, $aData[$rootElementName], $rootElementName);
$writer
->endElement();
$writer
->endDocument();
return $writer
->outputMemory();
}
private static function _createElementsFromArray(&$writer, $aData) {
if (!is_array($aData)) {
if (is_bool($aData)) {
$writer
->text($aData ? 'true' : 'false');
}
else {
$writer
->text($aData);
}
return;
}
foreach ($aData as $index => $element) {
$elementName = Braintree_Util::camelCaseToDelimiter($index, '-');
$writer
->startElement($elementName);
if (is_array($element)) {
if (array_key_exists(0, $element) || empty($element)) {
$writer
->writeAttribute('type', 'array');
foreach ($element as $ignored => $itemInArray) {
$writer
->startElement('item');
self::_createElementsFromArray($writer, $itemInArray);
$writer
->endElement();
}
}
else {
self::_createElementsFromArray($writer, $element);
}
}
else {
$attribute = self::_generateXmlAttribute($element);
if (is_array($attribute)) {
$writer
->writeAttribute($attribute[0], $attribute[1]);
$element = $attribute[2];
}
$writer
->text($element);
}
$writer
->endElement();
}
}
private static function _generateXmlAttribute($value) {
if ($value instanceof DateTime) {
return array(
'type',
'datetime',
self::_dateTimeToXmlTimestamp($value),
);
}
if (is_int($value)) {
return array(
'type',
'integer',
$value,
);
}
if (is_bool($value)) {
return array(
'type',
'boolean',
$value ? 'true' : 'false',
);
}
if ($value === NULL) {
return array(
'nil',
'true',
$value,
);
}
}
private static function _dateTimeToXmlTimestamp($dateTime) {
$dateTime
->setTimeZone(new DateTimeZone('UTC'));
return $dateTime
->format('Y-m-d\\TH:i:s') . 'Z';
}
private static function _castDateTime($string) {
try {
if (empty($string)) {
return false;
}
$dateTime = new DateTime($string);
return self::_dateTimeToXmlTimestamp($dateTime);
} catch (Exception $e) {
return false;
}
}
}