SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

288 Plugins, 197 contribs sur SPIP-Zone, 167 visiteurs en ce moment

Accueil > Rédaction > Sommaires > Article sur plusieurs pages > Découper un article en plusieurs pages

Découper un article en plusieurs pages

26 janvier 2003 – par gpl – 93 commentaires

3 votes

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 :

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.

Dernière modification de cette page le 16 avril 2015

Retour en haut de la page

Tout afficher

Vos commentaires

  • Le 8 décembre 2014 à 19:27, par francoisd En réponse à : Découper un article en plusieurs pages

    Bonjour,

    J’avais cette modif sur une vers 1.9 de spip et j’ai appliqué la modif de votre dernier message suite à la mise à jour en version 2. Cependant, maintenant que spip est passé en version 3, le paramètre $id_article n’est pas transmis à « mes_fonctions/php » et me génère donc des messages d’erreurs.

    Comment corriger ce problème ?

    Merci d’avance.

    Répondre à ce message

  • Le 23 mai 2009 à 21:03, par bdegoy En réponse à : Découper un article en plusieurs pages pour SPIP 2.x

    Vin’S a écrit : « Il faut donc passer en paramètre #ID_ARTICLE et #ENVartsuite lors de l’appel de la fonction decouper_en_page() dans le squelette, pour que la fonction php connaisse la valeur de ces deux variables. Après ça miracle, tout roule ! »

     

    Pour que cela fonctionne avec SPIP 2.x, il faut :
    -  appeler le filtre sous la forme : decouper_en_page{#ID_ARTICLE}
    -  changer la fonction pour function decouper_en_page($texte, $id_article)
    -  supprimer les globales, et les remplacer par $artsuite = $_GET['artsuite'];
    -  remplacer $uri_art = generer_url_article($GLOBALS['id_article']); par :  $uri_art = generer_url_entite($id_article', "article");

     

    Voilà ce que cela donne :

    function decouper_en_page($texte,  $id_article) {
           //[spip20]global $artsuite, $var_recherche, $num_pages;
           $artsuite = $_GET['artsuite'];  //[spip20]
           if (empty($artsuite)) $artsuite = 0;
           
                    // on divise la page (séparateur : "-----")        
           $page = split('-----', $texte);
           // Nombre total de pages
           $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) {
                            // On place les ancres sur les intertitres
                            $texte = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $texte);
                            $array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $texte);
                            $res =count($array);
                            $i =1;
                            $texte=$array[0];
                            while($i<$res){
                                    $texte=$texte.$i.$array[$i];
                                    $i++;
                            }
                            return $texte;
           }

           $p_prec = $artsuite - 1;
           $p_suiv = $artsuite + 1;
           //[spip20]$uri_art = generer_url_article($id_article);
           $uri_art = generer_url_entite($id_article, "article"); //[spip20]
           $uri_art .= strpos($uri_art, '?') ? '&' : '?';

                    // On place les ancres sur les intertitres
                    $page[$artsuite] = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $page[$artsuite]);
                    $array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $page[$artsuite]);
                    $res =count($array);
                    $i =1;
                    $page[$artsuite]=$array[0];
                    while($i<$res){
                            $page[$artsuite]=$page[$artsuite].$i.$array[$i];
                            $i++;
                    }
                    // Pagination
                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 .= " <strong>" . ++$j . "</strong> ";
               }
                            else {
                                    $milieu .= " <a href='" . $uri_art . "artsuite=$i'>" . ++$j . "</a> ";
                            }
           }

           // Ici, on peut personnaliser la présentation
           $resultat .= $page[$artsuite];
           $resultat .= "<div class='pagination' style='text-align:center'>pages : $precedent $milieu $suivant</div>";
           return $resultat;
    }
    // FIN du Filtre decouper_en_page

    Il est vrai que j’ai omis de régler le problème du surlignage des mots de la recherche, je réfléchis à cela.

    Bien cordialement à tous.

    • Le 29 août 2012 à 13:06, par bdegoy En réponse à : Découper un article en plusieurs pages

      Je fais suite à mon précédent message dans lequel j’ai oublié de préciser quelquechose. Je dis :« appeler le filtre sous la forme : decouper_en_page#ID_ARTICLE ».

      Il faut donc modifier aussi la fonction sommaire_article :

      //[spip2]function sommaire_article($texte)
      function sommaire_article($texte, $id_article)     //[spip2]
      {
             $artsuite = 0;
             $page = split('-----', $texte);
             //[spip20]$uri_art = generer_url_article($GLOBALS['id_article']);
             $uri_art = generer_url_entite($id_article, "article"); //[spip2]
             $uri_art .= strpos($uri_art, '?') ? '&' : '?';

         $i=0;
         $texte="";
         while($page[$i]){
             // On ajoute une ancre aux intertitres "{{{ }}}" que l'on utilise pour créer le sommaire
             preg_match_all("|\{\{\{(.*)\}\}\}|U",$page[$i], $regs);
              $nb=1;
             for($j=0;$j<count($regs[1]);$j++){
                 $p=$i+1;
                 $texte=$texte."<li><a href=\"". $uri_art . "artsuite=" .$i. "#sommaire_".$nb."\" title=\"".$regs[1][$j]."\">".$regs[1][$j]."</a>,&nbsp;p$p</li>\n";
                 $nb++;
             }
             $i++;
         }
             if (empty($texte)) $texte="";
             else $texte="<ul>\n".$texte."</ul>\n";
             return $texte;
      }
      // Fin du filtre sommaire

    Répondre à ce message

  • Le 9 mars 2009 à 10:31, par mowa En réponse à : Découper un article en plusieurs pages

    Bonjour,
    j ai mis spip 2,0,5 et je n arrive pas a faire marcher le script, comment passer en parametre #Id_ARTICLE et #ENV_artsuite ??
    la fonction decouper_en_page() ne veux pas accepter 2arguments ?
    J’ai essayer pleins de possibilités ?? As tu renommez le .php3 en .php ou laisser comme ca ??

    Merci pour vos furtures reponses.

    Répondre à ce message

  • Le 2 mars 2009 à 20:40, par Vin’S En réponse à : Découper un article en plusieurs pages

    Personnellement j’ai utilisé deux astuces de derrière les fagots pour faire marcher cette contrib’ sous la 2.0.5.
    Comme je ne suis pas un as du .php, j’ai pu identifier d’où venaient les problèmes mais je ne sais pas pourquoi ça marchait dans les vieilles version de Spip et pas dans la nouvelle.
    Les deux soucis viennent des variables globales.
    Je ne sais pas par quelle magie la déclaration « global $artsuite » récupérait le numéro généré dans l’URL, mais ça ne marche plus dans la 2.0.x.
    Idem pour GLOBALS[’id_article’] qui ne marche plus dans les nouvelles versions de Spip.
    Il faut donc passer en paramètre #ID_ARTICLE et #ENVartsuite lors de l’appel de la fonction decouper_en_page() dans le squelette, pour que la fonction php connaisse la valeur de ces deux variables.
    Après ça miracle, tout roule !

    Si certains ont des questions et ont besoin de ce script, je peux répondre ici.

    Répondre à ce message

  • Le 27 février 2009 à 22:58, par Spoun En réponse à : Découper un article en plusieurs pages

    Bonjour, quelqu’un aurait-il une solution pour faire marcher cette contrib sous spip 2.0.x ?

    Répondre à ce message

  • Le 17 avril 2008 à 15:12, par maude En réponse à : Découper un article en plusieurs pages

    bonjour. g un petit souci,
    en faite je souhaite découper mon site en page ; c un long bandeau de 1000px(ou +) de largeur(chaque page est dc l’une a coté de l’autre) et chaque page est une rubrique. on peut naviguer par scrooling, mais je souhaiterai ajouter un menu rapide qui permettrai d’acceder directement a tel ou tel page en un clic.
    je pense que c la même chose que de découper un article en page, sauf que c’est sur la largeur, est ce que c’est possible en css ?
    help !

    Répondre à ce message

  • Le 3 mars 2006 à 09:21, par fulvio En réponse à : Découper un article en plusieurs pages

    comment insérer des séparateurs entre les numéros de pages en bas de l’article ? Soit 1. 2. 3. .. soit 1 | 2 | 3 ... je ne sais pas ou placer ca dans le code

    Répondre à ce message

  • Le 10 mai 2007 à 10:25, par Willy En réponse à : Découper un article en plusieurs pages

    Bonjour,
    Comment modifier la fonction pour que la découpe des pages se fasse de façon automatique par rapport à un nombre de caractère par exemple.
    Je me doute que c’est « $page = split(’-----’, $texte) ; » qu’il faut remplacer cependant je ne vois pas comment.

    Je sais bien qu’une telle découpe automatique n’est pas conseillé mais je souhaite juste savoir comment est il possible de le faire. Merci de vos réponses.

    • Le 10 mai 2007 à 12:09, par Willy En réponse à : Découper un article en plusieurs pages

      J’ai enfin trouvé la réponse sur un forum php : l’utilisation de wordwrap().
      Wordwrap() permet nottament d’insérer un séparateur tous les n caractères en revenant au mot précédent pour ne pas le couper.

      j’ai pu ainsi intégrer automatiquement des ’-----’ à partir de x caractères et laisser ainsi le « split » fonctionner normalement.

      Donc : en fait, pour un découpage automatique :
      je remplace : $page = split(’-----’, $texte) ;
      par $texte2 = wordwrap($texte, 2000, ’-----’, 1) ;
      $page = split(’-----’, $texte2) ;
      voila ^^

    • Le 17 juillet 2007 à 11:29, par cedricici En réponse à : Découper un article en plusieurs pages

      Bonjour sur le même principe, j’ai modifié le filtre pour qu’il découpe l’article en ’n’ paragraphes entiers, la somme des caractères de ces paragraphes par pages étant inférieurs à la limite ajouté en argument du filtre (=2000 par defaut)

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

      devient : avec $limite =2000 par defaut

      // on coupe tous les paragraphes et on regroupe ceux < $limite caractères

      $paragraphe = split(’’\n\n’’, $texte) ;

      $page[] = ’’’’ ;

      foreach($paragraphe as $par)

       if((strlen($page[sizeof($page)-1])+strlen($par)) <= $limite)

         $page[sizeof($page)-1] = $page[sizeof($page)-1].’’\n\n’’.$par ;

         else

          $page[]=’’\n\n’’.$par ;

        

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

    Répondre à ce message

  • Le 22 mars 2007 à 09:04, par Dom En réponse à : Testé avec 1.9.2

    Je viens de l’installer sur une 1.9.2, ça marche parfaitement du premier coup.

    Par contre cela semble assez difficile à personnaliser. N’y a-t-il pas d’autres moyens ou plugins ? Cette fonction n’est pourtant pas si exotique pour un logiciel de publication d’articles.

    Merci en tous cas, ça fonctionne très bien.

    Répondre à ce message

  • Le 3 mai 2007 à 17:18, par Jérémy Zucchi En réponse à : Problème avec Firefox

    Bonjour, et tout d’abord bravo pour ce filtre très pratique ! J’utilise le squelette EGT et sous Firefox il y a un problème au niveau du menu dépliable depuis que j’ai ajouté le fitre pour découper les articles (voir exemple). Par contre le découpage marche même sous Firefox, c’est juste le menu qui bugue. Si quelqu’un a une idée...

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Plugin Modèles media

    25 avril 2011 – 180 commentaires

    Les modèles , et produisent chacun un résultat différent et ce résultat, pour les images, dépend du fait qu’elle soit dans le portfolio ou non. Ce plugin propose une nouvelle série de modèles ayant un comportement unifié et indépendant du mode des (...)

  • Qrcode

    3 novembre 2010 – 45 commentaires

    Les QrCodes sont des codes barres lisibles essentiellement par les téléphones portables et permettent d’échanger avec ceux-ci diverses informations, et en particulier des liens. Ce plugin à pour objet de permettre à spip d’utiliser des QrCodes pour (...)

  • Speedsyndic pour SPIP 2 et SPIP 3

    11 octobre 2010 – 27 commentaires

    Ce plugin est une version compatible spip 2.0.x / 2.1 / 3.1 du plugin Speedsyndic Note : Une bonne partie du texte ci-dessous a été pompé de cet article, expliquant la version précédente du plugin. je n’ai fait qu’adapter le code pour spip 2, (...)

  • LIM : alléger l’espace privé

    20 avril 2015 – 41 commentaires

    Ce plugin permet de désactiver l’affichage de blocs ou de boutons, présents par défaut dans SPIP mais qui peuvent devenir inutiles dans le cadre de votre projet. Il allège du coup l’interface d’édition et supprime d’éventuels risques de confusion (...)

  • HTML Purifier

    5 janvier 2011 – commentaires

    Pour sécuriser l’affichage de certains textes (ceux qui proviennent potentiellement non pas des rédacteurs, mais de visiteurs non enregistrés ou de contributeurs externes, comme les forums ou les contenus des sites syndiqués), SPIP utilise en interne (...)

Ça spipe par là