Petit hack avec SWFAddress

Portrait de titouille

Tout d'abord, qu'est-ce que SWFAddress :

En 2 mots, le St Graal du développeur Flash, ou comment pouvoir naviguer dans un site Flash non seulement avec les boutons précédent / retour et actualiser, mais également de pouvoir atteindre une page précise en spécifiant un ou des paramètres dans l'url.

Ce qui permet par exemple de pouvoir créer un "plan du site" en version html, qui sera lue par les moteurs de recherches et pourront proposer des liens directs dans les différents contenus du site.

La logique est un peu bizarre à appréhender, car il est nécessaire de coder d'une manière peu conventionnelle :

A la place de coder pour déclencher des actions, nous avons un gestionnaire "SWFAddress.onChange" qui se déclenche à chaque fois que la valeur de l'url est modifiée. Il faut donc modifier la valeur de l'url, ce qui va déclencher le gestionnaire, et nous devons récupérer la valeur d'url pour continuer le processus en affichant la page adéquate, avec les transitions adéquates.

Pour de plus amples informations sur les méthodes, vous trouverez une bonne documentation fournie par Kenny, merci à lui Smile

Mon premier test a été avec une galerie d'image liée à une page Drupal. Une fois la page configurée, à chaque fois que j'y ajoute une image, elle est affichée dans ma galerie. ça a vite été une galère pour gérer les aller et retour dans l'affichage des miniatures ainsi que leur activation. J'avais commencé à développer sans vraiment comprendre les subtilités, j'ai ensuite rapidement compris mes erreurs. Peut-être que la galerie était un peu complexe pour un premier essai, lol. Mais au final, elle fonctionne très bien et est modulable, le résultat est plus que satisfaisant.

Bref. Second test. Dans le site que je dois monter actuellement, mis à part la galerie, je dois également intégrer 3 autres animations. Tout d'abord un simple visualisateur d'image qui utilisera le même principe de construction que la galerie mais sans SWFAddress.
Ensuite, ça se complique :

Tout d'abord, j'ai un bloc qui doit apparaitre sur toutes les pages publiques. Ce dernier va contenir une animation affichant 3 boutons, appelons la "module". Je passe à cette animation un paramètre correspondant au nom de la page via swfobject. Un fichier de configuration contient également un nom de page qui est récupéré par le swf.

Sur click d'un des boutons, je teste si le nom de la page correspond au nom de page du fichier de config : j'ai 2 choix :

1. ce n'est pas le cas, alors je redirige (getURL) vers la page "./apparts#x" ou x correspond au numéro du bouton (1, 2 ou 3)

2. c'est le cas. Alors je modifie simplement l'url via la méthode SWFAddress.setValue, puis ceci déclenche le gestionnaire qui va permettre de rendre le bouton en mode "actif".

Une fois redirigé sur la page "apparts", le module se recharge, récupère la valeur dans l'url et passe le bon bouton en mode actif.

Sur cette page se trouve une seconde animation flash qui est l'interface principale du module. Cette dernière va également se charger, puis son propre gestionnaire SWFAddress.onChange est déclenché, et il récupère les infos nécessaires dans la base de données Drupal pour les afficher.

Donc si je clique sur un bouton du module à ce moment-là, l'adresse de l'url serait sensée changer, le module devrait déclencher son gestionnaire et activer le nouveau bouton. L'animation principale devrait quant à elle déclencher son gestionnaire et aller chercher les données...

Malheureusement, ça n'a pas fonctionné... L'url ne change pas... le gestionnaire du module est délenché et le nouveau bouton activé. Le gestionnaire de l'interface principale est par contre déclenché 2 fois de suite : la première fois avec la nouvelle valeur qui devrai être dans l'url, puis la seconde fois avec la valeur qui n'a pas changé...

Je ne sais pas pour quelle raison, mais si je place une connexion locale qui envoie l'information du bouton à l'interface principale et que c'est cette dernière qui se charge de modifier l'url, alors cette fois-ci ça fonctionne.

J'ai par contre un peu par hasard trouvé une manière de contourner le problème peu banale.

Rappelez-vous : j'ai tout d'abord expliqué que j'avais un module auquel je passais le nom de la page actuelle ainsi que le nom de la page contenant l'interface principale.

J'ai ensuite enchainé avec l'explication concernant la réaction des boutons selon si on était sur la même page que l'animation principale ou non.
Je voulais tester si la même réaction se provoquait en plaçant le processus sur la page "galery" au lieu de "apparts" (modification dans le fichier de configuration).

J'étais toujours sur la page "apparts", j'ai actualisé, puis j'ai testé le swf. Ce dernier, n'était pas sur la page "galery", appelle donc la première solution expliquée auparavant, c'est à dire getURL( "./apparts#b" + index );

Et la, magie, ça fonctionne Laughing out loud

Je ne sais pas pourquoi le setValue ne fonctionne pas avec 2 animations comme ça, peut être leur ordre d'apparition... Mais en tout cas, j'ai pu constater qu'un simple getURL peut déclencher la même chose qu'un setValue foireux.

Toujours bon à savoir Wink

EDIT :

Bon, je n'ai rien dit. Le problème persiste tout de même, le getURL fonctionne pour modifier l'info dans l'url, mais cette fois c'est le gestionnaire du module qui ne se déclenche plus (seulement lors du premier chargement de la page).

J'ai fini par utiliser des connexions locales dans les 2 sens. La première du module pour déclencher un trigger dans l'interface principale, qui va modifier l'url de la page, puis la méthode onChangeAdress de l'interface va se déclencher et lancer le processus qui va comprendre un nouvel envoi en connexion locale, cette fois-ci à partir de l'interface en direction du module, pour lui indiquer que le traitement a bien commencé et que le bouton clické peut être "activé".