Вопрос по php – PHP SoapClient - несколько атрибутов с одним и тем же ключом

4

Я использую SoapClient, пытаясь создать что-то для этой спецификации:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <WSUser xmlns="http://webservices.listrak.com/v31/">
      <UserName>string</UserName>
      <Password>string</Password>
    </WSUser>
  </soap:Header>
  <soap:Body>
    <SetContact xmlns="http://webservices.listrak.com/v31/">
      <WSContact>
        <EmailAddress>string</EmailAddress>
        <ListID>int</ListID>
        <ContactProfileAttribute>
          <AttributeID>int</AttributeID>
          <Value>string</Value>
        </ContactProfileAttribute>
        <ContactProfileAttribute>
          <AttributeID>int</AttributeID>
          <Value>string</Value>
        </ContactProfileAttribute>
      </WSContact>
      <ProfileUpdateType>NotDefined or Update or Append or Overwrite</ProfileUpdateType>
      <ExternalEventIDs>string</ExternalEventIDs>
      <OverrideUnsubscribe>boolean</OverrideUnsubscribe>
    </SetContact>
  </soap:Body>
</soap:Envelope>

Я исследовал группу, включая приведенную ниже, и подумал, что у меня есть ответ. Однако это не работает. Это то, что я делаю:

foreach ($attributes as $key => $value) {
            $obj = array('AttributeID' => $key, 'Value' => $value);
            $attrs[] = $obj;
    }
    $final_attrs = array('ContactProfileAttribute' => $attrs);

    $params = array(
                    'WSContact' => array(
                                    'EmailAddress' => $email,
                                    'ListID' => $listId,
                                    array('ContactProfileAttribute' => $attrs)
                                    ),
                                    'ProfileUpdateType' => 'Overwrite',
                                    'ExternalEventIDs' => "",
                                    'OverrideUnsubscribe' => TRUE,

    );

    try {

            $rest = $soapClient->SetContact($params);
...

когда я распечатываю массив, я получаю это:

Array
(
    [WSContact] => Array
        (
        [EmailAddress] => [email protected]
        [ListID] => 26444
        [0] => Array
            (
                [ContactProfileAttribute] =&gt; Array
                    (
                        [0] => Array
                            (
                                [AttributeID] => 1548948
                                [Value] => 1
                            )

                        [1] => Array
                            (
                                [AttributeID] => 1548953
                                [Value] => John
                            )

                        [2] => Array
                            (
                                [AttributeID] => 1548954
                                [Value] => Doe
                            )

                        [3] => Array
                            (
                                [AttributeID] => 1550052
                                [Value] => 1
                            )

                    )

            )

    )

[ProfileUpdateType] => Overwrite
[ExternalEventIDs] => 
[OverrideUnsubscribe] => 1
)

Тем не менее, это в конечном итоге не дает ожидаемый результат, вместо этого:

Request = <?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://webservices.listrak.com/v31/">
    <env:Header>
        <ns1:WSUser>
            <ns1:UserName>user</ns1:UserName>
            <ns1:Password>pw</ns1:Password>
        </ns1:WSUser>
    </env:Header>
    <env:Body>
        <ns1:SetContact>
            <ns1:WSContact>
                <ns1:EmailAddress>[email protected]</ns1:EmailAddress>
                <ns1:ListID>26444</ns1:ListID>
            </ns1:WSContact>
            <ns1:ProfileUpdateType>Overwrite</ns1:ProfileUpdateType>
            <ns1:ExternalEventIDs></ns1:ExternalEventIDs>
            <ns1:OverrideUnsubscribe>true</ns1:OverrideUnsubscribe>
        </ns1:SetContact>
    </env:Body>
</env:Envelope>

(Примечание: нет ContactProfileAttribute)

Ссылка:

Ваш Ответ

1   ответ
3

ContactProfileAttribute элемент на один уровень слишком глубоко. Пытаться:

    'WSContact' => array(
        'EmailAddress' => $email,
        'ListID' => $listId,
        'ContactProfileAttribute' => $attrs
    ),
    'ProfileUpdateType' => 'Overwrite',
    'ExternalEventIDs' => "",
    'OverrideUnsubscribe' => TRUE,
);
Удивительно, что сделал свое дело. Спасибо! kevinmcg

Похожие вопросы