I'm having problems with array in php. I need to send an xml via soap to the webservice with some product items, but a tag is bringing me doubts. The wsdl manual has an xml like this:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.edei.correios.com.br/"> <soapenv:Header/>
<soapenv:Body>
<ser:solicitarCodigoEtiquetaInternacional>
<!--Optional:-->
<xml>
<remessa>
<idioma>PT</idioma>
<encomendas>
<encomenda>
<cartaoDePostagem>0061962740</cartaoDePostagem>
<codigoControleCliente>100052202</codigoControleCliente>
<nomeRemetente>magento.COM</nomeRemetente>
<enderecoRemetente>Street Test</enderecoRemetente>
<numeroEnderecoRemetente>2017</numeroEnderecoRemetente>
<complementoEnderecoRemetente></complementoEnderecoRemetente>
<codigoPostalRemetente>83642</codigoPostalRemetente>
<cidadeRemetente>MERIDIAN</cidadeRemetente>
<estadoRemetente>ID</estadoRemetente>
<paisRemetente>US</paisRemetente>
<emailRemetente>[email protected]</emailRemetente>
<telefoneRemetente></telefoneRemetente>
<siteRemetente>www.bodybuilding.com</siteRemetente>
<nomeDestinatario>Junior Maia</nomeDestinatario>
<tipoDocumentoDestinatario>1</tipoDocumentoDestinatario>
<numeroDocumentoDestinatario>16549651468</numeroDocumentoDestinatario>
<enderecoDestinatario>Street Test</enderecoDestinatario>
<numeroEnderecoDestinatario>S/N</numeroEnderecoDestinatario>
<complementoEnderecoDestinatario>Test</complementoEnderecoDestinatario>
<codigoPostalDestinatario>70680506</codigoPostalDestinatario>
<caixaPostalDestinatario></caixaPostalDestinatario>
<cidadeDestinatario>Curitiba</cidadeDestinatario>
<ufDestinatario>PR</ufDestinatario>
<paisDestinatario>BR</paisDestinatario>
<emailDestinatario>[email protected]</emailDestinatario>
<telefoneDestinatario></telefoneDestinatario>
<pesoObjeto>150</pesoObjeto>
<comprimentoObjeto>16</comprimentoObjeto>
<larguraObjeto>11</larguraObjeto>
<alturaObjeto>2</alturaObjeto>
<modalidadeDistribuicaoObjeto>33375</modalidadeDistribuicaoObjeto>
<modalidadePagamentoImpostosObjeto>1</modalidadePagamentoImpostosObjeto>
<codigoMoeda>USD</codigoMoeda>
<valorFreteObjeto>50.00</valorFreteObjeto>
<valorSeguroObjeto>0.00</valorSeguroObjeto>
<modoDevolucaoObjeto>1</modoDevolucaoObjeto>
<seguroDevolucaoObjeto>N</seguroDevolucaoObjeto>
<itensEncomenda>
<itemEncomenda>
<codigoSHItem>100190</codigoSHItem>
<codigoSKUItem>TYH820040</codigoSKUItem>
<descricaoItem>BPI SPORTS BLOX - 110 SERVINGS - BLUEBERRY</descricaoItem>
<quantidadeItem>1</quantidadeItem>
<valorUnitario>100.00</valorUnitario>
<pesoUnitario></pesoUnitario>
</itemEncomenda>
<itemEncomenda>
<codigoSHItem>100191</codigoSHItem>
<codigoSKUItem>TYH820041</codigoSKUItem>
<descricaoItem>BPI SPORTS BLOX - 110 SERVINGS - WHITE</descricaoItem>
<quantidadeItem>1</quantidadeItem>
<valorUnitario>100.00</valorUnitario>
<pesoUnitario></pesoUnitario>
</itemEncomenda>
<itemEncomenda>
<codigoSHItem>100192</codigoSHItem>
<codigoSKUItem>TYH820042</codigoSKUItem>
<descricaoItem>BPI SPORTS BLOX - 110 SERVINGS - RED</descricaoItem>
<quantidadeItem>1</quantidadeItem>
<valorUnitario>100.00</valorUnitario>
<pesoUnitario></pesoUnitario>
</itemEncomenda>
</itensEncomenda>
</encomenda>
</encomendas>
</remessa>]]>
</xml>
</ser:solicitarCodigoEtiquetaInternacional>
</soapenv:Body>
Note that the <itemEncomenda>
tag repeats depending on how many products the request has, and that is exactly what I can not feed into php.
I'm using StdClass
to mount an array with the requested positions in the example and mount xml with SoapVar
, it works for all tags, but for itemEncomenda
no! For example, I have 4 items in the order, only the last one is written in the <itemEncomenda>
tag, the others do not appear. I imagine this happens because a itemEncomenda
index is created in the array and it overwrites the old positions. I do not really know how to mount an array by repeating this tag.
Here is my code to mount xml with StdClasse
mount xml
:
$var = new StdClass;
$var->xml = new stdClass;
$var->xml->remessa = new stdClass;
$var->xml->remessa->idioma = $this->idioma;
$var->xml->remessa->encomendas = new stdClass;
$var->xml->remessa->encomendas->encomenda = new stdClass;
//remetende
$var->xml->remessa->encomendas->encomenda->cartaoDePostagem = $this->cartao_postagem;
$var->xml->remessa->encomendas->encomenda->codigoControleCliente = '';
$var->xml->remessa->encomendas->encomenda->nomeRemetente = $this->remetente_nome;
$var->xml->remessa->encomendas->encomenda->enderecoRemetente = $this->remetente_rua;
$var->xml->remessa->encomendas->encomenda->numeroEnderecoRemetente = $this->remetente_numero;
$var->xml->remessa->encomendas->encomenda->complementoEnderecoRemetente = $this->remetente_complemento;
$var->xml->remessa->encomendas->encomenda->codigoPostalRemetente = $this->remetente_cep;
$var->xml->remessa->encomendas->encomenda->cidadeRemetente = $this->remetente_cidade;
$var->xml->remessa->encomendas->encomenda->estadoRemetente = $this->remetente_estado;
$var->xml->remessa->encomendas->encomenda->paisRemetente = $this->remetente_pais;
$var->xml->remessa->encomendas->encomenda->emailRemetente = $this->remetente_email;
$var->xml->remessa->encomendas->encomenda->telefoneRemetente = $this->remetente_telefone;
$var->xml->remessa->encomendas->encomenda->siteRemetente = $this->remetente_site;
//destinatário customer
$var->xml->remessa->encomendas->encomenda->nomeDestinatario = $customer_nome;
$var->xml->remessa->encomendas->encomenda->tipoDocumentoDestinatario = '1'; //1-cpf 2-cnpj 3-passport 4-not informed
$var->xml->remessa->encomendas->encomenda->numeroDocumentoDestinatario = $customer_taxvat;
$var->xml->remessa->encomendas->encomenda->enderecoDestinatario = $customer_rua;
$var->xml->remessa->encomendas->encomenda->numeroEnderecoDestinatario = $customer_rua_numero;
$var->xml->remessa->encomendas->encomenda->complementoEnderecoDestinatario = $customer_compemento;
$var->xml->remessa->encomendas->encomenda->codigoPostalDestinatario = $customer_cep;
$var->xml->remessa->encomendas->encomenda->caixaPostalDestinatario = '';
$var->xml->remessa->encomendas->encomenda->cidadeDestinatario = $customer_cidade;
$var->xml->remessa->encomendas->encomenda->ufDestinatario = $customer_uf;
$var->xml->remessa->encomendas->encomenda->paisDestinatario = $customer_pais;
$var->xml->remessa->encomendas->encomenda->emailDestinatario = $customer_email;
$var->xml->remessa->encomendas->encomenda->telefoneDestinatario = $customer_telefone;
//objeto
$var->xml->remessa->encomendas->encomenda->pesoObjeto = '';
$var->xml->remessa->encomendas->encomenda->comprimentoObjeto = '';
$var->xml->remessa->encomendas->encomenda->larguraObjeto = '';
$var->xml->remessa->encomendas->encomenda->alturaObjeto = '';
$var->xml->remessa->encomendas->encomenda->modalidadeDistribuicaoObjeto = $this->modalidade_distribuicao_objeto;
$var->xml->remessa->encomendas->encomenda->modalidadePagamentoImpostosObjeto = $this->modalidade_pagamento_imposto;
$var->xml->remessa->encomendas->encomenda->codigoMoeda = $this->moeda;
$var->xml->remessa->encomendas->encomenda->valorFreteObjeto = '';
$var->xml->remessa->encomendas->encomenda->valorSeguroObjeto = '';
$var->xml->remessa->encomendas->encomenda->modoDevolucaoObjeto = $this->modo_devolocao;
$var->xml->remessa->encomendas->encomenda->seguroDevolucaoObjeto = $this->seguro_devolucao ;
//itens
$var->xml->remessa->encomendas->encomenda->itensEncomenda = new stdClass;
foreach ($invoice->getAllItems() as $item){
if ($item->getOrderItem()->getParentItem()) {
continue;
}
$item_name = $item->getName();
$item_sku = $item->getSku();
$item_id = $item->getProductId();
$item_qty = $item->getQty();
$item_price = $item->getPrice();
$_product = Mage::getModel('catalog/product')->load($item_id);
$item_peso = $_product->getWeight();
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda = new stdClass;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->codigoSHItem = '';
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->codigoSKUItem = $item_sku;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->descricaoItem = $item_name;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->quantidadeItem = $item_qty;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->valorUnitario = $item_price;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->pesoUnitario = $item_peso;
}
print_r($var);
The console output is an array exactly as needed, but with only 1 item, and $invoice->getAllItems()
is 5!
Output from above array:
2017-12-14T18:17:04+00:00 DEBUG (7): stdClass Object
(
[xml] => stdClass Object
(
[remessa] => stdClass Object
(
[idioma] => PT
[encomendas] => stdClass Object
(
[encomenda] => stdClass Object
(
[cartaoDePostagem] => 0057018901
[codigoControleCliente] =>
[nomeRemetente] =>
[enderecoRemetente] =>
[numeroEnderecoRemetente] =>
[complementoEnderecoRemetente] =>
[codigoPostalRemetente] =>
[cidadeRemetente] =>
[estadoRemetente] =>
[paisRemetente] =>
[emailRemetente] =>
[telefoneRemetente] =>
[siteRemetente] =>
[nomeDestinatario] => joao teste
[tipoDocumentoDestinatario] => 1
[numeroDocumentoDestinatario] => 69077886168
[enderecoDestinatario] => addrees test
[numeroEnderecoDestinatario] => 16
[complementoEnderecoDestinatario] => Sandu Norte
[codigoPostalDestinatario] => 99988009
[caixaPostalDestinatario] =>
[cidadeDestinatario] => Brasília
[ufDestinatario] => DF
[paisDestinatario] => BR
[emailDestinatario] => [email protected]
[telefoneDestinatario] => (61) 9000-0000
[pesoObjeto] =>
[comprimentoObjeto] =>
[larguraObjeto] =>
[alturaObjeto] =>
[modalidadeDistribuicaoObjeto] => 33367
[modalidadePagamentoImpostosObjeto] => 1
[codigoMoeda] => BRL
[valorFreteObjeto] =>
[valorSeguroObjeto] =>
[modoDevolucaoObjeto] => 1
[seguroDevolucaoObjeto] => 1
[itensEncomenda] => stdClass Object
(
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-preto
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Preto
[quantidadeItem] => 2.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
)
)
)
)
)
)
It should look like this (with 5 [itemEncomenda]
tags) to mount the xml correctly:
2017-12-14T18:17:04+00:00 DEBUG (7): stdClass Object
(
[xml] => stdClass Object
(
[remessa] => stdClass Object
(
[idioma] => PT
[encomendas] => stdClass Object
(
[encomenda] => stdClass Object
(
[cartaoDePostagem] => 0057018901
[codigoControleCliente] =>
[nomeRemetente] =>
[enderecoRemetente] =>
[numeroEnderecoRemetente] =>
[complementoEnderecoRemetente] =>
[codigoPostalRemetente] =>
[cidadeRemetente] =>
[estadoRemetente] =>
[paisRemetente] =>
[emailRemetente] =>
[telefoneRemetente] =>
[siteRemetente] =>
[nomeDestinatario] => joao teste
[tipoDocumentoDestinatario] => 1
[numeroDocumentoDestinatario] => 00000000
[enderecoDestinatario] => address test
[numeroEnderecoDestinatario] => 16
[complementoEnderecoDestinatario] => Sandu Norte
[codigoPostalDestinatario] => 00000000
[caixaPostalDestinatario] =>
[cidadeDestinatario] => Brasília
[ufDestinatario] => DF
[paisDestinatario] => BR
[emailDestinatario] => [email protected]
[telefoneDestinatario] => (61) 9000-0000
[pesoObjeto] =>
[comprimentoObjeto] =>
[larguraObjeto] =>
[alturaObjeto] =>
[modalidadeDistribuicaoObjeto] => 33367
[modalidadePagamentoImpostosObjeto] => 1
[codigoMoeda] => BRL
[valorFreteObjeto] =>
[valorSeguroObjeto] =>
[modoDevolucaoObjeto] => 1
[seguroDevolucaoObjeto] => 1
[itensEncomenda] => stdClass Object
(
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-preto
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Preto
[quantidadeItem] => 2.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-branco
[descricaoItem] => Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Branco
[quantidadeItem] => 2.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-vermelho
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Vermelho
[quantidadeItem] => 3.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-verde
[descricaoItem] => Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Verde
[quantidadeItem] => 1.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-cinca
[descricaoItem] => Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Cinza
[quantidadeItem] => 4.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
)
)
)
)
)
)
Maybe this xml should not be mounted with array, since the itemEncomenda
tag needs to appear multiple times (according to the amount of foreach products) in the same XML, this means (in my view) that it would have to repeat the key of the array with the same name, which is not allowed in PHP.
I also tried to create an array as shown below, but stumble on the same problem, array with key with the same name:
$soapArgs = array(
'xml' => array(
'remessa' => array(
'idioma' => 'PT',
'encomendas' => array(
'encomenda' => array(
//remetende
'cartaoDePostagem' => $this->cartao_postagem,
'codigoControleCliente' => '',
'nomeRemetente' => $this->remetente_nome,
'enderecoRemetente' => $this->remetente_rua,
'numeroEnderecoRemetente' => $this->remetente_numero,
'complementoEnderecoRemetente' => $this->remetente_complemento,
'codigoPostalRemetente' => $this->remetente_cep,
'cidadeRemetente' => $this->remetente_cidade,
'estadoRemetente' => $this->remetente_estado,
'paisRemetente' => $this->remetente_pais,
'emailRemetente' => $this->remetente_email,
'telefoneRemetente' => $this->remetente_telefone,
'siteRemetente' => $this->remetente_site,
//destinatário customer
'nomeDestinatario' => $customer_nome,
'tipoDocumentoDestinatario' => 1, //1-cpf 2-cnpj 3-passport 4-not informed
'numeroDocumentoDestinatario' => $customer_taxvat,
'enderecoDestinatario' => $customer_rua,
'numeroEnderecoDestinatario' => $customer_rua_numero,
'complementoEnderecoDestinatario' => $customer_compemento,
'codigoPostalDestinatario' => $customer_cep,
'caixaPostalDestinatario' => '',
'cidadeDestinatario' => $customer_cidade,
'ufDestinatario' => $customer_uf,
'paisDestinatario' => $customer_pais,
'emailDestinatario' => $customer_email,
'telefoneDestinatario' => $customer_telefone,
//objeto
'pesoObjeto' => '',
'comprimentoObjeto' => '',
'larguraObjeto' => '',
'alturaObjeto' => '',
'modalidadeDistribuicaoObjeto' => '',
'modalidadePagamentoImpostosObjeto' => '',
'codigoMoeda' => '',
'valorFreteObjeto' => '',
'valorSeguroObjeto' => '',
'modoDevolucaoObjeto' => '',
'seguroDevolucaoObjeto' => '',
//itens
'itensEncomenda' => array(
'itemEncomenda' => array(
'codigoSHItem' => '',
'codigoSKUItem' => '',
'descricaoItem' => '',
'quantidadeItem' => '',
'valorUnitario' => '',
'pesoUnitario' => ''
), //itemEncomenda
'itemEncomenda' => array(
'codigoSHItem' => '',
'codigoSKUItem' => '',
'descricaoItem' => '',
'quantidadeItem' => '',
'valorUnitario' => '',
'pesoUnitario' => ''
), //itemEncomenda
'itemEncomenda' => array(
'codigoSHItem' => '',
'codigoSKUItem' => '',
'descricaoItem' => '',
'quantidadeItem' => '',
'valorUnitario' => '',
'pesoUnitario' => ''
), //itemEncomenda
), //itensEncomenda
), //encomenda
), //encomendas
), //remessa
) //xml
);
Note that inside the array 'itensEncomenda' => array(várias key com itemEncomenda)
, and this is where I can not find a solution.
Maybe I should mount XML with XWMWrite()
or SimpleXML()
but then I run into the problem of not being able to put a hand-written XML inside a SoapVar () to send in the correct pattern that webservice wsdl
wait.
Can anyone give me a light on this?