DOMFeedManager, une classe pour gérer ses flux RSS

Eléphant du PHP | 171 Messages

13 juil. 2011, 09:38

Salut,

Voilà je met à votre disposition une petite classe PHP pour gérer les flux RSS de son site : les ajouter, les éditer, les supprimer et en exploiter les données.
La classe a été complètement mis à jour donc ce post est une édition du poste initiale.
  • - Héritage de la classe DOMDocument. (sous le conseil de moogli ;) )
    - Documentation retouché. Celle ci est orientée uniquement développeur pour quelque chose de plus technique.
    - Conformité totale du flux générer avec la norme W3C.
    - Réorganisation des méthodes pour plus de souplesses.
    - Ajout de l'exploitation du flux (lecture d'item(s), comptage d'items, récupération de certains item identifiés par un marqueur)
    - Débugage de certains points
    - N'utilise plus de DTD. Celle ci n'est plus nécessaire puisque les attributs id ne sont plus utilisés.
    - Correction de l'ordre des nouveaux items qui lors d'un ajout, se rajouter à la fin du fichier, ces derniers sont maintenant ajouter au début du channel.
    - ...
Voilà le contenu du fichier Readme
/**
 * @name DOMFeedManager.class.php
 * @version 1.1
 * @author Maxime Elomari <contact@maximeelomari.com>
 * @link : http://blog.maximeelomari.com
 * @see http://blog.maximeelomari.com/actualites/Feedmanager,-la-classe-PHP-pour-gerer-les-flux-RSS-de-son-site-web-65
 */
 
/* METHODS */

DOMFeedManager extends DOMDocument {

	__construct( [string $path_file] )
	
	void DOMFeedManager::createFeed( void )
	void DOMFeedManager::saveFeed( string $path = null )
	
	void DOMFeedManager::addChannel( array $metas )
	int DOMFeedManager::editChannel( $nodeName, mixed $nodeContent, array $newMetas )
	int DOMFeedManager::deleteChannel( $nodeName, $nodeContent )
	
	void DOMFeedManager::addItem( array $nodes )
	int DOMFeedManager::editItem( $nodeName, $value, array $newNodes )
	int DOMFeedManager::deleteItem( $nodeName, $nodeContent )
	
	int DOMFeedManager::getItemNumber ( void )
	array DOMFeedManager::getItem ( $nodeName = false,$nodeContent = false )
	array DOMFeedManager::getDistinctNode ( $nodeName )
	array DOMFeedManager::getItemOptions()
	array DOMFeedManager::getChannelOptions()
	
	void DOMFeedManager::setChannel ( string $nodeName, mixed $nodeContent )
	void DOMFeedManager::setItem ( string $nodeName, mixed $nodeContent )
}
SOMMAIRE
-------------


DOMFeedManager::__construct - Crée un nouvel objet DOMFeedManager
DOMFeedManager::createFeed - Crée un nouveau fichier XML de type RSS 2.0
DOMFeedManager::saveFeed - Sauvegarde les modifications apportés au fichier
DOMFeedManager::addChannel - Crée un nouveau channel
DOMFeedManager::editChannel - Edite un/des channel(s) existant
DOMFeedManager::deleteChannel - Supprime un/des channel(s)
DOMFeedManager::addItem - Crée un nouvel item
DOMFeedManager::editItem - Edite un/des item(s) existant
DOMFeedManager::deleteItem - Supprime un / des item(s)
DOMFeedManager::getItemNumber - Retourne le nombre d'items existants
DOMFeedManager::getItems - Retourne le contenu d'un ou des item
DOMFeedManager::getDistinctNode - Retourne les diffèrentes valeurs d'une même méta
DOMFeedManager::getItemOptions - Retourne la liste des balises autorisés pour un item
DOMFeedManager::getChannelOptions - Retourne la liste des balises autorisés pour un channel
DOMFeedManager::setChannel - Défini une balise pour la création d'un channel
DOMFeedManager::setItem - Défini une balise pour la création d'un item

