ぶりちゃんの使っているブログシステム、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階層までしか対応していません(ぉ
まあ、それ以上にすると、タグがいろいろと面倒なので^^;