Моя цель – создать мыльный запрос, который может содержать такие элементы:
<flexFields> <names> <names>IAG Group</names> <names>Ticket #</names> </names> </flexFields>
Тем не менее, каждая комбинация soapvar и soapparam, которую я смог придумать, делает невозможным дублирование вложенных тегов имен. Я могу получить 1 дополнительный тег:
$flexFields = array( 'names'=> new SoapVar( new SoapVar(array('names'=>'IAG Group'),SOAP_ENC_OBJECT), SOAP_ENC_OBJECT) );
Это генерирует:
<flexFields xsi:type="ns2:SoapNamedValues"> <names xsi:type="names"> <names xsi:type="xsd:string">IAG Group</names> </names> </flexFields>
Но любая попытка, которую я делаю для повторения тега имен, либо генерирует страшный элемент BOGUS, если я использую SOAP_ENC_OBJECT, либо обертывает каждый элемент в другом элементе элемента, если я использую SOAP_ENC_ARRAY, что также нежелательно.
Я знаю, что могу просто вручную создать то, что хочу, и загрузить его с помощью XSD_ANYXML, но это приближается к линии поражения цели использования библиотеки SOAP.
Может ли кто-нибудь представить пример того, как идеально сбалансировать mashapar / soapparam + массив, чтобы заставить это работать на самом деле? Или я пытаюсь сделать невозможное с помощью библиотеки SOAP PHP?
Я столкнулся с проблемой тегов BOGUS. Мое решение включало использование ArrayObject вместо примитивов массива. Все объекты затем преобразуются в объекты SoapVar. Кажется, что мыльная библиотека действительно хочет иметь дело с объектами повсюду. У меня есть более полная запись здесь:
http://www.fischco.org/blog/2011/3/26/php-soapserver-objects-arrays-and-encoding.html
У меня есть аналогичная проблема, попробуйте следующее:
$Names=array(); $Names[]=new SoapVar("IAG Group",XSD_STRING,null,null,'names'); $Names[]=new SoapVar("Ticket #",XSD_STRING,null,null,'names'); $BigNames=new SoapVar($Names,SOAP_ENC_OBJECT,null,null,'Names');
Это создает и массив объектов SoapVar ($ Names) и помещает их в объект BigNames, создавая такой вывод:
<Names> <names>IAG Group</names> <names>Ticket #</names> </Names>
Затем вы можете создать другой объект SoapVar для FlexFields, но по какой-то причине вы не можете разместить объект SoapVar непосредственно в другой, его нужно сохранить в массиве …
Я хочу сделать это:
$FlexFields=new SoapVar($BigNames,SOAP_ENC_OBJECT,null,null,'FlexFields');
Это работает:
$FF=array($BigNames); $FlexFields=new SoapVar($FF,SOAP_ENC_OBJECT,null,null,'FlexFields');