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

  • 3

    Je teste actuellement SPIP avec la version 1.7

    J’ai ajouté le fichier mes_fonctions.php3 contenant le code de la fonction. Dans une page de test j’ai appelé un article avec une boucle de type :

    <BOUCLE_texte_article(ARTICLES){id_article=4}>
          [(#TEXTE*|decouper_en_page|propre)]
            </BOUCLE_texte_article>

    Le résultat est le suivant :
    -  en haut de la page apparait le code de la fonction (ce n’est pas très joli...)
    -  à l’endroit où le texte devrait apparaître il y a le message : Erreur : filtre « decouper_en_page » non défini

    Quelqu’un peut-il m’aider ??

    Michaël

    • Il faut placer le code suivant dans le fichier mes_fonctions.php3 :

      <?php
      
      mes fonctions....
      
      ?>

      J’espère avoir répondu à ta question.

      Olivier

    • ça marche !!

      merci m’sieur.

      michaël

    • Merci de cette réponse, j’ai eu le même problème.

      Cependant, j’obtient maintenant un superbe Parse error ligne X unexpected T_function. une idée ?

      Merci !

    Répondre à ce message

  • Sansnom

    Script excellent qui remplace avantageusement la fonction couper plutôt encore sévèrement buguée.

    Juste un blème. Je l’utilise sur un squelette sommaire qui fonctionne comme un blog, cad qui ramène tous les articles, quelle que soit leur catégorie. Mon problème est que lorsque l’on change de page dans un article découpé en page, il n’y a pas de système d’ancre nommée, et donc on est renvoyé systématiquement au haut de la page sommaire et il faut rescroller pour retrouver l’article dans le défilé, ce qui est peu ergonomique.

    Quelqu’un sait-il modifier la fonction pour pallier cet inconvénient ?

    Répondre à ce message

  • Bonjour,

    Comme je n’avais pas le fichier mes_fonctions.php3 dans l’arborescence de spip je l’ai créé (renommé en php pour les besoins de l’hébergement). Ensuite, j’ai reporté dans article .html la ligne de code que vous proposez. Quel bazar, j’ai des messages d’erreur partout. Précision : le site est en php (nécessité de l’hébergeur). Je désespère de voir marcher ce sript qui m’intéresse pourtant dans la réalisation d’un projet pédagogique. Quelqu’un propose t’il une méthodo pas à pas : quelquechose de plus didactique avec ??? copies écran ?
    Si ça existe ?

    Répondre à ce message

  • Lestrade

    Bonjour,

    Tout fonctionne pour le mieux, sauf que, les renvois en bas de page (1), (2) etc ne fonctionnent plus sur les pages, sauf sur la dernière.
    Voir ici : http://www.oulala.net/Portail/article.php3?id_article=1283&artsuite=0

    Une idée docteur ?

    Merci

    Lestrade

    Répondre à ce message

  • sugardaddy

    je n’obtiens pas les 2 colonnes... juste une lettre bizarre au moment de la separation et plus de texte apres, la 2e colonne est zappée. mais keskispass ? merci de votre aide.

    Répondre à ce message

  • 1

    bonjour,

    le script fonctionne chez moi, la page est bien découpée, mais apparait l’erreur suivante sur chaque debut de page :

    Missing argument 2 for decouper_en_page() in /var/www/spip3/mes_fonctions.php3 on line 37

    • c’est bon :

      [(#TEXTE*|decouper_en_page{article}|propre)]

    Répondre à ce message

  • 4

    Bonjour à Tous est merci pour ce filtre qui marche bien à une petite exception près.

    En effet, le filtre ne permet pas de conserver la mise en page de l’article grâce au raccourci spip ( Mise en gros avec et mise en italiquen, H1, puce, etc...). Berf, on perd d’un côté ce que l’on gagne de l’autre.

    Si j’ai bien compris, cette désactivation fait suite à l’* après TEXTE, sinon, on aurait non pas un saut de page, mais une ligne horizontale. (-----) .

    Pour pouvoir conserver les deux (mise en page et article en plusieurs page), ne faudrait-il pas remplacer la combinaison des cinq ----- par une autre combinaison qui ne serait pas du tout vu par SPIP comme par exemple —saut_de_page—, qui a fort peux de chance de se trouver dans un article pour signifier autre chose. Et ainsi, si on enlève le filtre decouper_en_page, il y a toujours une logique avec TEXTE.

    Voilà, maintenant, je n’ai pas encore essayé de modifier la fonction. Je n’y connais rien en PHP. Je vais donc tatonner.

    Si quelqu’un à déjà la réponse, je suis preneur.

    Et merci encore pour tout.

    Romain

    • « « 
      En effet, le filtre ne permet pas de conserver la mise en page de l’article grâce au raccourci spip ( Mise en gros avec et mise en italiquen, H1, puce, etc...). Berf, on perd d’un côté ce que l’on gagne de l’autre.
       » »

      Si c’est le cas, c’est qu’il y a un problème. Le #TEXTE* supprimer, en effet, le traitement par défaut. Mais le dernier « filtre » appliqué à #TEXTE* est « propre » : celui-ci rétablit donc les traitements typo de Spip (H1, gras, etc.). Si ça ne marche pas dans votre cas, c’est qu’il y a un problème.

      « « 
      Si quelqu’un à déjà la réponse, je suis preneur.
       » »

      Merci de me dire si ça marche.

      « « 
      Et merci encore pour tout.
       » »

      De rien,

      gpl

    • Oups !! mon erreur est indépendante de SPIP et de la fonction. Désolé ..

      En fait, c’est un style gras qui s’appliquant à la cellule accueillantla balise TEXTE, modifait le résultat (il met tout en gras, so ... je ne voyais pas la différence gras / pas_gras.

      Par contre, l’astuce consistant à remplacer les 5 tiret par une autre expression (dans mon cas sautdepage) fonctionne et l’on peut alors mettre comme balise (TEXTE tout simplement.

      Merci pour ces aides

      Romain

    • « propre » marche donc. :-)

      Mais en utilisant une autre notation que cinq traits d’union, on perd la possibilité d’avoir un autre squelette pour le même article qui n’utilise pas decouper_page. En effet, sans decouper_page, cinq traits d’union font une ligne horizontale alors que tout autre choix du type —sautdepage— reste —sautdepage—. Imaginez faire un sqelette pour imprimer l’article complètement : il faudrait alors faire un filtre pour enlever le —sautdepage—...

      gpl

    • je n’ai pas trouvé un exemple pour enlever les symboles « §§ » de mon squellette d’impression « article-imp.html ».

      vous pourriez m’aider ?

      merci,
      tiago

    Répondre à ce message

  • 1

    Ce script est fonctionnel et très utile ... mais uniquement dans un squelette article(-dist).html.

    J’affiche dans certaines rubriques un article intégral (parfois long). Si j’utilise les filtres sommaire et/ou decouper_page dans le squelette d’une rubrique, ils fonctionnent pour la première page mais les liens générés (ancres et pages suivantes) sont incohérents.

    Je n’ai pas la compétence pour modifier ce script php : une idée ? une solution ?

    Merci pour cette contribution et votre aide.

    • Sauf erreur de ma part, je pense que ce problème peut-être résolu en modifiant uniquement cette ligne :

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

    Répondre à ce message

  • 1
    Thebigkiller

    voila chui un noob et je vois pas trop ou mettre le fameux [(#TEXTE*|decouper_en_page|propre)] dans mon squelette personne pour m’aider ? (je l’ai mis au hasard a une ligne blanche mais cela ne fonctionne pas et le fichier mes_fonctions.php3 a bien été mis en place)

    • Dans la boucle qui concerne l’affichage de l’article et bien sur de son texte :

      Exemple très rudimentaire :

      <B_un_article>
      	<BOUCLE_un_article(ARTICLES){id_article='n'}
      	[(#TEXTE*|decouper_en_page|propre)]
      	</BOUCLE_un_article>
      </B_un_article>

      En fait :

      [(#TEXTE*|decouper_en_page|propre)]

      remplace simplement dans ton squelette

      [(#TEXTE)]

    Répondre à ce message

  • 2

    Bonjour,

    Il faudrait rendre ce filtre compatible xhtml 1.0,
    préciser dans les commentaires du code que la variable des pages est « artsuite ».

    La documentation officielle (http://www.php.net/manual/fr/functi...) indique « Notez bien que si vous n’avez pas besoin de la puissance des expressions régulières, il est plus rapide d’utiliser explode(), qui n’utilise pas le moteur d’expressions régulières. »

    • > Il faudrait rendre ce filtre compatible xhtml 1.0,

      En l’état, les squelettes standards de Spip ne sont pas en XHtml 1.0 (il me semble). Sinon, c’est faisable très rapidement. Je le laisse comme « exercice au lecteur ».

      > préciser dans les commentaires du code que la variable des pages est « artsuite ».

      Oui mais pourquoi ?

      >La documentation officielle (http://www.php.net/manual/fr/functi...) indique

      > « Notez bien que si vous n’avez pas besoin de la puissance des expressions régulières,

      > il est plus rapide d’utiliser explode(), qui n’utilise pas le moteur d’expressions régulières. »

      Certes, mais on n’utilise pas d’expression rationnelle dans ce filtre, non ? Attention, on est le 5 janvier et mon cerveau n’est pas encore au clair. :-)

    • Bonjour,

      >> préciser dans les commentaires du code que la variable des pages est « artsuite ».

      > Oui mais pourquoi ?

      Pour savoir que « artsuite » est envoyé en GET dans la requète http, au cas où du php utiliserait une variable « artsuite » (cas rare mais non impossible).

      >> « Notez bien que si vous n’avez pas besoin de la puissance des expressions régulières,

      >> il est plus rapide d’utiliser explode(), qui n’utilise pas le moteur d’expressions régulières. »

      > Certes, mais on n’utilise pas d’expression rationnelle dans ce filtre, non ?
      > Attention, on est le 5 janvier et mon cerveau n’est pas encore au clair.

      Il suffit de relire à tête reposée :
      « [si vous n’utilisez pas d’] expressions régulières, il est plus rapide d’utiliser explode ».

    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