/includes/lib/Braintree/lib/Braintree/Xml/Generator.php

https://github.com/strangerstudios/paid-memberships-pro · PHP · 149 lines · 94 code · 11 blank · 44 comment · 14 complexity · 3a4f2ad0e8c6ae17788c218587dcfc03 MD5 · raw file

  1. <?php
  2. namespace Braintree\Xml;
  3. use DateTime;
  4. use DateTimeZone;
  5. use XMLWriter;
  6. use Braintree\Util;
  7. /**
  8. * PHP version 5
  9. */
  10. /**
  11. * Generates XML output from arrays using PHP's
  12. * built-in XMLWriter
  13. */
  14. class Generator
  15. {
  16. /**
  17. * arrays passed to this method should have a single root element
  18. * with an array as its value
  19. * @param array $aData the array of data
  20. * @return string XML string
  21. */
  22. public static function arrayToXml($aData)
  23. {
  24. $aData = Util::camelCaseToDelimiterArray($aData, '-');
  25. // set up the XMLWriter
  26. $writer = new XMLWriter();
  27. $writer->openMemory();
  28. $writer->setIndent(true);
  29. $writer->setIndentString(' ');
  30. $writer->startDocument('1.0', 'UTF-8');
  31. // get the root element name
  32. $aKeys = array_keys($aData);
  33. $rootElementName = $aKeys[0];
  34. // open the root element
  35. $writer->startElement($rootElementName);
  36. // create the body
  37. self::_createElementsFromArray($writer, $aData[$rootElementName], $rootElementName);
  38. // close the root element and document
  39. $writer->endElement();
  40. $writer->endDocument();
  41. // send the output as string
  42. return $writer->outputMemory();
  43. }
  44. /**
  45. * Construct XML elements with attributes from an associative array.
  46. *
  47. * @access protected
  48. * @static
  49. * @param object $writer XMLWriter object
  50. * @param array $aData contains attributes and values
  51. * @return void
  52. */
  53. private static function _createElementsFromArray(&$writer, $aData)
  54. {
  55. if (!is_array($aData)) {
  56. if (is_bool($aData)) {
  57. $writer->text($aData ? 'true' : 'false');
  58. } else {
  59. $writer->text($aData);
  60. }
  61. return;
  62. }
  63. foreach ($aData AS $elementName => $element) {
  64. // handle child elements
  65. $writer->startElement($elementName);
  66. if (is_array($element)) {
  67. if (array_key_exists(0, $element) || empty($element)) {
  68. $writer->writeAttribute('type', 'array');
  69. foreach ($element AS $ignored => $itemInArray) {
  70. $writer->startElement('item');
  71. self::_createElementsFromArray($writer, $itemInArray);
  72. $writer->endElement();
  73. }
  74. }
  75. else {
  76. self::_createElementsFromArray($writer, $element);
  77. }
  78. } else {
  79. // generate attributes as needed
  80. $attribute = self::_generateXmlAttribute($element);
  81. if (is_array($attribute)) {
  82. $writer->writeAttribute($attribute[0], $attribute[1]);
  83. $element = $attribute[2];
  84. }
  85. $writer->text($element);
  86. }
  87. $writer->endElement();
  88. }
  89. }
  90. /**
  91. * convert passed data into an array of attributeType, attributeName, and value
  92. * dates sent as DateTime objects will be converted to strings
  93. * @access protected
  94. * @param mixed $value
  95. * @return array attributes and element value
  96. */
  97. private static function _generateXmlAttribute($value)
  98. {
  99. if ($value instanceof DateTime) {
  100. return ['type', 'datetime', self::_dateTimeToXmlTimestamp($value)];
  101. }
  102. if (is_int($value)) {
  103. return ['type', 'integer', $value];
  104. }
  105. if (is_bool($value)) {
  106. return ['type', 'boolean', ($value ? 'true' : 'false')];
  107. }
  108. if ($value === NULL) {
  109. return ['nil', 'true', $value];
  110. }
  111. }
  112. /**
  113. * converts datetime back to xml schema format
  114. * @access protected
  115. * @param object $dateTime
  116. * @return string XML schema formatted timestamp
  117. */
  118. private static function _dateTimeToXmlTimestamp($dateTime)
  119. {
  120. $dateTimeForUTC = clone $dateTime;
  121. $dateTimeForUTC->setTimeZone(new DateTimeZone('UTC'));
  122. return ($dateTimeForUTC->format('Y-m-d\TH:i:s') . 'Z');
  123. }
  124. private static function _castDateTime($string)
  125. {
  126. try {
  127. if (empty($string)) {
  128. return false;
  129. }
  130. $dateTime = new DateTime($string);
  131. return self::_dateTimeToXmlTimestamp($dateTime);
  132. } catch (Exception $e) {
  133. // not a datetime
  134. return false;
  135. }
  136. }
  137. }
  138. class_alias('Braintree\Xml\Generator', 'Braintree_Xml_Generator');