Intégration de l’album de photos « Gallery 2.0 » dans SPIP

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Cet article décrit comment utiliser l’application de gestion de photos Gallery 2.0 à l’intérieur de Spip.
Au menu : intégration à l’intérieur d’un squelette, synchronisation automatique des utilisateurs, et insertion des photos de gallery l’intérieurs des artices grâce à une nouvelle balise... le tout sans changer une ligne de code à Spip ou Gallery 2.0 !

Objectifs de cet article

Gallery est un logiciel de gestions de photos qui commence à être très connu. Avec la version 2.0, de nouvelles possibilités d’intégration avec des serveurs d’application externes sont apparues. Cet article décrit un squelette qui permet cette intégration de manière très simple, y compris la création automatique d’utilisateurs dans Gallery 2.0, afin de ne devoir gérer qu’une seule base d’utilisateurs.

Avant toute autre chose, je crois qu’un bon exemple vaut bien des explications : faites un tour à cette adresse : notresupersafariaukenya.com. C’est un site à propos d’un voyage (je vous laisse deviner où), qui combine journal de voyage, photos, etc. 100% Spip/Gallery, bien sûr.

En deuxième partie de l’article, vous trouverez la description d’une balise spip supplémentaire qui permet d’insérer de manière très simple des photos de Gallery à l’intérieur d’articles Spip.

Pour terminer, il est intéressant de noter que tout ceci est réalisé sans modifier une seule ligne de code, ni dans Spip, ni dans Gallery !

Note : je suis conscient que ce code n’est pas aussi propre qu’il devrait l’être quant au traitement des conditions d’erreur, mais il est tout de même relativement costaud : il est utilisé en production avec un site de quelques centaines d’articles, plus d’une dizaine de milliers de photos, et des visiteurs « non geek » sans aucun problème.

Note 2 : Cet article présume que le lecteur a un bon niveau Spip général, je ne détaille pas les opérations de base telles que création d’un squelette, etc.

Problématique de la gestion des utilisateurs

Gallery 2.0 a une notion d’utilisateurs et d’admnistrateurs, ce qui permet de gérer des droits d’édition sur les albums de photos et les photos, de la même façon que Spip gère des visiteurs, des rédacteurs et des administrateurs.

Dans le cadre d’une intégration complète de Gallery à Spip, il est donc nécessaire de synchroniser la base d’utilisateurs afin de pouvoir donner aux rédacteurs et/ou administrateurs Spip la possibilité d’éditer le contenu des albums photo.

Il est important de noter que si un utilisateur de Spip est un administrateur, il ne sera pas automatiquement admnistrateur sur Gallery : ce statut devra être attribué via l’interface d’admin de Gallery. Une réplication automatique n’est pas souhaitable, car la notion d’admin restreint n’existe pas dans Gallery.

Le code ci-dessous devra être mis dans le squelette à l’intérieur d’un fichier « gallery2.html ». Le fichier associé, « gallery2.php3 » devra être créé suivant la méthode habituelle :

<?php
// gallery2.php3
$fond = "gallery2";
$delais = 3600;

include("inc-public.php3");
?>

Le fichier gallery2.html, doit quant à lui être placé dans votre dossier de squelettes :

<?php
// gallery2.html 
//
// Gallery2/Spip integration, E. Lafargue, September 2005
// This is the Gallery 2 code for Spip integration.
// Licence: GPL

// This code assumes that Gallery2 is installed in a directory at the root of the website, called "gallery_ng". Make your changes as needed.

