SitePoint Sponsor

User Tag List

Results 1 to 5 of 5
  1. #1
    SitePoint Guru
    Join Date
    Nov 2004
    Location
    England
    Posts
    698
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    Question SOAP Array items

    Guys,

    I'm currently working with PHP's SOAPClient and a WSDL provided to me by an organisation whose web service we need to use. I've made my way down the list no problem until I hit an item that is an array. How on earth do you pass it an array?

    Here's an example piece of code that I was given by the organisation:
    Code XML:
    <Address xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="__docType_Address[1]">
        <m0:item0 xsi:type="m0:__docType_Address">
            <CoreAddress xsi:type="m0:__docType_CoreAddress">
                <AddressType xsi:type="xsd:string">MAIN</AddressType>
                <BuildingNumber xsi:type="xsd:string"/>
                <BuildingName xsi:type="xsd:string">Building Name</BuildingName>
                <SubBuildingName xsi:type="xsd:string"/>
                <Street1 xsi:type="xsd:string">Street Name</Street1>
                <Street2 xsi:type="xsd:string"/>
                <Locality1 xsi:type="xsd:string">Locality 1</Locality1>
                <Locality2 xsi:type="xsd:string"/>
                <Town xsi:type="xsd:string">Town</Town>
                <County xsi:type="xsd:string"/>
                <Postcode xsi:type="xsd:string">PO57 6DE</Postcode>
                <CountryCode xsi:type="xsd:string"/>
                <OrgName xsi:type="xsd:string"/>
                <DeptName xsi:type="xsd:string"/>
                <POBox xsi:type="xsd:string"/>
                <DeliveryPoint xsi:type="xsd:string"/>
                <ForeignAddress xsi:type="xsd:boolean">0</ForeignAddress>
            </CoreAddress>
            <TimeAtAddress xsi:type="m0:__docType_TimeAtAddress">
                <Years xsi:type="xsd:int">3</Years>
                <Months xsi:type="xsd:int">7</Months>
            </TimeAtAddress>
        </m0:item0>
    </Address>
    So, in the object that I'm passing to SOAPClient, I'm setting something like:

    $Address->item0->...

    That doesn't work at all, I just get no <Address/> at all.

    So, I try something like:

    $Address = array($Item->CoreAddress->AddressType = 'MAIN'...

    That creates 19 examples of:

    <item xsi:type="ns2:__docType_Address"/>

    So, how on earth do I pass these arrays to SOAPClient and have it process it as in the top example?

  2. #2
    Twitter: @AnthonySterling silver trophy AnthonySterling's Avatar
    Join Date
    Apr 2008
    Location
    North-East, UK.
    Posts
    6,111
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    You;re not actually trying to build the XML structure above are you?
    @AnthonySterling: I'm a PHP developer, a consultant for oopnorth.com and the organiser of @phpne, a PHP User Group covering the North-East of England.

  3. #3
    SitePoint Guru
    Join Date
    Nov 2004
    Location
    England
    Posts
    698
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    How do you mean? The example above is a snippet of some existing XML that the organisation provided me. I'm just providing SOAPClient with the parameters and it is building the XML itself via the WSDL. The thing is that we can provide three addresses and they're "tns:ArrayOf__docType_Address". I'm trying all sorts of different combinations to try to get it to generate properly. Everything that isn't an array generates perfectly but everything from this point onwards is an array, so I can't proceed without working this part out

  4. #4
    Twitter: @AnthonySterling silver trophy AnthonySterling's Avatar
    Join Date
    Apr 2008
    Location
    North-East, UK.
    Posts
    6,111
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    It looks like a simple array of addresses, try...
    PHP Code:
    $client = new SoapClient('/path/to/wsdl.xml');

    $addressCollection = new stdClass();

    $addressCollection->Address = array(
        
    $address
    );

    $client->method(
        array(
            
    $addressCollection
        
    )
    ); 
    To be fair, I spent 9-10 hours looking/working at Soap yesterday and I'm all Soap-ed out!
    @AnthonySterling: I'm a PHP developer, a consultant for oopnorth.com and the organiser of @phpne, a PHP User Group covering the North-East of England.

  5. #5
    SitePoint Guru
    Join Date
    Nov 2004
    Location
    England
    Posts
    698
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    OK, I think this is right (or at least acceptable)

    Code PHP:
    $ItemA->AddressType       = 'MAIN';
    $ItemA->BuildingNumber    = '';
    $ItemA->BuildingName      = 'Colloseum';
    $ItemA->SubBuildingName   = 'East';
    $ItemA->Street1           = 'A Road';
    $ItemA->Street2           = '';
    $ItemA->Locality1         = 'Rome';
    $ItemA->Locality2         = '';
    $ItemA->Town              = 'Rome';
    $ItemA->County            = 'Rome';
    $ItemA->Postcode          = 'RM15DP';
    $ItemA->CountryCode       = '';
    $ItemA->OrgName           = 'Roman Empire';
    $ItemA->DeptName          = '';
    $ItemA->POBox             = '';
    $ItemA->DeliveryPoint     = 'Over There';
    $ItemA->ForeignAddress    = 0;
    $ItemB->Years             = 3;
    $ItemB->Months            = 8;
     
    $Address[]  = array('CoreAddress' => $ItemA, 'TimeAtAddress' => $ItemB);

    $Address is then absorbed in to the SOAPClient parameters further down the line (ie $Params->Address = $Address; )

    It certainly generates XML as expected now (note that when I refer to generating XML, I'm refering to using __getLastRequest() when I'm tracing the request), the only downside being that it doesn't appear to be closing the tags as in the above example (creates a close tag, rather than closing the open tag, if you know what I mean)


Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •