BlogEngine.NETのページリストの階層化

ぶりちゃんの使っているブログシステム、BlogEngine.NETには、固定ページを持てるPageがありまして、そのリストもサイドなどに表示できるのですが・・・
せっかくの階層化構造が可能なのに、Listで反映できない・・・

ということで、階層化構造に対応できるようにソースを眺めてみる。

ページリストは、HTMLのUl、liタグで構成されているようで、これだと階層は厳しい~(スタイルシートでやろうと思えばできるでしょうけど)
カテゴリは階層化されてるのですが・・・-でつなぐのもなんかみづらいよねぇ

ページリスト出力部分を変更して、dl,dt,ddタグ(階層化)リストを取得するよう変更してみました。
ソートはいれていないので、表示がちょっとアレですが、このブログの右側のバー上のページは階層化表示しています。

とりあえず、ソースを眺めてみる・・・
場所は、BlogEngine.Net\App_Code\Controls\PageList.csのようですねぇ。

ここの、BindPages()でリストを生成しているようなので、ここを書き換えてしまいます。

private HtmlGenericControl BindPages() 
{ 
    HtmlGenericControl dl = new HtmlGenericControl("dl"); 
    dl.Attributes.Add("class", "pagelist"); 
    dl.ID = "pagelist"; 
    //親ページリストを取得 
    List<BlogEngine.Core.Page> ps = GetStructurePageList(null); 
    foreach (BlogEngine.Core.Page page in ps) 
    { 
        HtmlGenericControl dt = new HtmlGenericControl("dt"); 
        CreateStructureItem(dt, page); 
        dl.Controls.Add(dt); 
        //階層チェック 
        if (page.HasChildPages == true) 
        { 
            //子ページリストを取得
            List<BlogEngine.Core.Page> psc = GetStructurePageList(page); 
            foreach (BlogEngine.Core.Page cpage in psc) 
            { 
                HtmlGenericControl dd = new HtmlGenericControl("dd"); 
                CreateStructureItem(dd, cpage); 
                dl.Controls.Add(dd); 
            } 
        } 
    } 
    return dl; 
} 

対象階層のページリストを取得するコードを追加します。

protected List<BlogEngine.Core.Page> GetStructurePageList(BlogEngine.Core.Page Parent) 
{ 
    List<BlogEngine.Core.Page> retval = new List<BlogEngine.Core.Page>(); 
    Guid gparent = new Guid(); 
    if (Parent == null) 
    { 
        gparent = Guid.Empty; 
    }else{ 
        gparent = Parent.Id; 
    } 
        //対象階層のリストを返す 
      foreach (BlogEngine.Core.Page page in BlogEngine.Core.Page.Pages) 
      { 
        if (page.ShowInList && page.IsVisibleToPublic && page.Parent == gparent) 
        { 
            retval.Add(page); 
        } 
    } 
    return retval; 
} 

ぶりちゃんの場合ですが、アンカーコードを追加するコードを別メソッドにしています。
これはまあ、直でいれても大丈夫かなと^^;

protected void CreateStructureItem(HtmlGenericControl ctl,BlogEngine.Core.Page page) 
{ 
    HtmlAnchor anc = new HtmlAnchor(); 
    anc.HRef = page.RelativeLink.ToString(); 
    anc.InnerHtml = page.Title; 
    anc.Title = page.Description; 
    ctl.Controls.Add(anc); 
} 

これとは別に、BlogEngine.NETで使用しているテーマのスタイルシートを変更する必要もあります。
pagelist.ulやpagelist.liを探して、pagelist.dl、pagelist.dt、pagelist.ddを作るとよいかと思います。

こんな感じで変更してますが、2階層までしか対応していません(ぉ
まあ、それ以上にすると、タグがいろいろと面倒なので^^;

コメントを書く

Month List