Creating mojoportal module ShowChildPagesByParentPageID

В одном из моих проектов мне пришлось писать очередной модуль для CMS MojoPortal. Задание: показать содержание книги, в то время как пользователь читает эту книгу и переходит от страницы к странице.

  • Оглавление
    • Глава 1
      • Страница 1
      • Страница 2
    • Глава 2
      • Страница 1
      • Страница 2

Дело в том, что в 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

Результат: 

Добавить комментарий

Loading