EXEMPLES
------------
/* Défini le chemin du fichier 'feed.xml' à charger ou à enregistrer */
$feed = new DOMFeedManager('feed.xml');

/* Créer un nouveau fichier XML */
$feed->createFeed();

/* 1. Sauvegarde les modifications apportés au chemin du fichier donné lors de l'objet DOMFeedManager */
$feed->saveFeed();

/* 2. Sauvegarde les modifications apportés au fichier au chemin specifié */
$feed->saveFeed('../../feed.xml');

AJOUT, EDITION ET SUPPRESSION DE CHANNELS
--------------------------------------------------------
/* Défini la balise pubDate à la date actuelle, celle ci sera ajouté dans les paramètres, 
lors d'un appel à la méthode DOMFeedManager::addChannel */
$feed->setChannel ('pubDate', time());

/* Ajoute un channel au flux avec les paramètres $nodes */	
$nodes = array 	( 
				'title' => 'Blog de Maxime Elomari', 
				'description' => 'Des articles écrit par Maxime Elomari', 
				'link' => 'http://blog.maximeelomari.com/',
				'category' => 'PHP',
				'webMaster' => 'Maxime Elomari'
				);
				
$feed->addChannel($nodes);

/* Edite le channel ayant comme 'title' : 'Blog de Maxime Elomari' avec les paramètres $newNodes */
$newNodes = array('title' => 'Blog de Maxime Elomari sur le PHP et un peu de tout');

$feed->editChannel('title','DOMFeedManager',$newNodes);

/* Supprime le channel ayant comme 'webMaster' : 'Maxime Elomari' */
$feed->deleteChannel('webMaster','Maxime Elomari');

AJOUT, EDITION ET SUPPRESSION D'ITEMS
-------------------------------------------------
/* Défini la balise pubDate à la date actuelle, celle ci sera ajouté dans les paramètres, 
lors d'un appel à la méthode DOMFeedManager::addItem */
$feed->setChannel ('pubDate', time());

/* Ajoute un item au flux avec les paramètres $nodes */
$nodes = array 	( 
				'guid' => 26,
				'title' => 'DOMFeedManager 1.1', 
				'description' => 'DOMFeedManager, une classe pour gérér ses flux RSS héritant de la classe DOMDocument', 
				'link' => 'http://blog.maximeelomari.com/actualites/Feedmanager,-la-classe-PHP-pour-gerer-les-flux-RSS-de-son-site-web-65',
				'category' => 'PHP - Développement informatique',
				'author' => 'contact@maximeelomari.com'
				);
$feed->addItem($nodes);

/* Edite l'item ou les items ayant comme 'guid' : '26' avec les paramètres $newNodes */
$newNodes = array 	( 
					'title' => 'DOMFeedManager, la version 1.1 Released', 
					'description' => 'Feedmanager change de nom et devient DOMFeedManager héritant maintenant directement de la classe DOMDocument', 
					'category' => 'Classe PHP',	
					);
$feed->editItem('guid', 26,$newNodes);

/* Supprime le channel ayant comme 'category' : 'Classe PHP' */
$feed->deleteItem('category','Classe PHP');

LECTURE DE FLUX
---------------------
/* Retourne le nombre d'items existants */
$nbItems = $feed->getItemNumber();

/* Retourne le contenu de l'item ayant comme guid la valeur 26 */
$items = $feed->getItems('id',26);
foreach($items[0] as $nodeName => $nodeContent)
{
	echo $nodeName.' => '.$nodeContent.'<br />';
}
----------------------------
Cet exemple affichera :
----------------------------
guid => 26
title => DOMFeedManager, la version 1.1 Released
description => Feedmanager change de nom et devient DOMFeedManager héritant maintenant directement de la classe DOMDocument
link => http://blog.maximeelomari.com/actualite ... ite-web-65
category => PHP - Développement informatique
author => contact[at]maximeelomari[dot]com
--------------------------
/* Retourne le contenu de tous les items */
$item = $feed->getItems();
foreach($item as $nodeName => $nodeContent)
{
	echo $nodeName.' => '.$nodeContent.'<br />';
}

