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.

updated on 14 February 2019

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.

    Reply to this 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

    Reply to this 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 ?

    Reply to this 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-)

    Reply to this 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

    Reply to this 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 :)

    Reply to this 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

    Reply to this 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

    Reply to this 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.

    Reply to this message

Comment on this article

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