How to pass an array into a PHP SoapClient call

Lu

New Member
Using PHP and SoapClient.I need to pass the following XML into a soap request - i.e. multiple \[code\]<stay>\[/code\]'s within \[code\]<stays>\[/code\].\[code\]<reservation> <stays> <stay> <start_date>2011-01-01</start_date> <end_date>2011-01-15</end_date> </stay> <stay> <start_date>2011-01-16</start_date> <end_date>2011-01-30</end_date> </stay> </stays></reservation>\[/code\]The problem is that I'm passing the data in as an array:\[code\]$xml = array('reservation' => array( 'stays' => array( array( 'start_date' => '2011-01-01', 'end_date' => 2011-01-15 ), array( 'start_date' => '2011-01-16', 'end_date' => 2011-01-30 ) ));\[/code\]The above doesn't work, as \[code\]<stay>\[/code\] is not defined. So the alternative is:\[code\]$xml = array('reservation' => array( 'stays' => array( 'stay' => array( 'start_date' => '2011-01-01', 'end_date' => 2011-01-15 ), 'stay' => array( 'start_date' => '2011-01-01', 'end_date' => 2011-01-15 ) ));\[/code\]But that results in duplicate keys, so only one of the \[code\]<stay>\[/code\]'s is sent.I'm running this as:\[code\]$soapClient->saveReservation($xml);\[/code\]Any ideas on how I can structure the array so that the above XML is generated?Some further information. The above examples were super-simplified, so here's a real use example of what I'm doing, with benjy's suggestion implemented.\[code\]$options = $this->api->getDefaultOptions();$options['baseProductCode'] = '123'.$basket->accommodation['feed_primary_identifier'];# ^^^^^ just to ensure it fails and doesn't process$reservation = new stdClass();$reservation->external_id = $order->pb_ref;$reservation->etab_id = $basket->accommodation['feed_primary_identifier'];$reservation->reservation_type = 'gin';$reservation->firstname = $order->forename;$reservation->lastname = $order->surname;$reservation->birthdate = date('Y-m-d', strtotime('- 21 YEAR'));$reservation->stays = array();$details = $basket->getDetailedBasketContents();foreach ($details['room_types'] as $roomTypeId => $roomType) { foreach($roomType['instances'] as $instance) { $stay = new stdClass(); $stay->nb_rooms = 1; $stay->room_type_code = $roomTypeId; $stay->start_date = date('Y-m-d', strtotime($order['checkin'])); $stay->end_date = date('Y-m-d', strtotime($order['checkout'])); $stay->occupants = array(); foreach($instance['occupancy']['occupants'] as $key => $occupantData) { if ($occupantData['forename'] and $occupantData['surname']) { $occupant = new stdClass(); $occupant->firstname = $occupantData['forename']; $occupant->lastname = $occupantData['surname']; $occupant->pos = 100; $occupant->birthdate = date('Y-m-d', strtotime('- 21 YEAR')); $stay->occupants[] = $occupant; } } $reservation->stays[] = $stay; }}$options['reservation'] = new stdClass();$options['reservation']->reservation = $reservation;//echo XmlUtil::formatXmlString($this->api->);try { $this->parsePlaceOrderResponse($this->api->__soapCall('saveDistribReservation2', $options));} catch (Exception $e) { echo $e->getMessage(); echo XmlUtil::formatXmlString($this->api->__getLastRequest()); echo XmlUtil::formatXmlString($this->api->__getLastResponse());}exit;\[/code\]This fails, with the message \[code\]object hasn't 'stay' property\[/code\] which is due to the same issue, that the \[code\]<stays>\[/code\] tag should contain 1 or more \[code\]<stay>\[/code\] tags. If I set \[code\]$reservation->stays['stay'] = $stay;\[/code\] then it is accepted, but that again only allows me to have a single \[code\]<stay>\[/code\] within \[code\]<stays>\[/code\]Additionally, the SOAP request looks like this:\[code\]<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hom="homingwns" xmlns:v1="..."> <soapenv:Header/> <soapenv:Body> <hom:saveDistribReservation2> <base_id>?</base_id> <username>?</username> <password>?</password> <partnerCode>?</partnerCode> <baseProductCode>?</baseProductCode> <reservation> <v1:reservation> <v1:external_id>?</v1:external_id> <v1:etab_id>?</v1:etab_id> <v1:reservation_type>?</v1:reservation_type> <!--Optional:--> <v1:option_date>?</v1:option_date> <!--Optional:--> <v1:gender>?</v1:gender> <!--Optional:--> <v1:firstname>?</v1:firstname> <v1:lastname>?</v1:lastname> <!--Optional:--> <v1:birthdate>?</v1:birthdate> <!--Optional:--> <v1:stays> <v1:stay> <v1:nb_rooms>?</v1:nb_rooms> <v1:room_type_code>?</v1:room_type_code> <v1:start_date>?</v1:start_date> <v1:end_date>?</v1:end_date> <!--Optional:--> <v1:occupants> <!--Optional:--> <v1:occupant> <!--Optional:--> <v1:gender>?</v1:gender> <!--Optional:--> <v1:firstname>?</v1:firstname> <v1:lastname>?</v1:lastname> <!--Optional:--> <v1:birthdate>?</v1:birthdate> <v1:pos>?</v1:pos> </v1:occupant> </v1:occupants> </v1:stay> </v1:stays> </v1:reservation> </reservation> </hom:saveDistribReservation2> </soapenv:Body></soapenv:Envelope>\[/code\]
 
Back
Top