Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Soap - возвратить многомерный массив объектов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Soap - возвратить многомерный массив объектов
rudiwork
Отправлено: 13 Июня, 2013 - 21:37:00
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




Привет, вопрос по теме SOAP.
Soap установлен как модуль Apache.
Стоит задача, вернуть c сервера данные в виде массива объектов типа stdClass.
Ниже приведу код WSDL файла и код сервера...
Если возвращаю обычный массив, то мой клиент на сервере все прекрасно понимает... а клиент на платформе 1С завершается неудачей при чтении возвращаемых данных.
Покумекав я решил, раз сервер при запросе от 1С получает массив объектов, то и возвращать нужно так же массив объектов.
Но не получается организовать возвращение многомерного массива объектов
Подскажите как описать WSDL файл?

Файл WSDL
CODE (htmlphp):
скопировать код в буфер обмена
  1. <definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:europarts" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:europarts">
  2.     <types>
  3.         <xsd:schema targetNamespace="urn:europarts">
  4.             <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
  5.             <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
  6.             <xsd:complexType name="ItemPart">
  7.                 <xsd:sequence>
  8.                     <xsd:element name="number" type="xsd:string"/>
  9.                     <xsd:element name="priority" type="xsd:int"/>
  10.                 </xsd:sequence>
  11.             </xsd:complexType>
  12.             <xsd:complexType name="ArrayOfItemPart">
  13.                 <xsd:sequence>
  14.                     <xsd:element name="password" type="xsd:string"/>
  15.                     <xsd:element name="parts" type="tns:ItemPart" minOccurs="0" maxOccurs="unbounded"/>
  16.                 </xsd:sequence>
  17.             </xsd:complexType>
  18.             <xsd:complexType name="ItemPartPrice">
  19.                 <xsd:sequence>
  20.                     <xsd:element name="number" type="xsd:string"/>
  21.                     <xsd:element name="priority" type="xsd:int"/>
  22.                     <xsd:element name="price" type="xsd:float"/>
  23.                 </xsd:sequence>
  24.             </xsd:complexType>
  25.             <xsd:complexType name="ArrayOfItemPartPrice">
  26.                     <xsd:sequence>
  27.                         <xsd:element name="result" type="tns:ItemPartPrice" minOccurs="0" maxOccurs="unbounded" />
  28.                     </xsd:sequence>          
  29.             </xsd:complexType>
  30.         </xsd:schema>
  31.     </types>
  32.     <message name="getArrayPriceRequest">
  33.         <part name="array" type="tns:ArrayOfItemPart"/>
  34.     </message>
  35.     <message name="getArrayPriceResponse">
  36.         <part name="array" type="tns:ArrayOfItemPartPrice"/>
  37.     </message>
  38.     <portType name="europartsPortType">
  39.         <operation name="getArrayPrice">
  40.             <documentation>get array price</documentation>
  41.             <input message="tns:getArrayPriceRequest"/>
  42.             <output message="tns:getArrayPriceResponse"/>
  43.         </operation>
  44.     </portType>
  45.     <binding name="europartsBinding" type="tns:europartsPortType">
  46.         <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  47.         <operation name="getArrayPrice">
  48.             <soap:operation soapAction="urn:europarts#getArrayPrice" style="rpc"/>
  49.             <input>
  50.                 <soap:body use="encoded" namespace="urn:europarts" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  51.             </input>
  52.             <output>
  53.                 <soap:body use="encoded" namespace="urn:europarts" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  54.             </output>
  55.         </operation>
  56.     </binding>
  57.     <service name="europarts">
  58.         <port name="europartsPort" binding="tns:europartsBinding">
  59.             <soap:address location="http://europarts.pro/webservicePrice/server.php"/>
  60.         </port>
  61.     </service>
  62. </definitions>


Сервер
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class PriceService {  
  3.         function getArrayPrice($parts) {       
  4.             //преобразуем объект в массив
  5.             $array = $this->objectToArray($parts);
  6.  
  7.                 $result = array();
  8.                 foreach($array['parts'] as $v) {
  9.                     $tmp = array();
  10.                         $tmp['number']   = $v['number'];
  11.                         $tmp['priority'] = $v['priority'];
  12.                     $tmp['price']    = $this->getPartPrice($v['number'], $v['priority']);    
  13.                     $result['result'][] = $tmp;
  14.                 }
  15.  
  16.                 //Преобразуем массив в объект
  17.                 $objArray = object;
  18.                 $objArray = $this->arrayToObject($result);
  19.        
  20.             return $objArray;
  21.         }
  22.     //------------------------------------------------------------------
  23.         //Запрос авторизации
  24.     function auth($pass){
  25.             $r = mysql_qw("SELECT `password` FROM `modx_web_users` WHERE id=?", $pass);
  26.         $row = mysql_fetch_assoc($r);
  27.         if(md5($pass) !== $row['password'])
  28.                     return false;
  29.         return true;
  30.     }  
  31.         //------------------------------------------------------------------
  32.         //Полцчить цену на товар
  33.         function getPartPrice($number, $priority) {
  34.             $r = mysql_qw("SELECT `price` FROM `modx_catalog` WHERE `number`=? AND `priority`=?", $number, $priority);
  35.                 if(mysql_num_rows($r) < 1) return 0;
  36.                 $row = mysql_fetch_assoc($r);
  37.                 return (float)$row['price'];
  38.         }
  39.         //------------------------------------------------------------------
  40.         /**
  41.     * Преобразование объекта в массив
  42.     * @param    object  $object преобразуемый объект
  43.     * @reeturn  array
  44.     */
  45.     function objectToArray($object) {
  46.         if(!is_object($object) && !is_array($object))
  47.             return $object;
  48.         if(is_object($object))
  49.             $object = get_object_vars($object);
  50.         return array_map(array($this, 'objectToArray'), $object );
  51.     }
  52.         //------------------------------------------------------------------
  53.         /**
  54.     * Преобразование  массива в объект
  55.     * @param    array  $array преобразуемый массив
  56.     * @reeturn  object
  57.     */
  58.         function arrayToObject($array = array()) {
  59.         if (!empty($array)) {
  60.             $data = false;
  61.             foreach ($array as $akey => $aval) {
  62.                 //$data -> {$akey} = $aval;
  63.                                 $data ->{$akey} = is_array($aval) ? $this->arrayToObject($aval) : $aval;
  64.             }
  65.             return $data;
  66.         }
  67.         return false;
  68.     }
  69.         //------------------------------------------------------------------
  70. }
  71.  
  72. ini_set("soap.wsdl_cache_enabled", "0"); // отключаем кэширование WSDL
  73. $server = new SoapServer("price.wsdl");
  74. $server->setClass("PriceService");
  75. $server->handle();
  76. ?>  

(Отредактировано автором: 13 Июня, 2013 - 21:40:52)

 
 Top
caballero
Отправлено: 14 Июня, 2013 - 00:27:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Подскажите как описать WSDL файл?

только клинические извращенцы вручную описывают wsdl файлы.
Тем более здесь надо не описывать его (он сервером генерится) а сгенерить клиентские PHP классы по wsdl для чего есть куча тулсов.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
rudiwork
Отправлено: 14 Июня, 2013 - 07:08:50
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




caballero пишет:
Цитата:
Подскажите как описать WSDL файл?

только клинические извращенцы вручную описывают wsdl файлы.
Тем более здесь надо не описывать его (он сервером генерится) а сгенерить клиентские PHP классы по wsdl для чего есть куча тулсов.

Хм... а как можно сгенерить WSDL файл?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB