Pass attribute value to XML node from a foreach that receives data from a query in mysql

0

I am trying to traverse data in a foreach that takes the attributes and values of an array that comes from a query that returns a result_array (). The objective is to take the values of that array and add them as attributes with properties and values in an XML node. The problem is that when I add the XML node, all the attributes return the last data of each tuple of my mysql table as a value. I am using Codeingniter 3.1.9 and I am manipulating the PHP DOMDocument class to create XML structures.

Controller:

public function convertirXML(){
    //Si recibo un post de un elemento html y la variable esta definida y no es nula entonces
    if (isset($_POST['convertirXML'])) {
        //Creacion de xml
        //Creación de variable que recibe un objeto tipo clase DOM
        $doc = new DOMDocument('1.0', 'UTF-8');    
        //Creación de nodo padre con namespace cfdi     
        $r = $doc->createElementNS('www.sistemadefacturacionbitrix24.com','cfdi:Comprobante');
        //Adición del nodo hijo al nodo padre de la variable doc guardando datos en la variable r           
        $r = $doc->appendChild($r);
        //Creación de nodo Conceptos
        $cons=$doc->createElement('cfdi:Conceptos');
        //Adición del nodo hijo al nodo raiz
        $r->appendChild($cons);
        //Invoca a función de mi modelo y trae conceptos
        $conceptos = $this->Consultas->traeConceptos();
        //Recorro arreglo conceptos y los atributos los asigno a propiedad
        foreach ($conceptos as $propiedad) {
            //Creo nodo cfdi:Concepto
            $con=$doc->createElement('cfdi:Concepto');
            //Recorro arreglo, extraigo los valores de la propiedad y los asigno a variable concepto
            foreach ($propiedad as $concepto) {
                //Añado atributo llamado 'xxx' al nodo con y le paso el valor de la variable concepto
                $con->setAttribute('ClaveDeProductoOServicio', $concepto);
                $con->setAttribute('ClaveUnidad', $concepto);             
                $con->setAttribute('Cantidad', $concepto);
                $con->setAttribute('Unidad', $concepto);
                $con->setAttribute('NumeroDeIdentificacion', $concepto);
                $con->setAttribute('Descripcion', $concepto);
                $con->setAttribute('ValorUnitario', $concepto);
                $con->setAttribute('Importe', $concepto);
                $con->setAttribute('Descuento', $concepto);
                //Añado nodo hijo concepto a nodo padre conceptos
                $cons->appendChild($con);
            }
        }
        //Verificación de datos que tiene $conceptos
        var_dump($conceptos);

        //Asignación a variable cuyo formato de salida será escrito en tiempo de ejecución y será visualmente legible
        $doc->formatOutput=true;
        //abrir archivo ejemploXML.xml y si no exite crearlo
        $file = fopen('ejemploXML.xml', 'wb');
        //Escritura del archivo file asignado el contenido de variable doc y decodificando contenido
        fwrite($file, utf8_decode($doc->saveXML()));
        //Cerrar archivo
        fclose($file);
    }
}

Model:

public function traeConceptos(){
        $query = $this->db->query('select cProdServ, cUnidad, cantidad, unidad, noIdentificacion, descripcion, vUnitario, importe, descuento from factura');
        return $query->result_array();  
    }   

View:

<!DOCTYPE html>
<html>
<head>
    <title>Formulario</title>
</head>
<body>

    <form id="fCfdi" name="idCfdi" action="<?=base_url()?>index.php/Xml/convertirXML" method="POST">
        <form id="fConceptosImpuestos" name="fConceptosImpuestos" method="POST" action="<?=base_url()?>index.php/Xml/agregarConceptos">
        <!-- Conceptos -->
    <div id="datosConceptos" class="container">
        <div class="panel panel-default">
            <div class="panel-heading">Agregar Conceptos</div>
            <div class="panel-body">
            <p></p>
                <input type="text" name="iCPrdoServ" placeholder="Clave de producto o servicio*" size="23"></p>
                <input type="text" name="iCUnidad" placeholder="Clave de unidad*"size="23"></p>
                <input type="text" name="iCantidad" placeholder="Cantidad*"size="23"></p>
                <input type="text" name="iUnidad" placeholder="Unidad"size="23"></p>
                <input type="text" name="iNoIdentificacion" placeholder="Número de identificación"size="23"></p>
                <textarea name="iDescripcion" placeholder="Descripción" rows="5" cols="25" maxlength="255"></textarea></p> 
                <input type="text" name="iVUnitario" placeholder="Valor unitario*" size="23"></p>
                <input type="text" name="iImporte" placeholder="Importe*"size="23"></p>
                <input type="text" name="iDescuento" placeholder="Descuento"size="23"></p>

                <input type="submit" name="convertirXML"  class="btn btn-primary btn-lg btn-block" value="Convertir a XML"></p>             
            </div>
        </div>
    </div>
    </form>
