Comunidad de diseño web y desarrollo en internet online

Carga, edita y graba XML dentro de Flash (¡casi funciona!)

Citar            
MensajeEscrito el 20 Mar 2009 03:44 pm
Hola amiguitos. Hice un CARGADOR, EDITOR Y GUARDADOR DE XML dentro de un SWF. Es casi EXITOSÍSIMO... pero todavía tengo un problemita. No se nada de PHP... pero conseguí del foro de Cristalab (no se de dónde) un editor de TXT usando un PHP. Estoy usando ese PHP, que es así:

Código :

<?php
    $archivo = "conciertos2.xml";
    $abre = fopen($archivo, "w");
    $texto = $_POST["texto"];
    $grabar = fwrite($abre, $texto);
    fclose($abre);
    echo "estado=ok";
?>

El "concerts.xml" original que carga es así

Código :

<?xml version="1.0" encoding="UTF-8"?>
<conciertos>
<concierto descripcion='111' mail='' pagina='' lugar='' fecha='10' />
<concierto descripcion='222' mail='' pagina='' lugar='' fecha='20' />
</conciertos>

Ustedes pueden probarlo en http://magicomalabarismo.com.ar/$editor. Primero carguen el archivo con CARGAR XML (lo hace directamente del Flash, sin pasar por PHP). Los botones son así:

A: adiciona un nodo al principio de la lista
X: borra el nodo
E: edita el nodo
T y Tn tira "trace", no los usen.

Noten los campos de abajo, el de arriba muestra cómo se va editando el XML y el de abajo cómo es el XML original cargado... y cómo queda después de guardarlo (lo hace leyendo como texto desde Flash el archivo XML).

El editor hasta acá anda perfecto, pero cuando grabo el XML a "conciertos2.xml", se graba mal, algo así (que también lo pueden ver en el campo de abajo):

Código :

<?xml version=\'1.0\' encoding=\'UTF-8\'?>
<conciertos>
<concierto descripcion=\"000\" mail=\"\" pagina=\"\" lugar=\"\" fecha=\"00\" />
<concierto descripcion=\"111\" mail=\"\" pagina=\"\" lugar=\"\" fecha=\"10\" />
<concierto descripcion=\"222\" mail=\"\" pagina=\"\" lugar=\"\" fecha=\"20\" />
</conciertos>

Las comillas aparcen con la barra invertida adelante (secuencia de escape). Después, Flash no puede volver a leer esas secuencias de escape.

No quiero aprender PHP o SQL ahora (algunos me dicen que es mejor trabajar así). Creo que debería haber algún comando en PHP para que cambie las secuencias de escape por las comillas. Si soluciono esto, es un buen código... a pesar que algunos me digan que es inestable trabajar así. Después lo publico en algún tutorial.

PD: si alguien se pregunta cómo hice para adicionar nodos... después de horas de ojos rojos frente al monitor y al no entender varias cosas del Flash... hacía algo así: cre un XML nuevo con un nodo igual a los otros, pero con los atributos vacíos. Lo pongo al principio de la lista con "insertBefore" y antes de editarlo (ACÁ VIENE LO BIZARRO)... creo un String con todo el XML (con "<?xml version="1.0" encoding="UTF-8"?><conciertos>" adelante, uso un "for" para sumarle todos los nodos, incluido el nuevo y por último sumo "</conciertos>"). Borro el XML anterior y creo uno nuevo con el String creado. Esta fue la solución para sumarle nodos, pero lo hice porque no entendí porqué Flash insertaba bien el primer nodo, pero hacía desastre con los siguientes.

Por Mario Mey

40 de clabLevel



 

Castelar, Argentina

firefox
Citar            
MensajeEscrito el 20 Mar 2009 07:09 pm
SOLUCIONADO. Gracias a Steve Clay (creo que lo saqué de este foro), me dió un nuevo códio PHP

Código :

<?php
$archivo = "conciertos.xml";
$texto = get_magic_quotes_gpc()
   ? stripslashes($_POST['texto'])
   : $_POST['texto'];