/*  Retourne les diffèrentes valeurs d'une même $nodeName */
$feed->getDistinctNode('category');

/* Retourne la liste des balises autorisés pour un item */
$feed->getItemOptions();

/*  Retourne la liste des balises autorisés pour un channel */
$feed->getChannelOptions();
Et pour télécharger la classe :

https://github.com/Skw33d/DOMFeedManage ... anager-1.1
Modifié en dernier par Skw33d le 10 août 2011, 22:49, modifié 13 fois.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

15 juil. 2011, 17:41

Salut,

Vu que tu l'utilise pour chaque méthode, a tu tenté de faire hériter ta classe de la classe dom ?
C'est un peux plus simple et logique ;)

Pour la validation des emails (et autre tu peux utilser filter_var si tu impose php 5.2 comme version minimum de php a utiliser (deja ta classe est php5, je pense que la plus part des hébergeurs propose des versions 5.2 maintenant.

Sinon bonne initiative, je testerais quand je rentreré de vacances ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 171 Messages

16 juil. 2011, 13:11

Cool, je ne connaissais pas filter_var ! et c'est cool comme fonction :p
Pour ceux qui de l'héritage et tout ça je tente ça quand j'ai un peu de temps et j'édite ! J'ai aussi noté les corrections que je vais apporter dans mon post précédent.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

ViPHP
ViPHP | 5462 Messages

16 juil. 2011, 15:59

tu l'as pas encore mis sur github ?

Eléphant du PHP | 171 Messages

16 juil. 2011, 16:13

Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

17 juil. 2011, 00:06

Je viens de pensez a un truc, pourquoi imposer l'enregistrement d'un fichier XML ?
Tu peux proposer la generation du flux et l'affichage (par exemple pour une gestions ('dynamique du flux a afficher) ?

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 171 Messages

17 juil. 2011, 00:13

Ouais, c'est vrai ! Bonne idée. J'étais justement en train de coder la classe donc je vais voir ça. :wink:

En passant je sais pas si c'est possible mais je ne pense pas ? Peut on redéfinir $this ? Ca me semble impossible mais en fait je souhaiterais faire quelque chose comme $this = clone $dtd;
C'est en ce qui concerne la création d'un nouveau fichier de flux XML.

Parce que je fais ce que m'a dit moogli, en faisant hérité la classe de DOMDocument.
Ça marche très bien pour les fonctions présentes dans la classe sauf que je coince à cet endroit :
J'aurais besoin de récuperer l'objet de DOMImplementation(); et de le définir comme $this. Une idée :?:
   
    private function createXML()
    {
        $dtd = $this->createDtd(); //Création du noeud racine [b](C'est ici qu'a la place de $dtd, je voudrais mettre $this = $this->createDtd(); mais c'est impossible apparemment si je me trompe pas ?)[/b]
        $root = $dtd->createElement("rss"); //On crée l élément racine
        $root->setAttribute("version", "2.0"); //On lui ajoute l attribut version (2.0)
        $root = $this->appendChild($root); //On insère la racine dans le document    
    }
	
    private function createDtd()
    {
        $dom = new DOMImplementation();
        $dtd = $dom->createDocumentType('rss [
                                               <!ATTLIST channel id ID #IMPLIED>
                                               ]','',null);
        $dtd = $dom->createDocument(null, '', $dtd);
		return $dtd;
    }
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Avatar du membre
ViPHP
xTG
ViPHP | 7331 Messages

18 juil. 2011, 08:03

Il existe un constructeur par clonage.

Eléphant du PHP | 171 Messages

08 août 2011, 03:53

Voilà, un post pour signaler l'update qui est réaliser dans le premier post.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

ViPHP
ViPHP | 5462 Messages

14 août 2011, 19:12

crée plutôt des tag pour faire tes versions en plus elle seront direct en téléchargement