Imagine you have a WebService that defines in its WSDL file the following input structure:
<xsd:element name="Z_CATSIF_UPDATE_HOURS> <xsd:complexType> <xsd:all> [...] <xsd:element name="DATA"> <xsd:complexType> <xsd:sequence> <xsd:element name="item" type="ZCO_CATSIF_COMM" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:complexType> </xsd:element> <xsd:complexType name="ZCO_CATSIF_COMM"> <xsd:sequence> <xsd:element name="ELEM1" minOccurs="0"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="6" /> </xsd:restriction> </xsd:simpleType> </xsd:element> [...] </xsd:sequence> </xsd:ComplexType> <wsdl:message name="rfc.Z_CATSIF_UPDATE_HOURS.Input"> <wsdl:part name="parameters" element="rfc:Z_CATSIF_UPDATE_HOURS" /> </wsdl:message> <wsdl:message name="rfc.Z_CATSIF_UPDATE_HOURS.Output"> <wsdl:part name="parameters" element="rfc:Z_CATSIF_UPDATE_HOURS.Response" /> </wsdl:message> <wsdl:portType name="UpdateHours"> <wsdl:operation name="UpdateHours"> <wsdl:input message="p1:rfc.Z_CATSIF_UPDATE_HOURS.Input" /> <wsdl:output message="p1:rfc.Z_CATSIF_UPDATE_HOURS.Output" /> </wsdl:operation> </wsdl:portType>
This is a part of the WSDL definition of an SAP XI web service. As you can see, the WSDL expects the input data in the DATA element which is a folded „item“ sequence containing the complex type ZCO_CATSIF_COMM. So we have a folded structure… in order to have PHP5’s SOAP generate the correct XML code, we use the following:
$obj = new ZCO_CATSIF_COMM($data); $var = new SoapVar(new item($obj), SOAP_ENC_OBJECT, 'ZCO_CATSIF_COMM', 'urn:sap-com:document:sap:rfc:functions'); $caller_array = array( 'PROJECT_ID' => $project_id, 'DATA' => $var ); $response = $soap_client->UpdateHours($caller_array);
So you see that we have two classes which do nothing than creating the corresponding properties that are defined in the WSDL complex types:
class ZCO_CATSIF_COMM { public $ELEM1; function ZCO_CATSIF_COMM($data) { $this->ELEM1 = $data['ELEM1']; } } class item { var $item; function item($obj) { $this->item = $obj; } }
Right after that, PHP5’s SOAP generates the correct XML code: […]<DATA><item><ELEM1>elem1data</ELEM1></item></DATA>
Schreibe einen Kommentar