file_put_contents($archivo, $texto); // if PHP5
echo "estado=ok";
?>

También tuve un problemita con el ENTER que enviaba Flash a PHP... generaba error. Cambié el formato del XML por este:

Código :

<?xml version="1.0" encoding="UTF-8"?>
<conciertos>
<concierto mail='' pagina='' lugar='' fecha='10'>111</concierto>
<concierto mail='' pagina='' lugar='' fecha='20'>222</concierto>
</conciertos>

Así anda bien. Pueden probar en el link anterior (http://magicomalabarismo.com.ar/$editor/). Agreguen o modifiquen nodos como quieran. Lo importante ya está... lo que sigue es hacer que inserte un nuevo nodo no sólo al principio, sino también entre otros nodos.

Gracias.

Por Mario Mey

40 de clabLevel



 

Castelar, Argentina

firefox
Citar            
MensajeEscrito el 26 May 2009 05:54 pm
Hola puedes poner los fuentes para verlos.-
Gracias

Por cristianver

0 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 26 May 2009 07:13 pm
Ok, pero te aviso desde ya que no sé en qué estado se encuentra este código. Hasta lo último que toqué, parecía que andaba bien... PERO ES EXPERIMENTAL.
Serviría para modificar las fechas de conciertos de una banda, que sea autogestionable. Los comentarios no son muchos (algunos ni yo los entiendo), espero que sirvan para guiarte.

Archivos : http://www.mariomey.com.ar/tech/$editorxml1/editorxml.zip

Código AS

Código :

var cant_fechas:Number;
var cant_pag:Number;
var pag_actual:Number;
var nro_sig:Number;
var cant_fechas:Number;
var pag_actual:Number;
var texto_para_grabar:String;
//
// Creación del XML, fechas, cant_fechas, cant_pag
// y carga de la página actual
var lista_de_fechas:XML = new XML();
lista_de_fechas.ignoreWhite = true;
lista_de_fechas.onLoad = function(success:Boolean) {
   carga_XML();
   carga_pagina_actual();
}
carga_XML = function() {
   fechas = lista_de_fechas.firstChild.childNodes;
   cant_fechas = fechas.length;
   cant_pag = Math.ceil(fechas.length/8);
}
carga_pagina_actual = function() {
   pag_actual = 1;
   cargar_agenda(1);
}
//
// Botones de subir y bajar lista.
lista.arriba.onRelease = function() {
   if (pag_actual > 1) {
      pag_actual--;
      cargar_agenda(pag_actual);
   }
};
lista.abajo.onRelease = function() {
   if (pag_actual < cant_pag) {
      pag_actual++;
      cargar_agenda(pag_actual);
   }
};
//
// Cargar Agenda
cargar_agenda = function(pagina) {
   for (i=1; i<9; i++) {
      n = (pagina-1)*8+i-1;
      // Muestra las fechas en la lista
      lista["item"+i].text = "";
      // Para cargar Borrar y Editar
      if (fechas[n].attributes.fecha != undefined) {
         lista["item"+i].text += fechas[n].attributes.fecha;
         cargar_editores(i, n)
      }
   }
}
//
// Cargar Editores X y E y Tn
cargar_editores = function(i, n) {
   lista["editar_item"+i].onRelease = function() {
      if(fechas[n] != undefined) {
         editar_fecha(n);
      }
   }
   lista["borrar_item"+i].onRelease = function() {
      if(fechas[n] != undefined) {
         borrar_fecha(n);
      }
   }
   lista["tracenode"+i].onRelease = function() {
      if(fechas[n] != undefined) {
         trace(fechas[n]);
      }
   }
}
//
// Botones sueltos A y T
lista.agregar.onRelease = function() {
   agregar_fecha();
}
lista.traceXML.onRelease = function() {
   trace(lista_de_fechas);
}
//
// Función AGREGAR FECHA
agregar_fecha = function() {
   if (nueva_fecha == undefined) {
      var nueva_fecha:XML = new XML("<concierto mail='' pagina='' lugar='' fecha='New'></concierto>");
      var insertPoint:XMLNode = lista_de_fechas.firstChild.childNodes[0];
   }
   _root.lista_de_fechas.firstChild.insertBefore(nueva_fecha, insertPoint);
   // Esto serviría para clonar el primero, pero
   // no me funcionó. Lo dejé por si en algún momento
   // lo necesite.
   /*var nueva_fecha:XML = new XML;
   var nuevo_nodo:XMLNode = lista_de_fechas.firstChild.childNodes[0].cloneNode(true);
   nueva_fecha.appendChild(nuevo_nodo);
   nueva_fecha.firstChild.attributes.fecha = "Nueva";
   nueva_fecha.firstChild.attributes.lugar = "";
   nueva_fecha.firstChild.attributes.pagina = "";
   nueva_fecha.firstChild.attributes.mail = "";
   nueva_fecha.firstChild.attributes.descripcion = "";
   // El lugar para ponerlo usa el elemento del Array .childNodes[0], pero para
   // usar el "insertBefore" se usa el firstChild.
   var insertPoint:XMLNode = lista_de_fechas.firstChild.childNodes[0];
   lista_de_fechas.firstChild.insertBefore(nueva_fecha, insertPoint);
   *///
   //
   // Tira a un String el XML y lo carga de nuevo.
   var xml_texto:String = '<?xml version="1.0" encoding="UTF-8"?><conciertos>';
   for (i= 0; i<lista_de_fechas.firstChild.childNodes.length; i++) {
      xml_texto += lista_de_fechas.firstChild.childNodes[i].toString();
   }
   xml_texto += "</conciertos>";
   delete lista_de_fechas;
   _root.lista_de_fechas = new XML(xml_texto);
   delete xml_texto;
   carga_XML();
   // Hasta acá lo nuevo
   //
   cargar_agenda(pag_actual);
   editar_fecha(0);
}

//
// Abrir Ventana de Edición
editar_fecha = function(n) {
   this.attachMovie("ventana_id", "ventana", 1);
   ventana.fech.text = fechas[n].attributes.fecha;
   ventana.luga.text = fechas[n].attributes.lugar;
   ventana.pagi.text = fechas[n].attributes.pagina;
   ventana.mail.text = fechas[n].attributes.mail;
   ventana.desc.text = fechas[n].firstChild.nodeValue;
   ventana.enviar.onRelease = function() {
      fechas[n].attributes.fecha = ventana.fech.text;
      fechas[n].attributes.lugar = ventana.luga.text;
      fechas[n].attributes.pagina = ventana.pagi.text;
      fechas[n].attributes.mail =   ventana.mail.text;
      // Contador de líneas???
      fechas[n].firstChild.nodeValue = ventana.desc.text;
      this._parent.removeMovieClip();
      cargar_agenda(pag_actual);
   }
   ventana.borrar.onRelease = function() {
      ventana.fech.text = "";
      ventana.luga.text = "";
      ventana.pagi.text = "";
      ventana.mail.text = "";
      ventana.desc.text = "";
   }
   ventana.cancelar.onRelease = function() {
      this._parent.removeMovieClip();
   }
}

borrar_fecha = function(n) {
   fechas[n].removeNode();
   cargar_agenda(pag_actual);
   cant_fechas--;
}   
//
// Borra el XML, crea uno nuevo y función onLoad.
// Carga el XML nuevo y muestrea.
lista.cargarXML.onRelease = function() {
   delete lista_de_fechas;
   _root.lista_de_fechas = new XML();
   lista_de_fechas.onLoad = function(success:Boolean) {
      carga_XML();
      carga_pagina_actual();
   }
   lista_de_fechas.load("conciertos.xml");
   load_texto.load("conciertos.xml");
   que_archivo.text = "XML original - original XML";
}
lista.grabarXML.onRelease = function() {
   texto_para_grabar = "<?xml version='1.0' encoding='UTF-8'?><conciertos>";
   for (i= 0; i<lista_de_fechas.firstChild.childNodes.length; i++) {
      texto_para_grabar += lista_de_fechas.firstChild.childNodes[i].toString();
   }
   texto_para_grabar += "</conciertos>";
   lista.estado_txt.text = "Enviando XML...";
   enviarXML();
}
//
//
var envio_lv:LoadVars = new LoadVars();
var recibir_lv:LoadVars = new LoadVars();
enviarXML = function() {
   envio_lv.texto = texto_para_grabar;
   envio_lv.sendAndLoad("editor.php", recibir_lv, "POST");
}
recibir_lv.onLoad = function(exito) {
   if (exito) {
      lista.estado_txt.text = this.estado;
      load_texto.load("conciertos.xml");
      que_archivo.text = "XML guardado - saved XML";
      //delete texto_para_grabar;
   } else {
      lista.estado_txt.text = "Error...";
   }
};
//
// Cuadros para mostrar cómo anda...
onEnterFrame = function() {
   mostrarXML.text = lista_de_fechas
}

var load_texto:LoadVars = new LoadVars();
load_texto.onData = function(src:String) {
   mostrarFILE.text = "";
   mostrarFILE.text += src;
};
//
//
// Función cuenta Enters (por ver)
function charc( cadena:String, char:String ):Number {
   var resultado:Number = 0;
   var ini:Number;
   while( (ini = cadena.indexOf(char)) > 0 )    {
      cadena = cadena.substr( ini + 1 );
      resultado++;
   }
   return resultado;
}

PHP:

Código :

<?php
$archivo = "conciertos.xml";
$texto = get_magic_quotes_gpc()
   ? stripslashes($_POST['texto'])
   : $_POST['texto'];
file_put_contents($archivo, $texto); // if PHP5
echo "estado=ok";
?>

XML:

Código :

<?xml version="1.0" encoding="UTF-8"?>
<conciertos>
<concierto mail='' pagina='' lugar='' fecha='10'>111</concierto>
<concierto mail='' pagina='' lugar='' fecha='20'>222</concierto>
</conciertos>

Por Mario Mey

40 de clabLevel



 

Castelar, Argentina

firefox
Citar            
MensajeEscrito el 21 Mar 2011 06:33 pm
Muy bueno, estoy pobando con los tutoriales de XML y no puedo dar para que por actionscript lea los nodos del.
Alguien me podría dar una mano?
graciass

Por Kaiowas

3 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Mar 2011 07:26 pm
Hola Kaiowas. Te cuento la situación actual de estos códigos... y MI situación actual. Este código evolucionó mucho. Ahora, dentro del mismo editor, podés modificar XMLs de texto (como fechas de bandas), pero también podés subir fotos, que son reescaladas al tamaño que vos necesites y crea los XMLs necesarios para ser leídos desde una galería dinámica, dentro de la página. Sí... está buenísimo. De la misma manera se pueden subir mp3 para una lista de temas.

La actualidad es... ya casi no estoy trabajando en Flash. Es más, no quiero dedicar más tiempo a esto. Sí le quiero dedicar tiempo a mis proyectos artísticos-tecnológicos, como es Pinokio 3d. Y para esto, empecé a aprender Python, que es el lenguaje que usa el Blender.



Otra cosa... este código está en ActionScript 2... ya algo anticuado. Creo que ya todos están trabajando en 3, ¿no es así?

Tengo ganas de publicar, liberar este código para que otros lo usen y/o modifiquen y/o pasen a AS3 (estaría buenísimo). Yo ni en pedo lo hago. El tema es que para publicarlo o liberarlo, este código debería estar bien documentado... cosa que, actualmente, no lo está. Además... debería buscar la última versión, acomodarla, hacerle unos últimos arreglos, etc, etc, etc. Y encima, tengo que bootear en el choto Windorts para hacerlo... y ahora que estoy en Linux, no me da ni ganas.

Dentro de poco (uno o dos meses) tengo que trabajar en unas páginas que tengo que usar estos códigos. Es posible que aproveche para arreglarlos, documentarlos y publicarlos. Si lo tuyo es con mucho apuro... I'm zorry, I'm perry.

Saludos y abrazos.

Por Mario Mey

40 de clabLevel



 

Castelar, Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.