Découper un article en plusieurs pages

Un filtre pour découper l’affichage public d’un article en plusieurs pages.
Pour SPIP 1.7, voir Découper un article en plusieurs pages et lui ajouter un sommaire.
Pour les versions plus récentes de SPIP, voir Découper un texte en pages et/ou en onglets et En onglets dans le texte de SPIP, ou ailleurs....

Marche à suivre

1. Ajouter la fonction qui suit dans mes_fonctions.php3 :

/*
 *   +----------------------------------+
 *    Nom du Filtre : decouper_en_page                                               
 *   +----------------------------------+
 *    Date : mardi 28 janvier 2003
 *    Auteur :  "gpl"  : gpl@macplus.org                                      
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *     Il sert a présenter un article sur plusieurs pages
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.uzine.net/spip_contrib/article.php3?id_article=62
*/


function decouper_en_page($texte) {
        global $artsuite, $var_recherche;
        
        if (empty($artsuite)) $artsuite = 0;
        
        $page = split('-----', $texte);
        
        $num_pages = count($page);

        // Si une seule page ou numéro illégal, alors retourner tout le texte.
        // Cas spécial : si var_recherche positionné, tout renvoyer pour permettre à la surbrillance
	// de fonctionner correctement.
        if ($num_pages == 1 || !empty($var_recherche) || $artsuite < 0 || $artsuite > $num_pages) {
                return $texte;
        } 

        $p_prec = $artsuite - 1;
        $p_suiv = $artsuite + 1;
        $uri_art = generer_url_article($GLOBALS['id_article']);
        $uri_art .= strpos($uri_art, '?') ? '&' : '?';
        
        switch (TRUE) {
                case ($artsuite == 0):
                        $precedent = "";
                        $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</A>";
                        break;
                case ($artsuite == ($num_pages-1)):
                        $precedent = "<A HREF='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</A>";
                        $suivant = "";
                        break;
                default:
                        $precedent = "<A HREF='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</A>";
                        $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</A>";
                        break;
        }
        
        for ($i = 0; $i < $num_pages; $i++) {
                $j = $i;
                if ($i == $artsuite) {
                        $milieu .= " <B>" . ++$j . "</B> ";
                } else {
                        $milieu .= " <A HREF='" . $uri_art . "artsuite=$i'>" . ++$j . "</A> ";
                }
        }

        // Ici, on peut personnaliser la présentation
        $resultat = "<P><DIV CLASS='pagination'>$precedent $milieu $suivant</DIV></P>";
        $resultat .= $page[$artsuite];
        $resultat .= "<P CLASS='pagination'><DIV CLASS='pagination'>$precedent $milieu $suivant</DIV></P>";
        return $resultat;
}
// FIN du Filtre decouper_en_page

