Sử dụng PHP và SoapClient.Cách chuyển một mảng vào cuộc gọi PHP SoapClient
Tôi cần chuyển XML sau vào yêu cầu xà phòng - nghĩa là nhiều <stay>
trong phạm vi <stays>
.
<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>
Vấn đề là tôi đang đi qua các dữ liệu trong như một mảng:
$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
)
)
);
ở trên không hoạt động, như <stay>
không được định nghĩa. Vì vậy, sự lựa chọn là:
$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
)
)
);
Nhưng điều đó dẫn đến trùng lặp phím, vì vậy chỉ một trong những 's <stay>
được gửi đi.
Tôi đang chạy này như:
$soapClient->saveReservation($xml);
Bất kỳ ý tưởng về làm thế nào tôi có thể cấu trúc mảng sao cho XML ở trên được tạo ra?
Một số thông tin khác. Các ví dụ trên đã được đơn giản hóa siêu, vì vậy đây là một ví dụ sử dụng thực tế về những gì tôi đang làm, với đề xuất của benjy được thực hiện.
$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;
này thất bại, với thông điệp object hasn't 'stay' property
đó là do cùng một vấn đề, đó là thẻ <stays>
nên chứa 1 hoặc nhiều <stay>
thẻ. Nếu tôi đặt $reservation->stays['stay'] = $stay;
sau đó nó được chấp nhận, nhưng điều đó lại chỉ cho phép tôi để có một đơn <stay>
trong <stays>
Bên cạnh đó, yêu cầu SOAP trông như thế này:
<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>
Tại sao không chỉ serialize mảng 'ở lại' và gán nội dung vào các yếu tố xml . Ở phía bên nhận, bạn có thể unserialize nó một cách dễ dàng. –
stillstanding
Tôi không có quyền kiểm soát điểm cuối xà phòng. Nó phải là XML theo wsdl. Nhưng đây là một cấu trúc XML khá chuẩn nên phải có cách để thể hiện nó. – Colin
Xem thêm http://stackoverflow.com/questions/577795/passing-array-to-soap-function-in-php –