2012-04-27 163 views
4

我使用SoapClient的,試圖爲這種規格的東西:PHP 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)

參考:

回答

3

ContactProfileAttribute元素是一個層次過深。嘗試:

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

太棒了,那就是訣竅。謝謝! – kevinmcg 2012-04-27 14:54:37

相關問題