</body>
</html>

Table mysql:

CREATE TABLE 'factura' (
  'idFactura' int(11) NOT NULL,
  'cProdServ' varchar(8) NOT NULL,
  'cUnidad' varchar(10) DEFAULT NULL,
  'cantidad' decimal(10,6) NOT NULL,
  'unidad' int(10) NOT NULL,
  'noIdentificacion' int(100) DEFAULT NULL,
  'descripcion' varchar(255) DEFAULT NULL,
  'vUnitario' decimal(10,6) NOT NULL,
  'importe' decimal(10,2) NOT NULL,
  'descuento' decimal(10,2) DEFAULT NULL,
  'fkImpuestos' int(11) DEFAULT NULL
);

INSERT INTO 'factura' ('idFactura', 'cProdServ', 'cUnidad', 'cantidad', 'unidad', 'noIdentificacion', 'descripcion', 'vUnitario', 'importe', 'descuento', 'fkImpuestos') VALUES
(1, '1234', '123', '8.000000', 0, 45, 'producto x', '3.000000', '10.00', '1.00', 1),
(2, '1234', '123', '8.000000', 0, 45, 'producto x', '3.000000', '10.00', '1.00', NULL),
(5, '123', '123123', '123.000000', 123, 123, '123', '122.000000', '123.00', '213.00', 4);

XML result:

<?xml version="1.0" encoding="UTF-8"?>
  <cfdi:Conceptos>
    <cfdi:Concepto ClaveDeProductoOServicio="1.00" ClaveUnidad="1.00" Cantidad="1.00" Unidad="1.00" NumeroDeIdentificacion="1.00" Descripcion="1.00" ValorUnitario="1.00" Importe="1.00" Descuento="1.00"/>
    <cfdi:Concepto ClaveDeProductoOServicio="1.00" ClaveUnidad="1.00" Cantidad="1.00" Unidad="1.00" NumeroDeIdentificacion="1.00" Descripcion="1.00" ValorUnitario="1.00" Importe="1.00" Descuento="1.00"/>
    <cfdi:Concepto ClaveDeProductoOServicio="213.00" ClaveUnidad="213.00" Cantidad="213.00" Unidad="213.00" NumeroDeIdentificacion="213.00" Descripcion="213.00" ValorUnitario="213.00" Importe="213.00" Descuento="213.00"/>
  </cfdi:Conceptos>
</cfdi:Comprobante>

