Aide programmation galerie xml - Flash/ActionScript - Programmation
Marsh Posté le 19-11-2007 à 11:03:04
Bonjour, oui tu devrais créer une fonction pour charger ton xml, à laquelle tu passeras un parametre qui correspond au bon fichier.
Code :
|
et dans tes boutons, tu appelles simplement cette fonction :
Code :
|
Marsh Posté le 19-11-2007 à 22:28:32
J'ai essayé, mais du coup je rencontre d'autres pbs... D'abord l'attribution par défaut de la valeur "webdesign.xml" à $xmlFile, car maintenant que mon onload est dans une fonction, elle n'est plus appelée directement au départ... et j'ai aussi des trucs bizarres car je charge les données du xml dans des tableaux, et lorsque je passe d'un xml à l'autre, on dirait qu'il n'ecrase pas les données deja presentes dans les tableaux... Bref, tout ça pour en venir à une autre question, méthodologique :
Est ce qu'il vaut mieux (lire le XML, charger dans des tableaux, afficher les donnees) et recommencer à chaque fois que l'utilisateur clique dans le menu pour changer la galerie OUBIEN (lire tous les xml, tout charger dans des tableaux, afficher les donnees) et réaffecter les valeurs des tableaux aux zones d'affichages à chaque fois que l'utilisateur clique dans le menu ?
Euh... je suis claire là ? Merci beaucoup pour vos précieuses aides.
Marsh Posté le 20-11-2007 à 10:07:50
Oui tu as raison il vaut mieux charger les xml une seule fois, pendant le chargement du site par exemple, ou au clique dans le menu mais en vérifiant si le XML existe déja, auquel cas tu ne le recharges pas. Mon exemple était seulement pour illustrer l'idée qu'il faut que les boutons du menu lancent véritablement une action, et ne se contentent pas seulement d'attribuer une nouvelle valeur à une variable comme tu faisais.
L'architecture de ton movie va beaucoup influencer comment tu vas programmer, et vice versa, je ne peux pas vraiment t'aider plus que ça. Juste pour mention, perso je met des $ devant les paramètres de mes fonctions, mais jamais devant les autres variables, mais c'est seulement une habitude à moi, ça me permet de savoir plus rapidement ce qui est une variable et ce qui est un paramètre. Concernant tes tableaux, c'est normal qu'ils gardent une partie des valeurs précédentes si il contenait plus d'éléments avant. Il faut que tu le vides avant de le remplir à nouveau :
Code :
|
++
Marsh Posté le 20-11-2007 à 20:33:17
Il n'y a pas d'architecture parfaite en Flash, mais en général il vaut mieux fonctionner en séparant les couches données/vue/evenements.
Il faut savoir que la volumétrie d'un XML est faible. J'ai été très fan des chargements alambiqués très économes en bande passante (du genre un XML = un produit, 500-600 XML sur le serveur avec des "cache hits" ultra-sophistiqués) pendant longtemps, jusqu'à en revenir récemment, mes estimations de charge serveur étaient systématiquement sur-évaluées.
Comprendre "le XML, ça pèse que dalle".
Donc, il vaut mieux charger tout ton XML en une seule fois, tout au début, le parser dans une structure légère du type hashtable, et faire un delete sur ton XML (l'objet XML est le plus gourmand en mémoire dans toute l'API). Ne t'embête pas avec des archis du type un XML = une rubrique, ça ne sert à rien, tu peux tout mettre dans le même.
D'un point de vue architectural, tu as deux solutions :
- la méthode old-school: tu planques toute la logique de chargement dans un clip invisible au début de ton .swf, tu gardes cet objet sur toute ta timeline, et quand tu cliques sur ton bouton, tu accèdes à ton XML parsé en tapant vers ce clip invisible.
- la méthode du "vrai Marine": une couche de données séparée du reste, autrement dit une classe "ImgBrowserDataXML" qui ne sert qu'à charger les données. Idéalement elle implémente une interface "IImgBrowserData", ce qui permet de dériver cette couche vers d'autres technos sans toucher au reste du code d'affichage.
Comprendre "le XML, ça pèse que dalle, mais le Remoting, ça pèse un angström de que-dalle".
Citation : Juste pour mention, perso je met des $ devant les paramètres de mes fonctions |
Historiquement les arguments sont préfixés par 'p' (= 'parameters'), le '$' est un caractère spécial donc moi j'évite. En plus le '$' ça fait Péhachpé, et le Péhachpé c'est pour les paÿdaÿ. Mais c'est un avis purement personnel.
Marsh Posté le 21-11-2007 à 09:37:32
Et à part ça, la vie ça va ?
Marsh Posté le 21-11-2007 à 15:32:16
Merci Antika pour cette réponse on ne peut plus... précise. J'apprécie l'effort de communication de tes connaissances. Cependant, ça reste encore beaucoup trop evolué pour moi ! Mais ça m'encourage, il faut viser haut pour progresser n'est ce pas ? alors merci encore.
Pour le coup de "planquer mes données dans un movie clip vide accessible des le debut" . Est ce que ca ne revient pas au même (à mon niveau) de tout charger dans des tableaux ?
D'ailleurs, à ce propos, je commence à avoir bcp de tableaux là, alors je pense faire un tableau à plusieurs dimensions, un par xml (je sais que tu m'as conseillé de tout mettre dans le meme xml mais je ne vois pas comment faire encore alors on verra plus tard).
Ca donnerait un truc du genre :
i = nb de noeuds
j = nb de valeurs par noeud
for (i=0, i<nbdenoeuds, i++){
for (j=0, j<nbdevaleurs, j++)
{
galerie[i][j] = myXML[i].childNodes[j].attributes.value;
}
}
Ca se fait ça où je m'enflamme un peu là ??
Marsh Posté le 22-11-2007 à 04:42:25
Oui ca ce fait.
Apres je suis surement pas un exemple vu que j'arrive toujours pas a trouver une methode qui me convient tout a fait. J'ai essayé ca, Xpath, AMFPHP ... je sais pas.
Sinon pour tout mettre dans un seul fichier, voici un exemple qui pourra peut etre t'inspirer :
http://zedlefou.free.fr/Band/blog.xml
C'est la structure d'un blog, donc assez riche et les differentes parties sont toutes au meme endroit.
Apres, je vois pas trop ce qui te pose probleme
Marsh Posté le 22-11-2007 à 11:14:36
Merci pour ton exemple ! Je ne savais pas que les structures des noeuds pouvaient être différentes... c'est pourquoi je voulais tout mettre dans des fichiers différents ! Du coup ça doit compliquer pas mal la lecture du fichier...
En tout cas, j'ai un autre problème maintenant... Pour résumer, voilà où j'en suis :
J'ai divisé toutes les actions en trois fonctions :
-chargeXML (pXML:XML) : Array
//prends un fichier XML en entrée et retourne un tableau contenant les données.
- afficheGalerie (pchoixrubrique:String)
//prends en entrée la rubrique choisie par l'utilisateur, va chercher le tableau correspondant, assigne les données du tableau dans les champs dynamiques
- afficheRubrique (tab:Array)
//est appelée par afficheGalerie pour mettre les bonnes données dans les champs selon le tableau passé en paramètre
Au tout début de l'animation, je créée mes tableaux de données comme ceci :
Code :
|
Pour voir si ça marche, je regarde le tableau juste après l'avoir créé :
Code :
|
Et là il me répond "0" alors que lorsque je trace, à l'intérieur de ma fonction chargeGalerieXML, ca marche !
Ce qu'il y a c'est qu'on dirait qu'il execute les trace avant même d'être revenu de la fonction chargeGalerieXML.... comment faire pour ordonnancer tout ça s'il vous plait ?
Marsh Posté le 22-11-2007 à 12:09:34
Faudrait que tu montres ta fonction chargeGalerieXML ...
Marsh Posté le 22-11-2007 à 12:21:30
Zedlefou a écrit : Faudrait que tu montres ta fonction chargeGalerieXML ... |
Mais avec plaisir
Code :
|
Marsh Posté le 22-11-2007 à 13:23:52
Oui, en fait ton tableau ne peut pas recup les donner puisqu'il faut le temps que le xml se charge. (3fois rien mais ca suffit pour faire chier)
Normalement si tu envois ton tableau avec ca devrait marcher :
"chargeGalerieXML("Galerie_webdesign.xml", Tsites);"
Ta fonction
"function chargeGalerieXML(galerie:String, tab:Array):Array{"
du coup tu peux virer ca
var tab:Array = new Array();
Sinon la methode plus simple c'est de placer ton tableau sur _global :
_global.Tsites = new Array();
Ensuite tu lances ta fonction qui elle charge les données dans
_global.Tsites
Et voilou
Marsh Posté le 22-11-2007 à 13:39:23
Ca fait pareil...
Meme en passant Tsites en paramètre, il ne remplit pas le tableau...
Je te remets le code :
Code :
|
Code :
|
Marsh Posté le 22-11-2007 à 16:15:57
Bon, je craque, j'ai créé une fonction par xml à charger (donc une par tableau à créer)... PFffFFFFFFFFFFFFF moi qui était si contente d'avoir l'impression de commencer à capter quelquechose...
Antika va vraiment penser que je suis une looseuse mais je craaaaaque !
En tout cas si vous avez la solution à mon problème je serais ravie de l'adapter et de virer ces trois fonctions parceque franchement, c'est de l'anticode !
Marsh Posté le 22-11-2007 à 19:50:13
Citation : Antika va vraiment penser que je suis une looseuse mais je craaaaaque ! |
Meuh non, je te le fais demain, là c speed.
Marsh Posté le 23-11-2007 à 04:21:01
Grosso merdo c'est ca. Il faut juste bien utiliser _global.
Code :
|
Ca devrait marcher. La petite difficulté ici, c'est de ne lancer aucune action tant que le XML n'est pas entierement chargé et entré dans ton tableau.
Pour ca, soit tu places la fonction qui vient ensuite juste apres > trace( _global.Tsites.length);
soit tu fais un dispatchEvent et tu mets un ecouteur sur ta scene pour savoir ou tu en es. (c'est le mieu)
Marsh Posté le 23-11-2007 à 12:51:09
Salut Zed,
Le truc c'est que la fonction chargeGalerieXML a été créée pour pouvoir être appelée plusieurs fois, avec pasage en paramètre du tableau à remplir et du fichier xml... ce que je ne voulais pas faire c est justement mettre "Tsites" dans la fonction... tu vois ce que je veux dire ? Car là ca revient au même que de créer une fonction par tableau à remplir...
Marsh Posté le 23-11-2007 à 15:34:22
ah oui chui con, bon ben attend la reponse d'Antika alors
Je connais surement la soluce mais la, ca vuient pas dsl ...
Marsh Posté le 23-11-2007 à 17:14:47
OK. Merci beaucoup de m'aider en tout cas.
Pour résumer, tout marchait bien jusqu'à ce que ma fonction :
Tsites = chargeGalerieXML("Galerie_webdesign.xml" );
refuse de remplir les données de son "tab" dans Tsites. Tab était le tableau créé à l'interieur de la fonction, un tableau à deux dimensions tab[i][j].
La déclaration de Tsites :
var Tsites:Array = new Array();
Peut être est ce parcequ'il faudrait que j'initialise la structure de Tsites pour qu'il comprenne l'affectation
Tsites = tab ?
Marsh Posté le 23-11-2007 à 17:54:03
Code :
|
L'interface c'est :
- XMLData.addEventListener : cf. aide EventDispatcher Adobe
- XMLData.removeEventListener : cf. aide EventDispatcher Adobe
- 2 événements : onGalleryDataError / onGalleryDataLoad,
- XMLData.getCategory( <nom_de_categorie> ):Array : renvoie les données d'une catégorie. Chacun de tes boutons doit implémenter cette méthode. C'est tout.
- j'ai essayé l'initialisation paresseuse avec un __resolve, mais ça fait planter l'EventDispatcher Fuck le code propriétaire.
Le XML doit être comme ça :
Code :
|
Marsh Posté le 26-11-2007 à 12:17:00
Ouuaah la claaasse (attention jeu de mot)
Marsh Posté le 26-11-2007 à 12:46:48
Au fait quel est l'interet d'utiliser un objet plutot qu'un tableau ?
Et quel l'interet du Delegate ici ? (dsl, j'ai jamais vraiment trouvé d'utilisation a cette classe )
Et dans la politique du decoupage data/events/display, c'est une idee ou tu melanges les 2 premiers ?
Marsh Posté le 19-11-2007 à 10:18:17
Bonjour,
J'essaie de construire ma galerie toute seule comme une grande. Je rencontre un petit problème alors j'aimerais vous indiquer ma démarche pour que vous me disiez si je vais dans la bonne direction ou pas...
J'ai trois types de galeries différentes "dessin/peinture/sculpture (disons "autre" ), web et print. Les images auront la même taille, même nav etc. le code pour chaque galerie sera donc le même.
J'ai donc choisi de faire une variable "galerie_xml" qui prendra le nom du fichier.xml a charger selon le choix fait dans le menu.
Ensuite, je charge le "bon" xml avec :
Jusque là ca se fait non ?
Comment faire pour que mon fichier xml se recharge a chaque clic dans le menu ?
je crée une fonction "charge galerie" qui serait appelée dans le code de chaque bouton ?
Je suis sceptique... A votre avis ?