Emuler les include virtual SSI

All contributions published for previous SPIP versions

Intro

Ayant à récupérer une série d’articles (publiés avec un autre système) ayant du contenu dynamique géré via les SSI
j’avais besoin de trouver un moyen simple et rapide à mettre en oeuvre pour récupérer cette fonctionnalité avec notre SPIPOU favoris ;-) L’écriture d’un petit filtre (à rajouter dans mes_fonctions.php3) - en partie pompé sur ce qu’à écrit gouarfig sur php - qui reste certainement encore perfectible (notament en terme de sécurité et d’efficacité; C’est mon 1er “programme” php) a parfaitement solutionné mon problème.

Le code

/*
 * inclure: Cette fonction emule partie des include virtual SSI.
 * Version: 1.1
 *
 * - La syntaxe typographique est la  suivante :
 *   <!--#include virtual='/machin/a/inclure' -->
 *   <!--#include file='fichier/a/inclure' -->
 * - Il faut l'utiliser  dans le squelette  d'affichage de l'article de  cette
 *   façon [(#TEXTE|inclure)]
 *
 * Exemples: 
 * 	<!--#include virtual='/cgi-bin/compteur' -->
 * 	<!--#include file='fichier.txt' -->
 */
function inclure( $texte ) {
   
   $base_url = 'http://' . $_SERVER["SERVER_NAME"];
   $filtre_include = '/<!--# *include  *(virtual|file) *= *[\'"]([^> \'"]+)[\'"] *-->/';
   $filtres_html =
      array(
         '/<[\/]? *(html|head|body) *[^>]*>/i',
         '/<title>[^<>]*<\/title>/i',
         '/(<|&lt;)\?xml [^?>]+\?(>|gt;)/i',
         '/<!DOCTYPE [^>]*>/',
         '/<link [^>]*>/'
         );
   
   while ( preg_match( $filtre_include, $texte, $resultats )) {
      if( $resultats[1] == 'file' ) {
         $script = './' . $resultats[2];
      } else{
         $script = $base_url . $resultats[2];
      }
      $file = fopen( $script, 'r' );
      if ( !$file ) {
         $texte_inclus = '<p class="warning">[Inclure <tt>$script</tt>, erreur!]</p>';
      } else {
         $texte_inclus = '';
         while ( !feof ( $file )) {
            $txt = fgets( $file, 1024 );
            $txt = preg_replace( $filtres_html, '', $txt );
            $texte_inclus = $texte_inclus . $txt;
         }
         fclose( $file );
      }
      
      $texte = preg_replace( $filtre_include, $texte_inclus, $texte, 1 );
    }
   
   return( $texte );
} // end inclure()

Comment ça fonctionne plus précisement ?

-  Je suppose que le lecteur a tout compris sur l’utilisation des SSI

-  Dans le texte d’un article on peut insérer maintenant des “instructions” SSI telles que:
<!--#include virtual='/cgi-bin/monscript?arg=param' -->

-  Lors du traitement de l’article par SPIP (au moment de sa mise en cache), la fonction inclure est invoquée sur le texte du dit article. Ce qui va se passer pour l’exemple ci dessus est un appel “HTTP” à http://monserveur/cgi-bin/monscript?arg=param et insertion de ce qui est retourné, par le script cgi monscript, dans le texte de l’article à la place de l’instruction SSI.

-  Ceci permet d’avoir des articles au contenu “semi” (à la période de rafraichissement du cache près) dynamique, à la manière des SSI.

updated on 28 April 2005

Discussion

Aucune discussion

Ajouter un commentaire

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom