captain_torche
vendredi 22 décembre 2006 à 15:03
Mutualiser les logos de deux sites partageant la même base de données SPIP
Problématique : Nous partons du principe que nous avons deux sites (siteA.com et siteB.com), tous deux utilisant SPIP. Le site A, généraliste, comporte beaucoup de rubriques et d'articles. Le site B, spécialisé, ne reprend que le contenu d'une rubrique spécifique du site A.
Si la gestion des articles ne pose pas de problèmes, la récupération des logos associés aux articles est plus pointilleuse. En effet, SPIP vérifie la présence physique de l'image dans son répertoire avant de l'afficher. S'il ne trouve pas l'image, il ne l'affichera pas.
Fichiers modifiés : ecrire/inc_version.php3 et ecrire/inc_logos.php3
NB : Ceci n'est pour l'instant testé qu'avec SPIP 1.8.3
Etape 1 : Afficher les logos du site APrincipe de fonctionnement des logos dans SPIP
Lors de l'ajout d'un logo à un article, ou une rubrique de SPIP, rien n'est ajouté en base. SPIP se contente de créer une image, nommée artonxxx.jpg, ou rubonxxx.jpg (avec xxx correspondant à l'id de l'article/rubrique), dans son dossier IMG. Lors de la génération des pages, SPIP vérifie donc la présence de ce fichier, et l'affiche le cas échéant.
Dans notre cas, nous n'avons aucune image dans le répertoire IMG sur le site B; SPIP n'affichera donc pas les logos associés.
Il faut donc que nous modifiions le fichier définissant le répertoire IMG, pour le faire pointer vers celui du site A.
Cette déclaration se trouve dans le fichier ecrire/inc_version.php3, à la ligne 372 :
CODE
define_once('_DIR_IMG', _DIR_PREFIX1 ."IMG/");
Il nous faut donc pour l'instant le faire pointer vers le site A :
CODE
define_once('_DIR_IMG', "http://www.sitea.com/IMG/");
Pour l'instant, cela ne fonctionne pas encore : SPIP utilise la fonction
file_exists() de PHP pour vérifier l'existence du fichier, qui ne fonctionne qu'en local sur les versions de PHP antérieures à PHP5. Il nous faut donc modifier les appels à cette fonction, pour en utiliser une autre qui supporte les appels distants à une url. J'ai choisi
fopen(), conscient que la demande en ressource doit être supérieure à la première fonction.
Il faut ensuite éditer le fichier
ecrire/inc_logos.php3, pour remplacer tous les appels à la fonction file_exists, de la forme :
CODE
if (@file_exists($fichier)){
par des appels de la forme :
CODE
if (@fopen($fichier, 'r')){
Une fois ces modifications faites, cela fonctionne pour les logos appelés sans traitement.
Il faut par contre permettre au script de gérer le redimensionnement des images.
Etape 2 : permettre le redimensionnement des images du site AProblème rencontré : Sans modification au script actuel, SPIP tente d'enregistrer les fichiers redimensionnés dans le répertoire http://www.sitea.com/IMG/, qui n'existe bien évidemment pas sur le site.
Il nous faut tout d'abord définir un répertoire où figureront les images redimensionnées. Pour ce faire, nous allons ajouter une ligne, dans le fichier
ecrire/inc_version.php3, idéalement après la ligne que nous venons de modifier :
CODE
define_ONCE('_DIR_IMG_CACHE', _DIR_PREFIX1 . "IMG/");
J'ai ici réutilisé le répertoire IMG, tout simplement.
Pour finir, il faut spécifier que les images redimensionnées doivent être enregistrées dans ce répertoire spécifique. dans le fichier
ecrire/inc_logos.php3, dans la fonction creer_vignette. Il suffit d'éditer ces trois lignes :
CODE
if ($destdir) {
$destdir = creer_repertoire(_DIR_IMG, $destdir);
}
$destination = _DIR_IMG . $destdir . $destfile;
pour les remplacer par :
CODE
if ($destdir) {
$destdir = creer_repertoire(_DIR_IMG_CACHE, $destdir);
}
$destination = _DIR_IMG_CACHE . $destdir . $destfile;
Tout fonctionne parfaitement dorénavant !