Junior Maia
Junior Maia

Reputation: 17

php - Array for XML

I am having problem with array in php. I need to send an xml via soap to the webservice with some product items, but an 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>

Notice that the <itemEncomenda> tag repeats depending on how many products the order has, and that's 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 the xml with SoapVar, it's working 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 an index itemEncomenda is created in the array and it goes overwriting the old positions. I do not really know how to mount an array by repeating this tag.

Here my code to mount the xml with StdClass and mount the 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 output on the console is an array exactly as needed, but with only 1 item, and in $invoice->getAllItems() there are 5!

Output:

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] => josué  ribeiro de frança rocha
                                    [tipoDocumentoDestinatario] => 1
                                    [numeroDocumentoDestinatario] => 69077886168
                                    [enderecoDestinatario] => QNE 34 casa 16  Taguatinga Norte 
                                    [numeroEnderecoDestinatario] => 16
                                    [complementoEnderecoDestinatario] => Sandu Norte
                                    [codigoPostalDestinatario] => 72125340
                                    [caixaPostalDestinatario] => 
                                    [cidadeDestinatario] => Brasília
                                    [ufDestinatario] => DF
                                    [paisDestinatario] => BR
                                    [emailDestinatario] => [email protected]
                                    [telefoneDestinatario] => (61) 98379-7370
                                    [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 be this, with 5 [itemEncomenda]:

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] => josué  ribeiro de frança rocha
                                    [tipoDocumentoDestinatario] => 1
                                    [numeroDocumentoDestinatario] => 69077886168
                                    [enderecoDestinatario] => QNE 34 casa 16  Taguatinga Norte 
                                    [numeroEnderecoDestinatario] => 16
                                    [complementoEnderecoDestinatario] => Sandu Norte
                                    [codigoPostalDestinatario] => 72125340
                                    [caixaPostalDestinatario] => 
                                    [cidadeDestinatario] => Brasília
                                    [ufDestinatario] => DF
                                    [paisDestinatario] => BR
                                    [emailDestinatario] => [email protected]
                                    [telefoneDestinatario] => (61) 98379-7370
                                    [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] => Smartwatch DZ09 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] => Smartwatch DZ09 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] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Cinza
                                                    [quantidadeItem] => 4.0000
                                                    [valorUnitario] => 49.9000
                                                    [pesoUnitario] => 0.4000
                                                )

                                        )

                                )

                        )

                )

        )

)

Need help!

Upvotes: 0

Views: 117

Answers (1)

augsteyer
augsteyer

Reputation: 1099

These are the problematic lines:

$var->xml->remessa->encomendas->encomenda->itensEncomenda = new stdClass;
...
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda = new stdClass;

What happens is that itensEncomenda is a class, then you create a property itemEncomenda that is also a class. Then you rewrite the property again and again. What you technically want is for itensEncomeda to be an array of classes.

Or you will need to modify the property name with each iteration as the property needs to be unique named for it to not be rewritten (e.g. itemEncomenda1, itemEncomenda2, itemEncomenda3)

To simplify, this is what you are doing:

$holder = new stdClass();
$holder->items = new stdClass();

$allItems = array('hi', 'nope', 'lala');

foreach($allItems as $value) {
    $holder->items->item = new stdClass();
    $holder->items->item->value = $value;
}

print_r($holder);

Outputs:

stdClass Object ( 
[items] => stdClass Object ( 
  [item] => stdClass Object ( 
       [value] => lala ) ) )

Needs to become:

$holder = new stdClass();
$holder->items = array();

$allItems = array('hi', 'nope', 'lala');

foreach($allItems as $value) {
    $item = new stdClass();
    $item->value = $value;
    $holder->items[] = $item;
}

print_r($holder);

Outputs:

stdClass Object ( 
     [items] => Array ( 
         [0] => stdClass Object ( [value] => hi ) 
         [1] => stdClass Object ( [value] => nope ) 
         [2] => stdClass Object ( [value] => lala ) ) )

Upvotes: 2

Related Questions