SoapVar / Param и вложенные, повторяющиеся элементы в SOAP - PullRequest
6 голосов
/ 31 января 2011

Моя цель - создать запрос на мыло, который может содержать такие элементы:

<flexFields>
  <names>
    <names>IAG Group</names>
    <names>Ticket #</names>
  </names>
</flexFields>

Однако любая комбинация мылавара и соаппарама, которую я смог придумать, делает невозможнымдля меня, чтобы дублировать вложенный тег «имена».Я могу получить 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 или оборачивать каждый элемент в другой элемент 'item', если я использую SOAP_ENC_ARRAY, что также нежелательно.

Я знаю, что могу просто вручную создать то, что хочу, и загрузить его с помощью XSD_ANYXML, но это становитсяблизок к тому, чтобы победить цель использования библиотеки SOAP.

Может ли кто-нибудь привести пример того, как идеально сбалансировать вложение массива soapvar / soapparam +, чтобы это действительно заработало?Или я пытаюсь сделать невозможное с помощью библиотеки PHP SOAP?

Ответы [ 2 ]

9 голосов
/ 23 марта 2011

У меня похожая проблема, попробуйте это:

$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');
6 голосов
/ 09 апреля 2011

Я также столкнулся с проблемой тегов BOGUS.Мое решение заключалось в использовании ArrayObject вместо примитивов массива.Все объекты затем преобразуются в объекты SoapVar.Кажется, библиотека мыла действительно хочет иметь дело с объектами везде.У меня есть более полная запись здесь:

http://www.fischco.org/blog/2011/3/26/php-soapserver-objects-arrays-and-encoding.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...