/** * Fixes the XML based on the parameters specified in the constructor. * * @param string $request the raw request produced by the SOAP client * @param array $arguments the arguments passed to the SOAP method * @param array $headers the headers used in the request * @return string the prepared request ready to be sent to the server */ public function FixXml($request, array $arguments, array $headers) { $requestDom = XmlUtils::GetDomFromXml($request); $xpath = new \DOMXPath($requestDom); // Fix headers. $headersDomNodes = $xpath->query("//*[local-name()='Envelope']/*[local-name()='Header']/*"); $this->FixXmlNodes($headersDomNodes, $headers, $xpath); // Fix body. $argumentsDomNodes = $xpath->query("//*[local-name()='Envelope']/*[local-name()='Body']/*"); $this->FixXmlNodes($argumentsDomNodes, $arguments, $xpath); // Remove empty headers. if ($this->removeEmptyElements) { $this->RemoveEmptyHeaderElements($xpath); } // Remove id attributes. if ($this->replaceReferences) { $this->RemoveIdAttributes($xpath); } return $requestDom->saveXML(); }
/** * A typemap conversion function for parsing long values in SOAP responses. * * @param string $xml the XML snippet containing the long value. * @return mixed the inner long value as an integer, float, or string */ public static function TypemapLongFromXml($xml) { $document = XmlUtils::GetDomFromXml($xml); $tag = $document->documentElement->localName; $value = $document->documentElement->nodeValue; $isIdField = preg_match('/^id$|Id$|ID$/', $tag); if (!$isIdField) { if (strcmp(strval(intval($value)), $value) === 0) { return intval($value); } elseif (strcmp(sprintf('%.0f', floatval($value)), $value) === 0) { return floatval($value); } } return $value; }
/** * Generates the parameters to use for the download request. * * @param mixed $reportDefinition the report definition, as an ID or object * @return array the parameters */ private static function GetParams($reportDefinition) { $params = array(); if (is_numeric($reportDefinition)) { $params['__rd'] = $reportDefinition; } else { if (is_object($reportDefinition) || is_array($reportDefinition)) { $document = XmlUtils::ConvertObjectToDocument($reportDefinition, 'reportDefinition'); $document->formatOutput = true; $params['__rdxml'] = XmlUtils::GetXmlFromDom($document); } else { throw new ReportDownloadException('Invalid report definition type: ' . $reportDefinition); } } return $params; }