> Généralités
PHPUTIL/News est architecturé autour de plugins. Il y a deux
types de plugins :
-
les plugins s'occupant de convertir les news en un format lisible ou exploitable
par l'utilisateur final (plugins de "sortie") ;
-
les plugins s'occupant de stocker/lire les news de façon fiable et sécurisée
(plugins de stockage).
Nous allons étudier (dans ce document) le deuxième type de plugin (ceux concernant le
stockage des news) et nous allons voir comment en créer de nouveaux pour augmenter
les possibilités de PHPUTIL/News.
> Comment marchent les plugins de stockage ?
Ce n'est pas compliqué. Quand on demande à PHPUTIL/News de
stocker ou charger une ou plusieurs news, le "manager" de l'application passe la main au
plugin de stockage choisi. Ce dernier répond alors à la requête.
Les plugins de stockage sont tous contenus dans le répertoire storage.
Les noms des fichiers (sans l'extension .php) correspondent aux noms
des plugins de stockage. Par exemple, si l'on appelle le plugin de stockage
DB, c'est le fichier DB.php qui sera concerné...
Vous remarquerez également la présence d'un fichier nommé common.php.
Il définit l'API standard d'un plugin de stockage. Tous les plugins de stockage doivent en
hériter. L'intérêt est que si une fonctionnalité majeure (décrite dans le fichier
common.php) n'est pas implémenté dans le nouveau plugin de stockage,
le module common déclenchera une erreur PEAR explicite signalant que la fonctionnalité n'est
pas disponible pour ce plugin.
> Comment faire un plugin de stockage ?
Puisqu'un exemple vaut mieux qu'un long discours, supposons que vous désiriez créer un
plugin de stockage nommé Test. Votre code devra ressembler à :
<?php
require_once('News/storage/common.php'); // On charge le fichier common.php
class News_Storage_Manager_Test extends News_Storage_Manager
{
// (...) votre code ici
}
?>
Notez que le nom de la classe n'est pas simplement test mais
obligatoirement News_Storage_Manager_test ! Le nom de votre
plugin reste cependant uniquement Test. Cette classe devra être
contenue dans un fichier nommé Test.php (attention aux
majuscules/minuscules) contenu dans le répertoire storage.
> Que doit faire un plugin de stockage ?
L'API d'un plugin de stockage (nommé Test) est la suivante :
-
Un constructeur nommé (dans notre cas) News_Storage_Manager_Test
void News_Storage_Manager_Test
(
array $config
)
-
$config est un tableau associatif contenant diverses
options de configuration sous la forme (par exemple) :
$config = array(
'option1' => $option1Value,
'option2' => $option2Value,
(...)
);
Il y a deux options obligatoires url (qui contiendra
l'url complète du répertoire contenant PHPUTIL/News)
ainsi que root (qui contiendra le chemin d'accès complet
depuis la racine du système de fichier au répertoire contenant
PHPUTIL/News). NB : Pas de / à
la fin de ces deux valeurs ! Un exemple de configuration minimum serait donc :
$config = array(
'url' => 'http://www.test.com/phputil/news',
'root' => '/home/user/www/phputil/news'
);
Le première ligne de ce constructeur devra être impérativement un appel au constructeur
de la classe père. Donc votre constructeur devra ressembler à :
function News_Storage_Manager_Test($config)
{
$this->News_Storage_Manager($config);
// (...) votre code ici
}
- Une méthode de chargement simple (nommée load)
News load
(
string $id
)
-
$id est l'identifiant de la news à charger
Cette méthode devra donc simplement retourner la news (sous forme d'objet
News) dont l'identifiant est passé en arguments. Pour générer
un objet de classe News, voyez le fichier
news.php situé dans la racine de
PHPUTIL/News.
- Une méthode de chargement multiple (nommée multipleLoad)
array multipleLoad
(
[
array $options
]
)
-
$options est un tableau associatif permettant de
spécifier des options à la lecture multiple (comme le nombre de news à
charger...)
Cette méthode devra donc simplement retourner un tableau ordonné contenant un certain
nombre de news (le nbr dépendant des news existantes et des options passées en
arguments). Chaque élément du tableau est donc un objet de classe
News.
-
Une méthode (nommée insert) pour insérer une nouvelle news
dans le moyen de stockage
void insert
(
object $news,
[
array $options
]
)
-
$news est un objet de la classe
News. Il s'agit de la news à insérer dans le moyen de
stockage.
-
$options est un tableau associatif permettant de
spécifier d'éventuelles options à la méthode de sauvegarde.
Cette méthode insérera donc une news dans le moyen de stockage (en tant que nouvel
enregistrement). Il existe une autre méthode update pour
sauvegarder des modifications.
-
Une méthode (nommée update) pour sauvegarder les modifications
réalisées sur une news dans le moyen de stockage
void update
(
object $news,
[
array $options
]
)
-
$news est un objet de la classe
News. Il s'agit de la news dont les modifications doivent
être sauvegardées dans le moyen de stockage.
-
$options est un tableau associatif permettant de
spécifier d'éventuelles options à la méthode de sauvegarde.
Cette méthode sauvegardera donc les modifications apportées à une news dans le moyen
de stockage (en écrasant l'ancien enregistrement). Cette méthode ne devra pas être
appelée si la news en question n'a pas été (au préalable) insérée dans le moyen de
stockage via la fonction insert.
-
Une méthode (nommée kill) pour effacer une news du moyen de
stockage.
void kill
(
string $idNews,
[
array $options
]
)
-
$idNews est l'indentifiant de la news à supprimer.
-
$options est un tableau associatif permettant de
spécifier d'éventuelles options à la méthode de suppression.
Cette méthode effacera donc la news dont l'identifiant est passé en argument du moyen
de stockage.
> Conclusion
Vous savez donc désormais créer des plugins de stockage pour
PHPUTIL/News. Veillez seulement à bien respecter l'API
précédemment évoquée sous peine d'incompatibilités éventuelles avec les évolution futures
du programme. Il est cependant tout à fait envisageable de n'implémenter qu'une partie de
cette API, les méthodes manquantes le seront par la classe père (qui déclenche une erreur
PEAR signalant que la fonctionnalité n'est pas disponible). En effet, il ne sera pas
toujours possible de réaliser les méthodes d'écriture (news sur un autre serveur...) et on
pourra alors se limiter aux méthodes de lecture.
|