RECHERCHE

Plan du site

BOURSE

 

RUBRIQUES

 
 TUTORIEL FLASH 
Flash MX : construire un lecteur de fichiers RSS (2)
Amélioration de notre lecteur, avec la possibilité de lire des flux en provenance d'autres sites. (25/05/2004)

Comme nous l'avions annoncé lors de notre premier article sur le sujet, nous revenons ici sur notre lecteur RSS pour l'améliorer de manière substantielle, à savoir l'ouvrir sur le monde plutôt que de le limiter au serveur sur lequel il repose.

Ce qui change
Notre première version affichait très bien le flux RSS que nous lui donnions (même si notre analyseur XML était des plus basiques), mais se limitait aux flux en provenance du même serveur, puisque Macromedia a limité la capacité de charger des documents en provenance d'autres domaines.
Plus spécifiquement, le Flash Player 6 a introduit un "bac à sable" de sécurité avec les restrictions suivantes :
1) une animation placée sur un domaine ne peut pas charger de données depuis un autre domaine,
2) une animation placée sur un domaine ne peut pas accéder aux propriétés/méthodes d'une animation placée sur un autre domaine.
Pour la Flash Player 7, ces restrictions ont été augmentées, et désormais l'animation doit charger des données sur son propre sous-domaine uniquement (par exemple, www).
A cela, deux solutions : créer un fichier crossdomain.xml, ou passer par un script serveur (ou "proxy"). C'est la deuxième que nous avons choisie, plus spécifiquement la version PHP, que nous avons modifiée comme suit :

[proxy.php]
<?php
//note that this will not follow redirects
readfile($adresseFlux);
?>

Pourquoi ce choix plutôt qu'un autre ? Parce que nous avons ici décidé de ranger les adresses des différents flux que nous voulons rendre accessibles par défaut dans un nouveau fichier XML, stocké lui au même niveau que l'animation :

[flux.xml]
<?xml version="1.0" encoding="iso-8859-1" ?>
<flux>
  <rss nom="JDN Développeurs" addr="http://www.journaldunet.com/developpeur/jdnetdev.xml" />
  <rss nom="Mezzoblue" addr="http://www.mezzoblue.com/rss/index.xml" />
  <rss nom="StopDesign" addr="http://www.stopdesign.com/index.xml" />
  <rss nom="What Do I Know ?" addr="http://whatdoiknow.org/index.xml" />
  <rss nom="Jeffrey Zeldman" addr="http://www.zeldman.com/feed/zeldman.xml" />
</flux>

Passer par le proxy nous permet donc de ne mettre à jour qu'un seul fichier pour la gestion tant de notre bookmark de flux que des flux auxquels notre animation peut accéder.


Ce qui change... coté Flash MX

Passons maintenant en revue les modifications apportées à notre lecteur RSS, à commencer par l'interface.
Nous laissons en place le champ texte adresseFlux, qui continue d'être la zone centrale pour l'adresse du flux, et créons une sorte de bookmark pour nos flux sous la forme d'un composant ComboBox, dont nous nommerons l'occurrence listeFlux. Le reste de l'interface n'est pas modifié.

Le code, de son coté, subit quelques ajouts, a commencer par le code nous servant à charger flux.xml, et à placer le contenu de ce fichier dans listeFlux a l'aide de sa méthode addItem().

flux_xml = new XML();
flux_xml.ignoreWhite = true;
flux_xml.onLoad = function(ok)
  {
  if (ok = true)
    {
    flux = this.firstChild.childNodes;
    premier = this.firstChild.firstChild;
    enCours = premier;

    for (i = 0; i < flux.length; i++)
      {
      listeFlux.addItem(enCours.attributes.nom, enCours.attributes.addr);
      enCours = enCours.nextSibling;
      }
    }
  };
flux_xml.load("flux.xml");


Nous ajoutons donc chaque attribut nom de balise rss de notre fichier flux.xml à une étiquette (label) de listeFlux, et chaque attribut addr de cette même balise au champ data de cette même étiquette.
Faisons maintenant en sorte que le choix d'un champ dans cette liste remplisse addresseFlux et charge ce flux :

listeFlux.setChangeHandler("selectFlux");
function selectFlux(liste)
  {
  adresseFlux = liste.getSelectedItem().data;
  chargerFlux();
  }

Nous plaçons donc le contenu du champ data de l'étiquette choisie dans adresseFlux, et lançons la fonction chargerFlux(), qui rappelons-le lance le chargement de l'adresse indiquée dans adresseFlux.
Cette fonction s'est d'ailleurs adaptée pour pouvoir accéder à notre proxy.php autant de fois que nécessaire :

function chargerFlux()
  {
  rss_xml.load("proxy.php?adresseFlux=" + escape(adresseFlux) + "&" + Math.random);
  }

  Forum

Réagissez dans les forums de JDN Développeurs

Plutôt que de charger directement le flux local, nous chargeons notre proxy PHP en lui fournissant comme variable le contenu de addresseFlux, que nous aurons pris soin d'échapper pour éviter les caractères dérangeants, et auquel nous ajoutons un Math.random pour s'assurer que plusieurs sélection de ce flux ne ramènerons pas toujours le même flux stocké dans le cache.

Le résultat est en ligne, et nos sources sont disponibles sous forme de fichier .zip.

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 



Votre avis sur cette publicité