require_once(dirname(__FILE__) . '/gallery_ng/embed.php');
$ret = GalleryEmbed::init(array( 'activeLanguage' => $GLOBALS['auteur_session']['lang'],
           'embedUri' => 'gallery2.php3', embedPath => '/', 'relativeG2Path' => 'gallery_ng',
           'loginRedirect' => '', 'activeUserId' => $GLOBALS['auteur_session']['id_auteur'] ));
  if ($ret->isError()) {
    // The most obvious problem can just be that the Spip user doesn't exists in gallery2
    // in which case we'll have to define that user on the fly here.
    if ($ret->getErrorCode() & ERROR_MISSING_OBJECT) {
    //   print "We need to create the user in Gallery2<br>";
   /**
     * Create the G2 user.
     */
    $extUserId = $GLOBALS['auteur_session']['id_auteur'];
    $args = array('username' => $GLOBALS['auteur_session']['nom']);
    $ret = GalleryEmbed::createUser($extUserId, $args) ;
   if ($ret->isError()) {
       print "<html><body><br> Error creating user<br>" . $ret->getAsHtml() . "</body></html>";
       exit;
   } else {
       $ret = GalleryEmbed::init(array(
           'embedUri' => 'gallery2.php3', embedPath => '/', 'relativeG2Path' => '/gallery_ng',
           'loginRedirect' => '', 'activeUserId' => $GLOBALS['auteur_session']['id_auteur'] ));
    if ($ret->isError()) {
       print "<html><body><br> Error creating user phase 2<br>" . $ret->getAsHtml() . "</body></html>";
       exit;
       } 
     }
   }
  }

  $g2data = GalleryEmbed::handleRequest();
  if (!$g2data['isDone']) {

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!--

   Ajouter ici le code qui s'affichera avant les photos de Gallery 2.0. On peut mettre les boucles qu'on veut, etc


-->

<?php

  // Use $g2data['headHtml'] and $g2data['bodyHtml']
  // to display G2 content inside embedding application

    print $g2data['headHtml'];
    print $g2data['bodyHtml'];

?>


<!--

    Ajouter ici le code qui s'affichera après les photos de Gallery 2.0.

-->

<?php
   // End of if(!isDone)
  }
?>

Notes importantes sur ce code :

Il est important que Spip n’affiche rien avant l’appel « handleRequest » de gallery, car dans certains cas, gallery demande une redirection, et dans d’autres cas les données affichées ne sont pas du HTML, mais par exemple des photos ou autres données binaires. C’est la raison du test « isDone » juste avant le code d’affichage.

Les utilisateurs Gallery 2.0 sont créés automatiquement à leur première visite, mais ils ne sont jamais effacés. Ceci ne devrait pas avoir une grande importance, car les utilisateurs « effacés » dans Spip ne sont jamais supprimés de la base de données, et leur ID reste unique.

Avec ce bout de squelette, on peut désormais utiliser gallery 2.0 à l’intérieur de n’importe quel site Spip.

Installation

Je ne détaille pas ici comment installer le squelette gallery, ceci est documenté un peu partout.

La procédure à suivre pour intégrer Gallery 2.0 est la suivante :

-  Installer Gallery 2.0 dans la hierarchie du site web. Dans notre exemple, gallery 2.0 est installé dans un répertoire appelé « gallery_ng »
-  Suivre la procédure de setup décrité dans la documentation d’installation de Gallery 2.0. Notez bien le mot de passe de l’admnistrateur !
-  Une fois que gallery 2.0 fonctionne correctement en standalone, vous pouvez alors tester à travers votre squelette spip.
-  Pour cela, allez à l’URL http://votre site/gallery2.php3 . Vous devriez vous trouver sur la page d’acceuil de gallery 2
-  Si à ce moment vous n’êtes pas identifié sous Spip, vous aurez accès à Gallery en mode ’guest’
-  Si vous vous authentifiez sous Spip, vous serez également authentifié sous Gallery (l’utilisateur Gallery sera créé lors de votre première visite dans Gallery)
-  Afin de pouvoir administrer vos albums, il suffit de visiter Gallery au moins une fois en étant identifié comme administrateur Spip. Ensuite, vous devez vous connecter directement à gallery (c’est à dire gallery en standaline, pas à travers Spip et gallery2.php3) en tant qu’admin Gallery, et donner les droits d’admin à votre nom d’utilisateur/admnistrateur Spip qui vient d’être créé par votre visite précédente. Heu... suis-je bien clair ?
-  Une fois que votre nom d’utilisateur Spip est créé, vous pouvez désactiver l’accès à Gallery 2.0 en « standalone » en changeant l’option correspondante dans le fichier « config.php » de Gallery 2.0 :

