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;
}
}