PHP SoapClient - Múltiplos atributos com a mesma chave
Estou usando o SoapClient, tentando produzir algo para esta especificação:
<code><?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> </code>
Eu pesquisei um monte, incluindo o abaixo, e pensei que tinha uma resposta. No entanto, não está funcionando. Isso é o que estou fazendo:
<code>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); ... </code>
quando eu imprimo a matriz, eu entendo isso:
<code>Array ( [WSContact] => Array ( [EmailAddress] => [email protected] [ListID] => 26444 [0] => Array ( [ContactProfileAttribute] => 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 ) </code>
No entanto, isso acaba não produzindo o resultado esperado, em vez disso:
<code>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> </code>
(Aviso: nenhum ContactProfileAttribute)
Referência:
SoapClient: como passar múltiplos elementos com o mesmo nome?https://stackoverflow.com/questions/7351034/how-to-make-a-php-soapcall-with-same-parameters