IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Insérer plusieurs flux RSS dans un site web


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut [SimpleXML] Insérer plusieurs flux RSS dans un site web
    Bonjour,

    Je suis en train de créer un nouveau site internet d'actualité sur un club de foot. Outre les articles que je vais rédiger, je souhaiterai y ajouter des liens vers des articles parus sur les journaux locaux.

    Pour cela, je souhaiterais regrouper plusieurs flux rss, celui de l'équipe.fr, de francefootball.fr, de la voix du nord, etc... Je voudrais trier les articles par date et les afficher à la suite les uns des autres.

    J'ai effectué quelques recherches sur le web, j'ai trouvé comment lire un fichier rss mais je n'ai pas trouvé comment lire plusieurs flux en même temps.

    Voici la fonction qui me permet de lire un flux rss :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    function lit_rss($fichier,$objets) {
     
        // on lit tout le fichier
        if($chaine = @implode("",@file($fichier))) {
     
            // on découpe la chaine obtenue en items
            $tmp = preg_split("/<\/?"."item".">/",$chaine);
     
            // pour chaque item
            for($i=1;$i<sizeof($tmp)-1;$i+=2)
     
                // on lit chaque objet de l'item
                foreach($objets as $objet) {
     
                    // on découpe la chaine pour obtenir le contenu de l'objet
                    $tmp2 = preg_split("/<\/?".$objet.">/",$tmp[$i]);
     
                    // on ajoute le contenu de l'objet au tableau resultat
                    $resultat[$i-1][] = @$tmp2[1];
                }
     
            // on retourne le tableau resultat
            return $resultat;
        }
    }
     
    $rss = lit_rss("http://www.lavoixdunord.fr/feed/206",array("title","link","pubDate"));

    Je ne sais pas comment faire pour ajouter un deuxième, voir un troisième flux rss. Ensuite je souhaiterais les trier par date et enfin sélectionner les 10 dernièrs articles tous flux confondus.

    Merci de m'aider les amis !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    On ne parse pas à la main, il y a des classes pour ça.
    Pour le reste il suffit de repeter la même opération pour chaque flux et de trier le tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $feeds = array(
      'http://www.lavoixdunord.fr/feed/206',
      'http://www.lequipe.fr/rss/actu_rss.xml'
     );
     
    // on recolte tout
    foreach ($feeds as $url) {
      $rss = simplexml_load_file($url);
      foreach ($rss->channel->item as $item) {
         $data[] = array('title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
      }
    }
     
    // trie par date
    foreach ($data as $key => $row) {
        $date[$key]  = $row['date'];
    }
    array_multisort($date, SORT_DESC, $data);
     
    // les 10 derniers
    $last_data = array_slice($data, 0, 10);
    echo '<ul>';
    foreach ($last_data as $value) {
      echo '<li><a href="' . $value['link'] . '">' . $value['title'] . '</a></li>';
    }
    echo '</ul>';
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    OK. Merci. Ca à l'air de marcher. Le seul souci c'est que les news de la voix du nord ne s'affichent seulement qu'après le 100 premières news de l'équipe.
    D'autre part, je n'arrive pas à afficher la date des news.

    Et... Tu pourrais m'expliquer un peu ton code. Parce que je n'y comprends pas grand chose.

    Comment fonctionne simplexml_load_file ?

    Je ne comprends pas trop cette partie là non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     foreach ($rss->channel->item as $item) 
      {
         $data[] = array('title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
      }
    Pareil, array_multisort et array_slice me sont inconnus.

    Merci de ton aide.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Bon finalement, j'ai compris pourquoi la date ne s'affichait pas. J'ai résolu le problème comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($last_data as $value)
    {
      $date_news=date_format($value['date'], 'd-m-Y H:i:s');
      echo '<li><a href="' . $value['link'] . '">' . $value['title'] . '</a>, publié le ' . $date_news . '</li>';
    }

    Du coup, en affichant la date, j'ai compris pourquoi le flux rss de la VDN s'affiche après lequipe. C'est parce que dans celui de lequipe, il y a eu 100 news depuis le 2 Juin. Donc pas de problème de ce côté là.

    Il ne m'en reste plus qu'un. Un problème de charset.

    Ma page est encodée en utf-8 sans bom.
    Les news du flux rss s'affiche comme ça.

    Foot - TUR - Deux joueurs du Galatasaray en viennent aux mains lors de la finale de Coupe de Turquie, publi� le 03-06-2015 21:30:00

    Comment je peux régler le problème ?

    Merci.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    - la news de la voix du nord sont beaucoup moins nombreuses et fraiches que celles de l'equipe, elles sont retrouvent donc au fond du panier.

    - $value['date']->format('d/m/Y H:i:s');

    - simplexml décompose le document XML
    $rss->channel->item ce sont tous les <item> à l'intérieur de <channel>

    $item->title c'est le contenu de <title> à l'interieur de <item></item>

    Pour les fonctions array_* direction la doc PHP
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Au temps pour moi, le mauvais encodage des news du RSS vient du fait que ma page n'était pas avec le bon charset (dans Notepad++). Ca m'avait échappé.

    Tous mes problèmes sont résolus. Merci pour tout !!!!

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Ah si dernière question. Comment je peux récupérer le nom de la chaine (channel). Je voudrais indiquer si le flux vient de la voix du nord, de l'équipe ou autre.

    Merci.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Bon tu n'as rien compris à mon explication sur simplexml
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Si, je n'avais juste pas vu ton message car pas rafraîchi la page.

    Par contre, je ne sais pas où l'insérer ce .

    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach ($feeds as $url)
    {
      $rss = simplexml_load_file($url);
      foreach ($rss->channel->item as $item) 
      {
         $data[] = array('title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
      }
      $data['channel']=$rss->channel->title;
    }
    mais visiblement ça ne marche pas.

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non il faut le mettre dans la boucle foreach avec les autres.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Bon bin, écoutes, je dois être bête parce que je n'y arrive pas... Voici ce que j'ai fait, ça ne marche pas, je n'arrive pas à corriger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach ($feeds as $url)
    {
      $rss = simplexml_load_file($url);
      foreach ($rss->channel->item as $item) 
      {
         $data[] = array('title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
         $data[] = array('channel' =>$rss->channel->title);
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($last_data as $value)
    {
      $date_news=date_format($value['date'], 'd-m-Y H:i:s');
      echo '<li><a href="' . $value['link'] . '">' . $value['title'] . '</a>, publié le ' . $date_news . ', par ' . $value['channel'] .'</li>';
    }

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data[] = array(('channel' =>$rss->channel->title, 'title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Il me semblait avoir essayé cette solution. Bizarre.

    En tout cas, ça marche bien.

    Merci beaucoup !!

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Re bonjour,

    Je voudrais compléter mon script. Je voudrais insérer le site de l'équipe mais en le triant avec plusieurs mots-clés car le flux est trop général. Comment je peux rajouter çà ? Merci.

  15. #15
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    Je débute en PHP. Je reviens sur ce bout de code car j'ai un soucis avec.

    Lorsque j'ajoute cette ligne pour avoir le channel, j'ai une page blanche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $data[] = array(('channel' =>$rss->channel->title, 'title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
    De plus, il ne m'affiche uniquement le flux du premier site :
    'http://feeds.feedburner.com/toolinux',
    'http://lesite.org/news.atom'

    Merci d'avance si vous pouviez me renseigner un peu,
    Très cordialement,

    ANDRE Ani
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  16. #16
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Sans voir ton code ce n'est pas possible de te répondre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  17. #17
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Effectivement.
    Mais je n'ai quasiment rien modifié du code d'origine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <?php 
     
     
    $feeds = array(
    'http://feeds.feedburner.com/toolinux',
    'http://lesite.org/news.atom'
     );
     
    // on recolte tout
    foreach ($feeds as $url) {
      $rss = simplexml_load_file($url);
      foreach ($rss->channel->item as $item) {
         $data[] = array('channel' =>$rss->channel->title, 'title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
        // $data[] = array(('channel' =>$rss->channel->title, 'title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->pubDate));
      }
    }
     
    // trie par date
    foreach ($data as $key => $row) {
        $date[$key]  = $row['date'];
    }
    array_multisort($date, SORT_DESC, $data);
     
    // les 10 derniers
    $last_data = array_slice($data, 0, 10);
    echo '<ul>';
    foreach ($last_data as $value) {
      $date_news=date_format($value['date'], 'd-m-Y H:i:s');
      echo '<li><a href="' . $value['link'] . '">' . $value['title'] . '</a>, publié le ' . $date_news . '</li>';
    }
    echo '</ul>';
    ?>
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  18. #18
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tes deux flux ne sont pas construits pareils

    Je ne peux que te proposer d'adapter le code a chaque cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php 
    $feeds = array(
    'toolinux'=>'http://feeds.feedburner.com/toolinux',
    'linuxfr'=>'http://linux fr.org/news.atom'
    );
     
    // on recolte tout
    foreach ($feeds as $feedname=>$url) {
    	$rss = simplexml_load_file($url);
    	switch ($feedname) {
     
    		case 'toolinux' :
    			foreach ($rss->channel->item as $item) {
    				$namespaces = $item->getNameSpaces(true);
    				$dc = $item->children($namespaces['dc']); 
    				$data[] = array('channel'=>$rss->channel->title, 'title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($dc->date));
    			}
    		break;
     
    		case 'linuxfr' :
    			foreach ($rss->entry as $item) {
    				$data[] = array('channel'=>$feedname, 'title'=>(string)$item->title, 'link'=>(string)$item->link, 'date'=>date_create($item->updated));
    			}
    		break;
     	}
    }
     
    // trie par date
    foreach ($data as $key => $row) {
        $date[$key]  = $row['date'];
    }
    array_multisort($date, SORT_DESC, $data);
     
    // les 10 derniers
    $last_data = array_slice($data, 0, 20);
    echo '<ul>';
    foreach ($last_data as $value) {
      $date_news=date_format($value['date'], 'd-m-Y H:i:s');
      echo '<li><a href="' . $value['link'] . '">' . $value['title'] . '</a>, publié le ' . $date_news . 'par ' . $value['channel'] . '</li>';
    }
    echo '</ul>';
    ?>
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  19. #19
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Merci beaucoup, je vais tester.

    Effectivement, je n'ai pas pensé à ça.
    Si je voulais pouvoir ajouter directement une liste, comme dans un lecteur standard, comment faudrait-il s'y prendre ?
    Il faudrait tester chaque flux un par un pour savoir comment il est construit ?
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  20. #20
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Est-ce que je ne devrait pas utiliser plutôt Magpie ou simplepie ?
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection de flux RSS sur un site web
    Par Damien69 dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 20/07/2008, 12h03
  2. integrer flux rss dans son site
    Par wincroc dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/06/2007, 11h28
  3. Intégrer des FLUX RSS dans mon site
    Par stanley dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 11/01/2007, 19h53
  4. Aide pour insérer un fichier flash dans un site web
    Par constitain dans le forum Flash
    Réponses: 2
    Dernier message: 26/07/2006, 22h59
  5. Integration de flux rss dans un site
    Par ikeaboy dans le forum Général Conception Web
    Réponses: 13
    Dernier message: 23/01/2006, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo