2012-04-27 14 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要素は、1つのレベルが深すぎです。試してみてください:

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

恐ろしいですね。ありがとう! – kevinmcg