Jump to:

23377 Posts in 18296 Topics by 2867 members

General Questions

SilverStripe Forums » General Questions » Create page anchor menu automatically

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Page: 1
Go to End
Author Topic: 1860 Views
  • erwanpia
    Avatar
    Community Member
    63 Posts

    Create page anchor menu automatically Link to this post

    Hi, I have a nice hack here below I put it in this forum because I don't know where else to post it. I suggest you silverstripe guys create a hack forum

    this one is an extension of Page that creates a function that automatically creates a menu from H1 titles within a page, and modify the content variable to create anchors and links. It's based on some plugin from modx (another nice cms getting old) and please note it has a global function and global varialbes so it's not very object but it works so enjoy

    usage : in your template, place $AnchorMenu where you want the menu to be didplayed

    <?php
       function findAnchors($matches)
    {
       global $anchorTitles, $navbar,$premier;
       $start_tag=$matches[1]; //<h2>
       $h=trim($matches[2]); //titre dans les balises <h2> </h2>
       $end_tag=$matches[3]; //</h2>
       
        $search= array ('/(id="(.*)")/sim');
        $start_tag=preg_replace( $search, "", $start_tag);
       
       $nom_ancre = html_entity_decode($h);
        $search=(explode('::',wordwrap(" �����������������������������������������������������",1,'::',1)));
        $replac=(explode('::',wordwrap("-AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc",1,'::',1)));
       $nom_ancre=str_replace($search, $replac , $nom_ancre);
       
       $search=array('/<[\/\!]*?[^<>]*?>/si','/([\r\n])[\s]+/','/[^_A-Za-z0-9-]/','/-$/');
       $replace=array('');
       $anchor=preg_replace ($search, $replace,$nom_ancre);// vire les accents et divers caract�res
       
       $anchor= substr(strtolower($anchor),0,20); //$nom_ancre=strtolower(rawurlencode($nom_ancre));
       $anchorTitles[$h]=$anchor; // sauvegarde du titre et de l'ancre pour le sommaire
       // don't write a navbar for the first title
       if ($premier)
       {$str="\n$start_tag id='" .$anchor. "'> $h $end_tag\n";}    
        else
        { $str="\n$start_tag id='" .$anchor . "'> $h $end_tag\n" . $navbar ;}
       
       $premier=false;
       return $str;
    }

    class Page extends SiteTree {
       
       public static $db = array(
       );
       
       public static $has_one = array(
       );
       

       function Content()
       {
       global $anchorTitles, $navbar,$premier;
       $all_lines = $this->Content;
       $heading_level='1';
       $anchorTitles =array();
       $search= array ('/(<h'.$heading_level.'[^>]*)>(.+?)(<\/h'.$heading_level.'>)/sim');
       $all_lines_replaced=preg_replace_callback($search, 'findAnchors', $all_lines); //replace les titre <h2> </h2> par <h2 id=""></h2>
          return $all_lines_replaced;
       }
       function AnchorMenu()
       {
       global $anchorTitles, $navbar,$premier;
       $all_lines = $this->Content;
       $heading_level='1';
       $anchorTitles =array();
       $search= array ('/(<h'.$heading_level.'[^>]*)>(.+?)(<\/h'.$heading_level.'>)/sim');
       $all_lines_replaced=preg_replace_callback($search, 'findAnchors', $all_lines); //replace les titre <h2> </h2> par <h2 id=""></h2>
       foreach ($anchorTitles as $nom_titre_h2 =>$ancre_h2 )
          $sommaire.= " <li><a href=\"".$_SERVER['REQUEST_URI']."#". $ancre_h2."\" onclick=\"new Effect.ScrollTo('$ancre_h2',{duration:1});return false;\">$nom_titre_h2</a></li>";
       
       return $sommaire;
       }
       

       
    }

    1860 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.