$gallery->setConfig('mode.embed.only',true);

Une fonction intéressante, une fois que Gallery2 est inséré à l’intérieur de Spip, est de l’utiliser pour illustrer ses articles.

Chaque photo ou album de Gallery 2.0 possède un identifiant unique (itemID). La balise ci-dessous utilise cet identifiant pour insérer une photo à l’intérieur de spip, suivant la syntaxe suivante :

<albItem_itemID|alignement>

-  itemID est l’itemID de l’élément à afficher (photo, film, album, etc
-  alignement peut être : left, center, right, comme pour une image.

Le code de cette balise — ci dessous — doit être installé dans le fichier « /ecrire/mes_options.php3 ». Ce fichier permet d’installer ses propres balises et n’est pas modifié par les mises à jour de Spip.

function apres_propre_galery($texte) {
// Insertion pour gallery2, avec reference directe a l'itemId (nouveaute G2)
// Syntaxe: <albItem_ItemId|alignement>

         while (eregi("<(ALBITEM_)([a-zA-Z0-9]+)(\|([^\>]*))?".">",$texte,$match)) {
$auteur =  $GLOBALS['auteur_session']['id_auteur'];

         $rempl = "";
         require_once(dirname(__FILE__) . '/../gallery_ng/embed.php');
         $ret = GalleryEmbed::init(array(
                     'embedUri' => 'gallery2.php3', embedPath => '/', 'relativeG2Path' => 'gallery_ng',
                     'loginRedirect' => '', 'activeUserId' => $auteur ));

         if ($ret->isError()) {
              $rempl = "<blink><font color=red>Error inserting itemId $match[2]</font></blink>";
    print "<hr>Gallery 2 error code: " . $ret->getErrorCode();
   print "<br>Gallery 2 error text: " . $ret->getErrorMessage();
  print "<br> Error details: <br> " . $ret->getAsHtml();
          } else {

    /**
     * Get HTML for an image block
     */
      list($status,$rempl,$head1) = GalleryEmbed::getImageBlock(array(
		'blocks' => 'specificItem', 'itemFrame' => 'solid', 'show' => 'title', 'itemId' => $match[2], 'maxSize' => 160));
	if ($status->isError()) {
		$rempl = "<blink><font color=red>Error inserting itemId $match[2]</font></blink>";
        }
       $rempl = "<div style=\"float:$match[4]; width:175px;\">$head1 $rempl </div>";
       $letout = quotemeta($match[0]);
       $letout = ereg_replace("\|", "\|", $letout);
       $texte = ereg_replace($letout, $rempl, $texte);
   }
 } // Sortie de l'insertion pour gallery2

  return $texte;
} // apres_propre_gallery

Cette nouvelle fonction devra être appelée par la fonction « apres_propre », également définie dans mes_options.php3. Si la fonction « apres_propre » n’existe pas, il faudra la créer comme suit :

<?php

function apres_propre($texte) {
$texte = apres_propre_galery($texte);
return $texte;
}
?>

Sinon, il suffit simplement de placer $texte = apres_propre_galery($texte) ; au début de cette fonction.

Améliorations futures

Cette intégration dans les squelettes Spip permet seulement d’afficher les pages de Gallery et d’insérer des photos provenant d’albums dans Spip : elle n’introduit pas de nouvelles boucles Spip permettant d’utiliser les photos et les albums comme des éléments parfaitement intégrés à la structure des objets gérés par Spip, comme les articles, rubriques et document.

Tout ceci demandera un certain travail de développement, mais les bases décrites ici sont une première étape !

En espérant que cela vous aura plu,

Edouard

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom