В одном из моих проектов мне пришлось писать очередной модуль для CMS MojoPortal. Задание: показать содержание книги, в то время как пользователь читает эту книгу и переходит от страницы к странице.
Дело в том, что в mojo есть модуль, который показывает иерархически "под страницы" текущей страницы, то есть если вы находитесь на странице Глава 1, то в меню будут только страницы, которые находятся по иерархии ниже. Это нам не подходит.
Суть модуля: есть у нас страница с содержанием, которая имеет свой ID (ParentPageID), нужно показать все дочерние страницы.
Основные функции модуля:
private void PopulateControls()
{
int _temp;
int _PageID = Settings["PageID"] != null && Int32.TryParse(Settings["PageID"].ToString(), out _temp) ? Int32.Parse(Settings["PageID"].ToString()) : -1;
System.Data.IDataReader reader = mojoPortal.Data.DBPageSettings.GetPageList(this.SiteId);
List<mojoPortal.Business.PageSettings> pages = new List<PageSettings>();
while (reader.Read())
{
int PageGuid = reader.GetOrdinal("PageGuid");
mojoPortal.Business.PageSettings page = new PageSettings(reader.GetGuid(PageGuid));
if (page.IncludeInChildSiteMap && !page.IsPending) //check some criteria
{
pages.Add(page);
}
}
reader.Close();
HtmlGenericControl _ul = new HtmlGenericControl("ul");
_ul.Attributes.Add("class", "ShowChildPagesByParentPageID"); //add class for some modification
_ul.Controls.Add(PopulateSubPages(pages, _PageID));
this.Controls.Add(_ul);
}
private HtmlGenericControl PopulateSubPages(List<mojoPortal.Business.PageSettings> _pages, int _PageID)
{
HtmlGenericControl _li = new HtmlGenericControl("li");
mojoPortal.Business.PageSettings currentpage = _pages.Where(page => page.PageId == _PageID).Single();
HyperLink _lnk = new HyperLink();
_lnk.NavigateUrl = currentpage.Url;
_lnk.Text = currentpage.PageName;
if (this.PageId == currentpage.PageId) { _lnk.Attributes.Add("class", "active"); }//if current is active
_li.Controls.Add(_lnk);
HtmlGenericControl _ul = new HtmlGenericControl("ul");
bool childexists = false;
_pages.Where(page => page.ParentId == currentpage.PageId).ToList().ForEach(page =>
{
childexists = true;
_ul.Controls.Add(PopulateSubPages(_pages, page.PageId));
});
if (childexists)
{
_li.Controls.Add(_ul);
}
return _li;
}
Единственное вы должны в настройках модуля добавить ему параметр PageID
Результат: