Имя: Пароль:
1C
1С v8
Вызов функции Web-сервис из PHP с параметрами (2)
,
0 egor2fsys
 
13.07.11
22:18
Прощу прощения за ранее созданную недотему :)

Итак, есть сервис, с методом Reserve, которому нужно передавать параметр, пытаюсь вызвать это дело на пхп, однако параметр у метода построен на основе wsdl описания из этого сервиса. Т.е. есть параметр - CamperList, у него внутри есть тип Camper, который имеет тип, структура которого показана чуть ниже.

С 1с удается вызвать все нормально.

Как на пхп описать корректную передачу сервису параметра на основе другого параметра ?

Код на пхп примерно такой:

$client = new SoapClient("http://127.0.0.1/RoomCategory/ws/Reserving.1cws?wsdl");

$a["Group"]=5;
$a["Name"]="Ivanov Ivan Petrovich";
$a["BirdhDate"]="1983-01-02";
$a["Sex"]="m";
$a["LivingType"]=1;
$a["RoomTypeCode"]="003";
$a["Date"]="2011-07-13";
$a["LivingTime"]=14;


$res = $client->Reserve($a);

Однако пхп вполне справедливо ругается:

PHP Fatal error:  SOAP-ERROR: Encoding: object hasn't 'CamperList' property in /var/www/html/ws2.php on line 25
SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'CamperList' property in /var/www/html/ws2.php:25
1 egor2fsys
 
13.07.11
22:20
К 1 сообщению:

Если вызвать echo print_r($client->__getFunctions(), true);

то получим среди прочих

[14] => ReserveResponse Reserve(Reserve $parameters)

Теперь если вызвать
echo print_r($client->__getFunctions(), true);

то получим

Array
(
   [0] => struct Camper {
int Group;
string Name;
date BirdhDate;
string Sex;
int LivingType;
string RoomTypeCode;
date Date;
int LivingTime;
}
   [1] => struct CamperList {
Camper Camper;
}


Т.е. в самом методе Reserve параметр является типом CamperList, но как его сконструировать в пхп чтобы корректно передать в метод ?
2 xReason
 
13.07.11
23:05
здесь форум для кулинаров
вы ошиблись форумом
3 egor2fsys
 
13.07.11
23:41
(2)
Спасибо, и вам вкусно приготовить тогда.
4 dzsysop
 
13.07.11
23:53
Думаю проще будет объявить внутри метода много входных параметров,
но если очень хочется то надо копать вот в этом направлении:


$a["Group"]=5;
$a["Name"]="Ivanov Ivan Petrovich";
$a["BirdhDate"]="1983-01-02";
$a["Sex"]="m";
$a["LivingType"]=1;
$a["RoomTypeCode"]="003";
$a["Date"]="2011-07-13";
$a["LivingTime"]=14;

$param_1c = new SoapVar($a, SOAP_ENC_OBJECT);

$res = $client->Reserve($param_1c);


только, боюсь, овчинка выделки не стоит
5 egor2fsys
 
13.07.11
23:56
Это я пробовал в первую очередь.
Однако там не массив, а тип на основе типа веб-сервиса.
6 SeraFim
 
14.07.11
05:46
не совсем понял, но заметил одну фигню:
если в 1Ске в веб-сервисе есть функция с параметрами:
функция СделатьЧтоТо(параметр1, параметр2)

то в php нужно, чтобы массив параметров имел те же названия, что и параметры в функции.
то есть:
$a["параметр1"] = $param1;
$a["параметр2"] = $param2;
$result = $client -> СделатьЧтоТо($a);
7 egor2fsys
 
14.07.11
08:08
(6) Ага, и так пробовал, все равно ругается на несоответствие типа параметра ...
8 Fragster
 
гуру
14.07.11
08:45
а чО за объект типа Reserve-то? может таки его надо совать?
9 egor2fsys
 
14.07.11
09:22
Это объект на основе описания веб-сервиса.

Т.е. сервисе есть функция Reserve с параметром CamperList. Внутри типа CamperList есть тип Camper, который в свою очередь состоит уже из простых типов.

Так это выглядит внутри описания:

   <xs:complexType name="Camper">
       <xs:sequence>
           <xs:element name="Group" type="xs:int"/>
           <xs:element name="Name" type="xs:string" nillable="true"/>
           <xs:element name="BirdhDate" type="xs:date" nillable="true"/>
           <xs:element name="Sex" type="xs:string"/>
           <xs:element name="LivingType" type="xs:int"/>
           <xs:element name="RoomTypeCode" type="xs:string"/>
           <xs:element name="Date" type="xs:date"/>
           <xs:element name="LivingTime" type="xs:int"/>
       </xs:sequence>
   </xs:complexType>
   <xs:complexType name="CamperList">
       <xs:sequence>
           <xs:element name="Camper" type="tns:Camper" maxOccurs="999"/>
       </xs:sequence>
   </xs:complexType>
10 Fragster
 
гуру
14.07.11
09:51
(9) просто из (1) следует, что функция хочет именно объект такого типа, а не массив
11 egor2fsys
 
14.07.11
10:17
(10) А как ей в пхп передать объект нужного типа ?
12 Fragster
 
гуру
14.07.11
10:30
$var = new Reserve;

или вызвать функцию, которая его создает
13 nbIx
 
14.07.11
10:39
(0) Можно вопросик.
А как вы авторизуетесь?
14 SeraFim
 
14.07.11
14:18
$client = new SoapClient("some.wsdl", array('login' => "some_name", 'password' => "some_password"));
15 egor2fsys
 
14.07.11
17:12
База без авторизации. А вообще или прописываем в vrd файл или как показали в (14).
16 Fragster
 
гуру
14.07.11
18:25
так (10) - правда, али нет?
17 egor2fsys
 
14.07.11
18:29
Получается да.
Но как в пхп создать этот объект ?
18 Fragster
 
гуру
14.07.11
18:43
а если
$client = new SoapClient("http://127.0.0.1/RoomCategory/ws/Reserving.1cws?wsdl");


$a["Group"]=5;
$a["Name"]="Ivanov Ivan Petrovich";
$a["BirdhDate"]="1983-01-02";
$a["Sex"]="m";
$a["LivingType"]=1;
$a["RoomTypeCode"]="003";
$a["Date"]="2011-07-13";
$a["LivingTime"]=14;
$b["CamperList"][]=$a

$res = $client->Reserve($b);
19 Fragster
 
гуру
14.07.11
18:44
wsdl полностью б
20 egor2fsys
 
14.07.11
18:45
а можно как то в асечку или на почту ?
21 egor2fsys
 
14.07.11
19:13
(18) Спасибо !
То, что нужно !