Ayuda con menú / submenú (Flash + XML)
Buenas y lluviosas... Estoy al borde del quiebre con esto, no entiendo cuál es el problema.
Estoy haciendo una galería de obras, XML + Flash. Tengola organizada por años y en cada año expos, dentro de cada expo las obras.
La idea es q tenga un menú a la izquierda con los años y al darle all botón de un año me aparezcan a la izquieda botones con las expos de ese año (ver comment en el AS). Algo así:
http://img291.imageshack.us/img291/6261/imagen2wg9.gif
El problema es que la película carga con los botones abiertos, como en la imagen, pero la idea es q los botones de Expo aparezcan solo al llamarlos.
En resumen, el XML es
<code>
<vc>
<2000 type="fecha">
<expo type="expo">
<nombre>Expo 1</nombre>
<obra type="obra">
...
</obra>
<obra type="obra">
...
</obra>
</expo>
<expo type="expo">
<nombre>Expo 2</nombre>
...
</expo>
</2000>
<2001 type="fecha">
<expo type="expo">
<nombre>Expo 1 2001</nombre>
...
</expo>
</2001>
</vc></code>
El AS, un poquito tomado prestado de Kirupa y resumido es:
<code>
function CreateMenu(menu_xml) {
var items = menu_xml.firstChild.childNodes;
for (var i = 0; i<items.length; i++) {
if (items[i].attributes.type == "fecha") {
var year = items[i].childNodes[0].parentNode; // AÑos
var item_mc = menu_mc.attachMovie("menu_item", "item"+item_count, item_count);
item_count++;
item_mc.textoBoton_txt.text = year.nodeName;
item_mc.onRelease = CreateMenuExpos(year); // Aquí intento crear el menú de Expos.
}
}
}
function CreateMenuExpos(menuExpos_xml) {
var expos = menuExpos_xml.childNodes; // EXPOS
for (var i = 0; i<expos.length; i++) {
var expo = expos[i].childNodes[0].parentNode;
var expo_mc = menu_mc.attachMovie("menu_item", "expo"+item_count, item_count);
item_count++;
expo_mc.textoBoton_txt.text = expo.firstChild.firstChild;
}
}
var vc_xml = new XML();
vc_xml.ignoreWhite = true;
vc_xml.onLoad = function(success) {
if (success) {
CreateMenu(this);
} else {
trace("Error");
}
};
vc_xml.load("vc.xml");</code>
Alguna idea??
1000MillonGracias.
danielsandesign
BUeno, emm. Yo estoy intentando enterarme de algo, casi lo voy logrando pero todavía no le he metido mano al proyecto... Cuando me ponga me daré cuenta que no he entendido nada.
Por eso este finde cuando llegue al estado de nervios adecuado os torturaré con preguntas tontas. jijij =)
ventdaval
hace poquito me hice una funcioncilla muy muy basica pero que te puede servir:
<code>function nodes2obj(childs) {
var obj=new Object();
for(var i in childs) {
obj[childs[i].nodeName]=childs[i].firstChild.nodeValue;
}
return obj;
}
//llamamos:
var obj=nodes2obj(xml.firstChild.childNodes);
trace(obj.titulo);
trace(obj.texto);
etc...
</code>
Por supuesto no puedes acceder a los atributos ni subnodos, pero te puede servir para hacer algo mas complejo, o simplemente usarla asi simplita cuando lo necesites ;)
hardface
Lo bueno que tiene el componente ese es que los llamas por su etiqueta, con lo cual hasta 'trogloditas del código' como yo pueden parsear y referenciar al XML. Es lo mejor que le veo.
Usuario desconocido
Eso no esta implementado, aunque no seria dificil. La clase esta pensada para usarla en bucles y pillar todos los datos asi.
hardface
Así tb llamas a los nodos del XML por su nombre de label ¿? en vez de firstchild... ¿?
danielsandesign
Bueno, tengo con qué entretenerme... Mientras tanto podéis ir decidiendo qué compensación queréis. xD
Usuario desconocido
En serio, hice esa clase hace 1 anyo, portarla a AS3, fue cosa de medio minuto. Y me va de lujo. Te lo tienes que imaginar como si es una aranya y la haces subir y bajar. Si te lo imaginas asi, con un par de Fors pillas toda la info que necesitas. Pondre un ejemplo de uso tambien...
<code>
import com.mrdoob_as2.parsers.xmlParser;
myXML = new xmlParser('myXMLfile.xml');
myXML.loadXML();
onEnterFrame = function(){
if(myXML.checkIfLoaded() == true) {
delete this.onEnterFrame;
myXML.moveToChild(0);
for(var x = 0; x < myXML.getLenght(); x++){
myXML.moveToChild(x);
trace(myXML.getAttribute("title"));
myXML.moveToParent();
}
} else {
trace("loading xml");
}
}
</code>
hardface
Ricardo makinón! ese libro de AS 3.0 de Moock en el horno lo huelo desde aquí! jodío Moock ese si que lleva desde flash 1.0 dándole...
Usuario desconocido
Te regalo mi clase :D
<code>
class com.mrdoob_as2.parsers.xmlParser extends Object {
private var file_name:String;
private var object:XML;
private var spider:XMLNode;
private var child:Number;
private var attribute:String;
function xmlParser (file_name:String) {
this.file_name = file_name;
}
function loadXML(){
this.object = new XML();
this.object.ignoreWhite = true;
this.object.load(file_name);
}
function checkIfLoaded(){
this.moveToRoot();
return this.object.loaded;
}
function getLenght(){
return this.spider.childNodes.length
}
function moveToChild(child){
this.spider = this.spider.childNodes[child];
return this.spider;
}
function moveToParent(){
this.spider = this.spider.parentNode;
}
function moveToRoot(){
this.spider = this.object;
}
function getAttribute(attribute){
return eval("this.spider.attributes."+attribute);
}
function getNodeName(){
return this.spider.nodeName;
}
function getNodeValue(){
return this.spider.nodeValue;
}
function toString(){
return this.spider;
}
}
</code>
danielsandesign
Gracias Hardy, ahora me lo estudio y a ver si logro algo.
La verdad que el que se inventó el manejo de XML con actionscript tenía ganas de putearnos, es horrendo. Bueno, como el actionscript.
hardface
Tio, yo utilizo este componente de Moock creo que era...
http://www.youpayimake.com/extras/xml_loader.fla
bájatelo... es MX 2004... viejo pero rula... vete al label XML... abajo tienes los parámetros del componente: archivo XML que ha de leer, nombre que tendrá el objeto XML tuyo y fotograma donde saltará cuando lo cargue...
Así luego haces referencia a los nodos por su 'labels', no por firstChildNode... su vieja... eso nunca fuí capaz de hacerlo! jeje
Por ejemplo...
boton.xmlRef = mydata.lang.seccion[i];
boton.nombre =mydata.lang.seccion[i].id;
Supongo que con AS 2.0 y clases ya será más fácil...
danielsandesign
Alguien tendrá un ratito para echarme una mano con esto?
Si mi código es incompresible o inútil por favor decirlo y empiezo de cero. Cualquier ayudita se agradecerá con favores sexuales o cañas (a elección).
Thnx!
danielsandesign
Nadi nunca nada, no? :(