Problem: I can not get my foreach to return the values linked to my properties correctly, apart from the fact that I only return the last value of each tuple per XML node attribute. Please help me solve this problem :(

This happens if I put the $ with = $ doc-> createElement ('cfdi: Concept'); inside the second foreach

<?xml version="1.0" encoding="UTF-8"?>
  <cfdi:Emisor Rfc="" Nombre="" RegimenFiscal=""/>
  <cfdi:Receptor Rfc="" Nombre="" ResidenciaFiscal="" UsoCFDI=""/>
  <cfdi:Conceptos>
    <cfdi:Concepto ClaveDeProductoOServicio="1234" ClaveUnidad="1234" Cantidad="1234" Unidad="1234" NumeroDeIdentificacion="1234" Descripcion="1234" ValorUnitario="1234" Importe="1234" Descuento="1234"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123" ClaveUnidad="123" Cantidad="123" Unidad="123" NumeroDeIdentificacion="123" Descripcion="123" ValorUnitario="123" Importe="123" Descuento="123"/>
    <cfdi:Concepto ClaveDeProductoOServicio="8.000000" ClaveUnidad="8.000000" Cantidad="8.000000" Unidad="8.000000" NumeroDeIdentificacion="8.000000" Descripcion="8.000000" ValorUnitario="8.000000" Importe="8.000000" Descuento="8.000000"/>
    <cfdi:Concepto ClaveDeProductoOServicio="0" ClaveUnidad="0" Cantidad="0" Unidad="0" NumeroDeIdentificacion="0" Descripcion="0" ValorUnitario="0" Importe="0" Descuento="0"/>
    <cfdi:Concepto ClaveDeProductoOServicio="45" ClaveUnidad="45" Cantidad="45" Unidad="45" NumeroDeIdentificacion="45" Descripcion="45" ValorUnitario="45" Importe="45" Descuento="45"/>
    <cfdi:Concepto ClaveDeProductoOServicio="producto x" ClaveUnidad="producto x" Cantidad="producto x" Unidad="producto x" NumeroDeIdentificacion="producto x" Descripcion="producto x" ValorUnitario="producto x" Importe="producto x" Descuento="producto x"/>
    <cfdi:Concepto ClaveDeProductoOServicio="3.000000" ClaveUnidad="3.000000" Cantidad="3.000000" Unidad="3.000000" NumeroDeIdentificacion="3.000000" Descripcion="3.000000" ValorUnitario="3.000000" Importe="3.000000" Descuento="3.000000"/>
    <cfdi:Concepto ClaveDeProductoOServicio="10.00" ClaveUnidad="10.00" Cantidad="10.00" Unidad="10.00" NumeroDeIdentificacion="10.00" Descripcion="10.00" ValorUnitario="10.00" Importe="10.00" Descuento="10.00"/>
    <cfdi:Concepto ClaveDeProductoOServicio="1.00" ClaveUnidad="1.00" Cantidad="1.00" Unidad="1.00" NumeroDeIdentificacion="1.00" Descripcion="1.00" ValorUnitario="1.00" Importe="1.00" Descuento="1.00"/>
    <cfdi:Concepto ClaveDeProductoOServicio="1234" ClaveUnidad="1234" Cantidad="1234" Unidad="1234" NumeroDeIdentificacion="1234" Descripcion="1234" ValorUnitario="1234" Importe="1234" Descuento="1234"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123" ClaveUnidad="123" Cantidad="123" Unidad="123" NumeroDeIdentificacion="123" Descripcion="123" ValorUnitario="123" Importe="123" Descuento="123"/>
    <cfdi:Concepto ClaveDeProductoOServicio="8.000000" ClaveUnidad="8.000000" Cantidad="8.000000" Unidad="8.000000" NumeroDeIdentificacion="8.000000" Descripcion="8.000000" ValorUnitario="8.000000" Importe="8.000000" Descuento="8.000000"/>
    <cfdi:Concepto ClaveDeProductoOServicio="0" ClaveUnidad="0" Cantidad="0" Unidad="0" NumeroDeIdentificacion="0" Descripcion="0" ValorUnitario="0" Importe="0" Descuento="0"/>
    <cfdi:Concepto ClaveDeProductoOServicio="45" ClaveUnidad="45" Cantidad="45" Unidad="45" NumeroDeIdentificacion="45" Descripcion="45" ValorUnitario="45" Importe="45" Descuento="45"/>
    <cfdi:Concepto ClaveDeProductoOServicio="producto x" ClaveUnidad="producto x" Cantidad="producto x" Unidad="producto x" NumeroDeIdentificacion="producto x" Descripcion="producto x" ValorUnitario="producto x" Importe="producto x" Descuento="producto x"/>
    <cfdi:Concepto ClaveDeProductoOServicio="3.000000" ClaveUnidad="3.000000" Cantidad="3.000000" Unidad="3.000000" NumeroDeIdentificacion="3.000000" Descripcion="3.000000" ValorUnitario="3.000000" Importe="3.000000" Descuento="3.000000"/>
    <cfdi:Concepto ClaveDeProductoOServicio="10.00" ClaveUnidad="10.00" Cantidad="10.00" Unidad="10.00" NumeroDeIdentificacion="10.00" Descripcion="10.00" ValorUnitario="10.00" Importe="10.00" Descuento="10.00"/>
    <cfdi:Concepto ClaveDeProductoOServicio="1.00" ClaveUnidad="1.00" Cantidad="1.00" Unidad="1.00" NumeroDeIdentificacion="1.00" Descripcion="1.00" ValorUnitario="1.00" Importe="1.00" Descuento="1.00"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123" ClaveUnidad="123" Cantidad="123" Unidad="123" NumeroDeIdentificacion="123" Descripcion="123" ValorUnitario="123" Importe="123" Descuento="123"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123123" ClaveUnidad="123123" Cantidad="123123" Unidad="123123" NumeroDeIdentificacion="123123" Descripcion="123123" ValorUnitario="123123" Importe="123123" Descuento="123123"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123.000000" ClaveUnidad="123.000000" Cantidad="123.000000" Unidad="123.000000" NumeroDeIdentificacion="123.000000" Descripcion="123.000000" ValorUnitario="123.000000" Importe="123.000000" Descuento="123.000000"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123" ClaveUnidad="123" Cantidad="123" Unidad="123" NumeroDeIdentificacion="123" Descripcion="123" ValorUnitario="123" Importe="123" Descuento="123"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123" ClaveUnidad="123" Cantidad="123" Unidad="123" NumeroDeIdentificacion="123" Descripcion="123" ValorUnitario="123" Importe="123" Descuento="123"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123" ClaveUnidad="123" Cantidad="123" Unidad="123" NumeroDeIdentificacion="123" Descripcion="123" ValorUnitario="123" Importe="123" Descuento="123"/>
    <cfdi:Concepto ClaveDeProductoOServicio="122.000000" ClaveUnidad="122.000000" Cantidad="122.000000" Unidad="122.000000" NumeroDeIdentificacion="122.000000" Descripcion="122.000000" ValorUnitario="122.000000" Importe="122.000000" Descuento="122.000000"/>
    <cfdi:Concepto ClaveDeProductoOServicio="123.00" ClaveUnidad="123.00" Cantidad="123.00" Unidad="123.00" NumeroDeIdentificacion="123.00" Descripcion="123.00" ValorUnitario="123.00" Importe="123.00" Descuento="123.00"/>
    <cfdi:Concepto ClaveDeProductoOServicio="213.00" ClaveUnidad="213.00" Cantidad="213.00" Unidad="213.00" NumeroDeIdentificacion="213.00" Descripcion="213.00" ValorUnitario="213.00" Importe="213.00" Descuento="213.00"/>
  </cfdi:Conceptos>
</cfdi:Comprobante>

Result of Var_dump

array(3) { [0]=> array(9) { ["cProdServ"]=> string(4) "1234" ["cUnidad"]=> string(3) "123" ["cantidad"]=> string(8) "8.000000" ["unidad"]=> string(1) "0" ["noIdentificacion"]=> string(2) "45" ["descripcion"]=> string(10) "producto x" ["vUnitario"]=> string(8) "3.000000" ["importe"]=> string(5) "10.00" ["descuento"]=> string(4) "1.00" } [1]=> array(9) { ["cProdServ"]=> string(4) "1234" ["cUnidad"]=> string(3) "123" ["cantidad"]=> string(8) "8.000000" ["unidad"]=> string(1) "0" ["noIdentificacion"]=> string(2) "45" ["descripcion"]=> string(10) "producto x" ["vUnitario"]=> string(8) "3.000000" ["importe"]=> string(5) "10.00" ["descuento"]=> string(4) "1.00" } [2]=> array(9) { ["cProdServ"]=> string(3) "123" ["cUnidad"]=> string(6) "123123" ["cantidad"]=> string(10) "123.000000" ["unidad"]=> string(3) "123" ["noIdentificacion"]=> string(3) "123" ["descripcion"]=> string(3) "123" ["vUnitario"]=> string(10) "122.000000" ["importe"]=> string(6) "123.00" ["descuento"]=> string(6) "213.00" } }
    
asked by Erik Marañón 11.07.2018 в 21:32
source

0 answers