We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 27889
    • 415 Posts
    Un plugin qui insère un sommaire automatiquement dans la page, basé sur les titres avec des liens sur les différentes partie de votre page.
    Il ajoute aussi une barre de navigation (Prec.-Top-Accueil) devant chaque titre de la page.
    Download
    Demo
    // ***********************************************************
    // *           SOMMAIRE  by Soda                             *
    // ***********************************************************
    // * for english support mail to [email protected]              * 
    // ***********************************************************
    // * Ce plugin insère un sommaire automatiquement            *
    // * sur les pages comportant <!--sommaire-->                *
    // *                                                         *
    // * for english support mail to [email protected]              * 
    // * version:0.1 - license:free (mais un ptit mot serait sympa)
    // ***********************************************************
    // * Remarque, bug, remerciement, don ;)  : [email protected]   *
    // * !: Vos titre de document ne doivent pas avoir d'attribut, juste <h2>, pas <h2 style="jhhjh"> ou alors, il faut modifier la ligne : $search= array ('/(<h['.$titre_a_chercher.']>)(.+?)(<\/h['.$titre_a_chercher.']>)/m');
    // ***********************************************************
    // * Utilisation:                                            *
    // * Administration - Ressources - Gestion des ressources    *
    // *    nouveau plugin                                       *
    // *    dans "événements système, cocher OnWebPagePrerender  *
    // *    dans général , entrez un nom, pourquoi pas 'sommaire'*
    // *    dans code source coller cette page                   *
    // * Par défaut tous les titres h2 seront inclus dans le sommaire avec une barre de navigation devant chaque h2
    // * Usage : placer <!--sommaire--> (tel quel !) là ou le sommaire doit être inséré dans votre page ou votre template(pour toutes les pages auxquelles il est lié
    // *         (eventuellement) :Modifier le niveau de titre à inclure dans le sommaire (par défaut  <h2>) modifier $titre_a_chercher=2, 3 pour h3 ...
    // *         (eventuellement) :le sommaire utilise une liste ul, vous pouvez spécifier ici une classe pour pouvoir modifier le style dans votre css par défaut <ul class="plan">
    // * 				 (eventuellement) :si vous voulez enlevez la barre de navigation (précédent - haut de page - accueil)  avant chaque titre de document mettre $navbar à '': $navbar='';
    // * 				 (eventuellement) :vous pouvez modifier la barre de navigation (afin de mettre vos images par ex) en modifiant $navbar
    // ***********************************************************
    // * TODO: remplacer $navbar par un snippet evalSnippet ??? (je ne sais pas intégrer un snippet depuis un plugin, si vous avez la solution: [email protected]  !!!. Use the MODx API, je débute, votre aide est la bienvenue
    // ***********************************************************
    
    // variable pouvant nécessiter une configuration
    ini_set('display_errors', 1);  // 1 pour debug, 0 pour normal 
    global $tab_titres, $navbar, $premier;
    $titre_a_chercher='2';//pour h2 sinon 3 pour h3 ... Niveau  des titre pris en compte pour créer le sommaire
    $titre_sommaire="\n<h2>Sommaire</h2>\n";// titre (en html) apparaissant avant le sommaire
    $pied_sommaire="";// pied du sommaire (en html) apparaissant après le sommaire
    $classe_ul  = 'plan'; // le sommaire utilise une liste ul, vous pouvez spécifier ici une classe pour pouvoir affecter un style dans votre css. Par défaut <ul class="plan">
    // barre de navigation (ou autre) à insérer avant chaque titre dans la page (hors sommaire):  Accueil   -  Haut  -  Préc.
    $navbar='';   
    $navbar.="<div class=\"navibar\">\n";
    $navbar.="  <a class=\"iconeprec\" href=\"".$_SERVER['HTTP_REFERER']."\" title=\"Retour à votre page précédente\">Préc.</a>\n";
    $navbar.="  <a class=\"iconehaut\" href=\"".$_SERVER['REQUEST_URI']."#dpsite\" title=\"Allez en haut de la page\">Haut</a>\n";
    $navbar.="  <a class=\"iconeaccueil\" href=\"/\"title=\"Aller à la page Accueil\">Accueil</a>\n";
    $navbar.="<!-- fin navibar --></div>\n";
    //$navbar="<h2>------------------</h2>";
    // ***********************************************************
    // * fin de la configuration, début du traitement            *
    // ***********************************************************
    $premier=true;
    	function rep($matches)
    		{
    			global $tab_titres, $navbar,$premier;
    			$start_tag=$matches[1];  //<h2>
    			$h=trim($matches[2]);    //titre dans les balises <h2> </h2>
    			$end_tag=$matches[3];    //</h2>
    			// création de l'ancre:
    			$nom_ancre = html_entity_decode($h);
    			//$nom_ancre=substr($h2, 0, 15); //longueur de nom_ancre maxi
    			$search=array ('/\s+/','/é/','/è/','/ê/','/à/','/ô/','/î/','/û/','/ù/','/ç/','/\//','/</','/>/','/\&/');
    			$replace=array('_',      'e' ,'e'  , 'e'  ,'a'  ,'o',  'i',  'u',  'u',  'c','');
    			$nom_ancre=preg_replace ($search, $replace,$nom_ancre);// vire les accents
    			$nom_ancre=strtolower($nom_ancre);	//$nom_ancre=strtolower(rawurlencode($nom_ancre));
    			$tab_titres[$h]=$nom_ancre;         // sauvegarde du titre et de l'ancre pour le sommaire
    
    			$start_tag = substr($start_tag, 0, -1);  // vire le > de <h_>
    			if ($premier)	{	$str="\n$start_tag id=\"$nom_ancre\">$h$end_tag\n";} else	{ $str=$navbar . "\n$start_tag id=\"$nom_ancre\">$h$end_tag\n";}
    			$premier=false;
    			return $str;
    		}
    
    
    
    $all_lines = $modx->documentOutput;
    
    
    $findme='<!--sommaire-->';  
    //$pos=strpos($all_lines, $findme);
    //if ($pos === false) { // si le sommaire n'est pas à insérer, aucun traitement, sinon, bin ca bosse.  Marche po!
    //	exit;
    //	} else { // La chaîne '$findme' a été trouvée dans la chaîne '$mystring'";
    		
    		$tab_titres =array(); // tableau contenant les titres et les noms d'ancre
    		$search= array ('/(<h'.$titre_a_chercher.'>)(.+?)(<\/h'.$titre_a_chercher.'>)/m');
    		$all_lines_replaced=preg_replace_callback($search, 'rep', $all_lines);  //replace les titre <h2> </h2> par <h2 id=""></h2>
    
    		if ( count($tab_titres) ){ //s'il existe des titres 
    			$sommaire = $titre_sommaire. "\n<ul class=\"$classe_ul\">\n";
    			foreach ($tab_titres as  $nom_titre_h2 =>$ancre_h2 )
    			{
    				$sommaire.= "\n <li><a href=\"".$_SERVER['REQUEST_URI']."#". $ancre_h2."\">$nom_titre_h2</a></li>";	// $modx->documentObject['objectName'];				//href=\"[(base_url)][*alias*]#dpsite\"		//REQUEST_URI
    			}
    			$sommaire.= "\n</ul>\n".$pied_sommaire;
    			$all_lines_replaced=preg_replace ( array ('/<\!--sommaire-->/m'),array($sommaire),$all_lines_replaced); //insere le sommaire
    			$modx->documentOutput=$all_lines_replaced; // renvoie la page modifiée
    		}
    //	}
    	
    
    


    I love MODx and I use it !
      MODx Sites & Prestations: http://dp-site.fr [Last MODx Site]
      MODx Repository: [HOME] [MetaTagsExtra] / Current Dev: [xFDM]
      • 10487 MODX Staff
      • 1,535 Posts
      Hi Soda, nice plugin. smiley

      Could you please add this in the new Repository.

      Thanks, Garry
        Garry Nutting
        Senior Developer
        MODX, LLC

        Email: [email protected]
        Twitter: @garryn
        Web: modx.com
        • 27889
        • 415 Posts
        Yes I do it, must I remove it from here ?
          MODx Sites & Prestations: http://dp-site.fr [Last MODx Site]
          MODx Repository: [HOME] [MetaTagsExtra] / Current Dev: [xFDM]
          • 6726
          • 7,075 Posts
          Merci Soda pour ce plugin ! (ça me rappelle une certaine balise SPIP)

          Effectivement si tu ajoutes to plugin dans le repository (ce qui est effectivement la chose à faire), un fil de discussion sera automatiquement créé pour ton plugin dans le forum Repository Items support.

          L’idée est effectivement de n’avoir qu’un seul fil de discussion pour un item du repository. Paul Gregory, notre modérateur en chef, a posté un message concernant la "politique" en la matière :
          http://modxcms.com/forums/index.php/topic,5562.msg39499.html#msg39499


            .: COO - Commerce Guys - Community Driven Innovation :.


            MODx est l&#39;outil id
            • 33175
            • 711 Posts
            Merci beaucoup smiley
            Très interessant et utile smiley
              Sorry for my english. I&#39;m french... My dictionary is near me, but it&#39;s only a dictionary !
              • 6726
              • 7,075 Posts
              Juste une remarque Soda, en anglais "summary" veut dire résumé, je pense que le terme que tu devrai employer est plutôt "automatic TOC" (TOC en anglais = Table Of Content -> Sommaire).
                .: COO - Commerce Guys - Community Driven Innovation :.


                MODx est l&#39;outil id
                • 27889
                • 415 Posts
                J’ai bien placé ce plugin dans le Repository Items support, j’ai modifié le premier post avec le lien correct. Xi un admin bien sympa a viré l’ancien "summary" que j’ai pu remplacé par le nouveau "automatic toc"

                Désolé de ne pas l’avoir fait de suite. Pour Le summary en Toc je vais modifier (et changer de dictionnaire).
                Peut-être qu’ un admin pourrait modifier le titre du thread ?
                Merci pour vos remarques, j’en attend d’autres smiley
                  MODx Sites & Prestations: http://dp-site.fr [Last MODx Site]
                  MODx Repository: [HOME] [MetaTagsExtra] / Current Dev: [xFDM]