2. Remplacer le [(#TEXTE)] présent dans article.html (ou dans votre propre squelette, bien sûr) par :

[(#TEXTE*|decouper_en_page|propre)]

Notez bien l’astérisque après #TEXTE ! Cette astérisque permet de désactiver les traitements par défaut de Spip sur le champ #TEXTE : c’est nécessaire ici parce que je veux traiter cinq traits d’union consécutifs qui sont transformés en <hr> normalement.

3. Rédigez vos articles en utilisant cinq traits d’union consécutifs à l’endroit qui doit recevoir la coupure.

À noter

Pour obtenir une ligne horizontale, la documentation de Spip stipule qu’une succession de quatre traits d’union ou plus est nécessaire. Avec ce filtre, c’est différent : quatre traits d’union provoque une ligne horizontale, cinq provoquent un saut de page. J’ai choisi ceci pour permettre d’avoir, dans l’hypothèse d’un autre squelette avec #TEXTE et non #TEXTE*, une ligne horizontale qui signale le découpage en pages.

Un exemple ?

Voyez http://alor.univ-montp3.fr/c.renais... pour un exemple sur un site existant.

Discussion

49 discussions

  • 6

    Est-ce que je peux mettre des images a la place << 1 2>> ?

    • Dans le script, trouve le texte suivant :

      &gt;&gt;

      (c’est pour « >> ») et :

      &lt;&lt;

      (pour « << », donc). Tu peux alors changer et mettre

      <img src='mon_image_qui_dit_page_suivante.gif' width='largeur_pixel' height='hauteur_pixel' alt='&gt;&gt;'>

      (en changeant, bien sûr, largeur_pixel et hauteur_pixel et le nom de l’image).

      gpl

    • J’ai :Erreur : filtre « decouper_en_page » non défini
      Est-ce que je dois mettre Img src=... chaque fois qu’il y a << et >> ?
      Comme je mets des images est-ce que je peux enlever les chiffres 1 et 2 (je n’ai besoin de plus decouper le texte)

    • Erreur : filtre « decouper_en_page » non défini

      veut dire le plus souvent qu’il y a une erreur dans le filtre.

      La ligne originale :

      $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</A>";

      est-elle devenue quelque chose comme :

      $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'><img src='suiv.gif' alt='suivant'></A>";

       ?

      Il faut bien vérifier qu’on utilise «  » et non « " » dans les balises !

    • Genial. Merci.
      Comme je n’ai besoin de decouper le texte qu’en 2 parties et que je mets des images est-ce que je peux enlever le 1 et 2 entre les 2 images.

    • Pour éviter les numéros de pages, remplace :

      for ($i = 0; $i < $num_pages; $i++) {
          $j = $i;
          if ($i == $artsuite) {
             $milieu .= " <B>" . ++$j . "</B> ";
          } else {
             $milieu .= " <A HREF='" . $uri_art . "artsuite=$i'>" . ++$j . "</A> ";
          }
      }

      par :

         $milieu = '';

      Et ça devrait marcher.

      Sinon, dis-moi. ;-)

    • Ca marche.Merci.

    Répondre à ce message

  • 1
    Hammerhead

    Salut tout le monde,

    J’ai un petit problème avec ce filtre. Il convient parfaitement à mes besoins (encore merci à GPL), mais la page des liens ne correspond pas avec le restant de mon site.
    En effet j’utilise un squelette spécial que j’utilise pour afficher les dossier (ou de très longs articles si vous préférez).

    En gros, au lieu que ça pointe vers article.php ?id_article=numArticle, je voudrais un truc du style articleDossier.php ?id_article=numArticle où numArticle est le numéro de l’article.

    Je suis pas un pro du PHP, donc si vous connaissez la combine, ça m’aiderait bien.

    Merci d’avance :-)

    • Non testé !

      Repère la ligne :

              $uri_art = generer_url_article($GLOBALS['id_article']);

      Cette ligne récupère normalement quelque chose comme article.php3?id_article=3.

      Tu la changes alors pour quelque chose comme :

              $uri_art = "dossier_perso?id_article=".$GLOBALS['id_article'];

      À tester avant mise en production ! J’écris ça sans vérifier mais ça devrait fonctionner... Soyons optimiste. :-)

      gpl

    Répondre à ce message

  • J’utilise conjointement les fonctions de « sommaire » et de « découper » l’article. :-D

    Mon souci est que les liens fonctionnent bien sur les éléments pris dans le sommaire qui renvoient à la page actuelle, mais qu’ils sont inopérants pour renvoyer à des éléments des pages précédantes ou suivantes... Avez vous une soluce ?

    Répondre à ce message

  • Bravo pour ce petit script. J’ai juste un petit souci, les images que je mets dans le texte apparaissent en document joint lorsqu’elles sont en page suivante ou précédent. Y’ t-il un moyen de remédier à ça ?

    MERCI

    B-)

    Répondre à ce message

  • 2

    Je suis débutante avec spip et je travaille sous la version 1.4.2. Je ne parviens pas à mettre en place correctement ce filtre. N’ayant pas trouvé, le fichier "mes_fonctions.php3", j’ai incorporé le code dans config-fonctions.php3. Et j’ai incorporer dans le squelette d’article.html le code indiquer.

    Maintenant dès que je veux ouvrir un article le message suivant m’est délivré : Erreur : filtre « decouper_en_page » non défini.

    Je ne comprends pas vez-vous une solution ?

    • Il faut copier le filtre dans un fichier mes_fonctions.php3 que vous créez à la racine du site spip (pas dans le répertoire écrire). Il ne faut surtout pas modifier les fichiers existants.

    • il faut aussi ne pas oublier de mettre en début et en fin du fichier mes_fonctions.php3 les balises php suivantes :

      <?php
      
      ici vos fonctions
      
      
      ?>

      Et là plus d’erreur du style, je ne trouve pas le filtre machin ...

      A bientôt

      Romain

    Répondre à ce message

  • Pour changer les chevrons (<<>>) en ’précedent’ et ’suivant’, il convient de le faire là :

    -  Avant :

            switch (TRUE) {
                    case ($artsuite == 0):
                            $precedent = "";
                            $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</A>";
                            break;
                    case ($artsuite == ($num_pages-1)):
                            $precedent = "<A HREF='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</A>";
                            $suivant = "";
                            break;
                    default:
                            $precedent = "<A HREF='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</A>";
                            $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</A>";
                            break;
            }

    -  Après :

            switch (TRUE) {
                    case ($artsuite == 0):
                            $precedent = "";
                            $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'>Suivant</A>";
                            break;
                    case ($artsuite == ($num_pages-1)):
                            $precedent = "<A HREF='" . $uri_art . "artsuite=" . $p_prec . "'>Precedent</A>";
                            $suivant = "";
                            break;
                    default:
                            $precedent = "<A HREF='" . $uri_art . "artsuite=" . $p_prec . "'>Precedent</A>";
                            $suivant = "<A HREF='" . $uri_art . "artsuite=" . $p_suiv . "'>Suivant</A>";
                            break;
            }

    Mais cela risque de faire un peu beaucoup au dessus du texte au niveau esthétique :)

    Répondre à ce message

  • Bonsoir

    Encore merci pour ce filtre très utile !
    En local je développe un site sous spip 1.5.1. Il s’avère que le filtre fonctionne mais pour les pages suivantes chaque premier paragraphe de la page commence par l’affichage de la puce par défaut.
    J’ai bien regardé dans l’article ou le squelette je n’ai placé aucun « - ».
    Avez vous déjà rencontré un souci similaire ?

    De plus je ne connais pas grand chose au php mais toujours dans l’idée de personnaliser la présentation où remplacer les « <<" ou ">> » par précèdent ou suivant ?

    encore merci et à très bientôt

    annabelle paillery

    Répondre à ce message

  • Pour aligner les liens a droite il suffit simplement de changer les lignes à la fin

    // Ici, on peut personnaliser la présentation

    $resultat = « <(P)><(DIV CLASS=’pagination’)>$precedent $milieu $suivant<(/DIV)><(/P)> » ;

    $resultat .= $page[$artsuite] ;

    $resultat .= « <(P CLASS=’pagination’)><(DIV CLASS=’pagination’)>$precedent $milieu $suivant<(/DIV)><(/P)> » ;

    return $resultat ;

    par

    // Ici, on peut personnaliser la présentation

    $resultat = « <(P)><(DIV CLASS=’pagination’)><(div align=’right’)>$precedent $milieu $suivant<(/div)><(/DIV)><(/P)> » ;

    $resultat .= $page[$artsuite] ;

    $resultat .= « <(P CLASS=’pagination’)><(DIV CLASS=’pagination’)><(div align=’right’)>$precedent $milieu $suivant<(/div)><(/DIV)><(/P)> » ;

    return $resultat ;

    c’est du html tout simple

    p.s : supprimez toutes les parenthese entre les < > que j’ai placé pour eviter à spip d’interpreter le code html

    Répondre à ce message

  • Salut,

     :’-D Je bute sur un point sans doute simple à résoudre. Je cherche à aligner à droite la numérotation des sauts de page et à changer la typo via une feuille de style. Mes essais se terminent ... par une parse error. Comment dois-je m’y prendre ? Merci Anton.

    Répondre à ce message

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