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

  • 2
    Jean-Marc Tourreilles

    Bravo pour ce filtre, très élégant.

    Pourquoi ne pas le faire dériver vers un script similaire permettant de découper un article en plusieurs colonnes ? J’avoue que je ne vois pas comment le faire.

    • Bonjour,
      je suis un nouvel utilisateur mais cependant un peu habitué aux cms en général.
      Ce que je ne comprends pas c’est où est le fichier mes_fonctions.php3 ?
      J’ai beau cherché je ne le trouves pas !
      Faut-il le créer et le mettre à la racine du site ?

    • Bon en fait j’ai compris quand j’ai installé un squelette.
      Maintenant j’ai le fichier : que du bonheur.
      Spip me plait déjà beaucoup ^_^

    Répondre à ce message

  • 2

    Bonjour je n’arrive pas a afficher de tableau apres les 5- .... :-/ Une solution.. ;-) merci.

    • J’avais le même problème que j’ai réglé comme suit :

      remplacer les cinq tirets par un autre ensemble de signes, non utilisés par Spip (pour ma part, j’ai choisi §§.

      Modifier le script en conséquence :

      $page=split(’§§’,$texte) ;

      Comme cela, on peut appeler le script sans désactiver les fonctions SPIP avec :

      [(#TEXTE|decouper_en_page|propre)]

      Chez moi cela fonctionne très bien

    • Je ne comprends pas pourquoi, j’ai fait cette manip et chez moi ca ne passe pas.

      Ce que j’ai fait : remplacer dans le fichier mes_fonctions.php3 les deux occurences de :

      $page = split(’-----’, $texte) ;

      par $page = split(’§§’, $texte) ;

      et ensuite j’ai modifié les séparateurs dans mon articel (donc en mettant des §§ au lieu de ----- à chaque fois que je voulais un saut de page)

      et enfin j’ai appelé
      (#TEXTE
      dans mon squelette.

      Résultat : j’ai mon sommaire qui est bien découpé mais par contre dans mon texte, au lieu d’avoir un beau saut de page, j’ai un malheurexu §§ :-((

      Je n’arrive pas à voir ce que je fais de pas correct.
      Si l’un de vous voit mon erreur, please let me know.

      Mercu d’avance,
      steevy.

    Répondre à ce message

  • 2

    Super ce script !
    Une question : coment éviter que le CHAPO revienne à chaque page ?

    Exemple du problème

    Merci de votre aide.

    • tu peux compléter le filtre avec une fonction de ce style :

      function cacher_decouper_en_page($texte)
      global $artsuite ;

      if ($artsuite>0)
      $texte=’’ ;

      return $texte ;

      et ajouter ceci dans ton squelette :

      (#CHAPO

      Le chapo n’apparaitra que sur la première page.

    • Super !

      Merci beaucoup de ton aide :-)

    Répondre à ce message

  • Stéphane VANPOPERYNGHE

    Le script désactive la transformation des tableaux avec SPIP. Existe-t-il un moyen (filtre SPIP ?) pour réactiver cela ?

    Répondre à ce message

  • Bonjour et félicitations pour ce script qui s’avère plutôt utile !

    Je suis débutant sur spip et je cherche à faire la chose suivante :

    Imaginons une rubrique qui contient 200 articles. J’aimerais afficher mes articles par pages de 10 ou 20, en les classant au choix par date, par auteur ou theme...

    Est-ce possible ? Merci !

    Répondre à ce message

  • J’ai proposé un article où J’ai couplé les scripts « sommaire » et « découper un article en plusieurs pages ».

    Il est en attente de validation

    Répondre à ce message

  • Salut !

    C’est vrai, il est top ton filtre, mais il ne marche pas avec des squelette de EVA, pour des raisons que j’ignore. Essaie-le, tu verras. Je ne suis pas le seul à le constater.

    Si tu a trouve une solution, fais le savoir s.v.p.

    André

    Répondre à ce message

  • Bonjour à tous les spipeurs

    ok ce code marche impec je remercie le spipmaster car ce code est vraiment important pour donner à un article un effet de livre contenant plusieur pages.

    Je le recommande car cela permet aux visiteurs d’un article de ne pas être découragés à lire vos articles par l’aspect interminable de votre page.
    Je ne suis pas un spécialiste que du contraire je suis même assez nul pour la prog. et là j’ai réalisé sa mise en ligne sans mentir en 2 minutes, et l’effet super. voir exemple : voir exemple ici
    Merci à vous

    Répondre à ce message

  • 2

    Le problème que pose ce script, c’est qu’il faut sans cesse revenir dans l’article pour ajuster là où l’on va couper, ce n’est jamais très régulier...etc., c’est domage, ce fonctionnement à « tatonnements », il faudrait quelquechose de plus automatique...

    • Le problème, c’est qu’aucun algorithme ne permet de découper « intelligemment »... On pourrait prévoir de découper tous les cinq paragraphes, ou tous les 5 000 caractères. Mais je n’écrirai pas ce filtre : trop systématique !

      Un candidat ? ;-)

    • J’insiste (oui c’est ma nature :-D) mais il faut que je précise ma réflexion : Bien souvent lorsque l’on écrit un article, il se décompose en plusieurs paragraphes... pourquoi alors ne pas laisser la possibilité avec un truc comme (texte de tranformer ces paragraphes en plusieurs pages différentes, avec en bas de page un petit menu qui reprend chaque titre de paragraphe pour pouvoir naviguer aisément...actuellement la solution c’est d’écrire plusieurs articles...mais en terme de lisibilité c’est moyen...

      Il me semle (je ne suis pas dévelopeur) que c’est assez facile, il suffit de tester le

      non ?

      j’espère avoir été clair, voici ci dessous un petit explicatif :

      PAGE 1

      Titre article

      titre paragraphe1

      texte paragraphe 1


      Titre article :

      page 1 : titre paragraphe 1 (pas de lien puisque l’on est dessus)

      page 2 : titre paragraphe 2 (lien)

      page 3 : titre paragraphe 3 (lien)
      etc...

      PAGE 2

      Titre article

      titre paragraphe2

      texte paragraphe 2


      Titre article :

      page 1 : titre paragraphe 1 (lien)

      page 2 : titre paragraphe 2 (pas de lien puisque l’on est dessus)

      page 3 : titre paragraphe 3 (lien)
      etc..

      ETC...

      Merci @+

    Répondre à ce message

  • Y a-t’il un filtre pour imprimer une seule page sur 2 ?

    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