把blogengine当作cms作公司网站

我觉得blogengine程序跟可以用来作简单公司网站的cms的区别是,blogengine只有一个文章的列表,和展示文章的页面(post和page),cms需要有个多个分类下面一些的文章的列表的集合用来作首页,另外还要有侧边栏在不同的页面显示不同的内容。

考虑对程序有较小的改动,尽量用它提供的扩展点来实现,首页我用一个独立的page,page的内容写一些类别的“自定义标签”,输出的页面的时候用extension来动态替换,“自定义标签”类似这样:[CategoryPost  cate="新闻动态" type='list' count='5'],CategoryPost是标签名称,cate内容是分类的名称,type我定义了3种,一个是list,一个是标签页的样式,还有一种是单个的page,count为显示的个数。其实就是替换。

Extension代码如下:

[Extension("CategoryPost","0.1","dragon753")]

public class CategoryPost

{

    static CategoryPost()

	{

        BlogEngine.Core.Page.Serving += Publishable_Serving;

	}

    private static void Publishable_Serving(object sender, ServingEventArgs e)

    {

        int postCnt = Convert.ToInt32(ConfigurationManager.AppSettings["CategoryPostCount"]);

        if (e.Location == ServingLocation.SinglePage)

        {

            var page = (Page)sender;

            string pattern = @"\[CategoryPost(.|\n)" + "cate=[\'|\"](.+?)[\'|\"](.|\n)" + "type=[\'|\"](.+?)[\'|\"](.|\n)" + "count=[\'|\"](.+?)[\'|\"]" + @"+?\]";



            System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(e.Body, pattern,



            System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline);

            int tabCount = 0;

            while (m.Success)

            {

                string toReplace = m.Groups[0].Value;

                string categoryName = m.Groups[2].Value;



                string replacement = string.Empty;

                if (!string.IsNullOrEmpty(categoryName))

                {

                    string displayType = displayType = m.Groups[4].Value;

                    if (displayType.Equals("tab", StringComparison.OrdinalIgnoreCase))

                            replacement = GetTabReplacement(++tabCount, categoryName, postCnt);

                    else if (displayType.Equals("list", StringComparison.OrdinalIgnoreCase))

                            replacement = GetListReplacement(categoryName, postCnt);

                    else

                            replacement = GetSingleReplacement(categoryName, postCnt);

                }

                e.Body = e.Body.Replace(toReplace, replacement);

                m = System.Text.RegularExpressions.Regex.Match(e.Body, pattern,

                System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline);

            }

        }

    }

	

	///单个page的内容。

    private static string GetSingleReplacement(string categoryName, int length)

    {

        IPublishable p;

        p = BlogEngine.Core.Page.Pages.Where(n => n.Title.Equals(categoryName)).FirstOrDefault();

        var str = new StringBuilder();

        p.Content.Substring(0, length);

        str.AppendFormat("<div class='CategoryPost'><span class='CategoryPostTitle'>{0}</span>", p.Title);//标题,类别名称

        str.AppendFormat("<a href='{0}'>more<span>  </span></a>", p.RelativeLink);//到类别文章列表的链接

        str.AppendFormat("<div class='CategoryPostFooter'> </div>");//用于分割标题,我的网站上用了张背景图。

        str.Append("</div>");

        str.Append(p.Description);//显示内容,这里显示Description

        return str.ToString();

    }

    

	//显示一个列表

    static string GetListReplacement(string categoryName, int cnt)

    {

        Category category = BlogEngine.Core.Category.Categories.First(n => n.Title.Equals(categoryName));

        var newsList = category.Posts.FindAll(n => n.IsVisible == true).Take(cnt);

        var str = new StringBuilder();

        str.AppendFormat("<div class='CategoryPost'><span class='CategoryPostTitle'>{0}</span>", category.Title);

        str.AppendFormat("<a href='{0}'>more<span>  </span></a>", category.RelativeLink);

        str.AppendFormat("<div class='CategoryPostFooter'> </div>");

        str.Append("</div>");

        str.Append("<table class='CategoryPostTable'>");

        foreach (var post in newsList)

        {

            str.AppendFormat("<tr><td><a href='{0}'>{1}</a></td><td class='categorypostdate'>{2}</td></tr>", post.AbsoluteLink, post.Title, post.DateCreated.ToShortDateString());

        }

        str.Append("</table>");

        return str.ToString();

}



//显示为标签页的形式,用一个叫easytab的js标签页控件

    static string GetTabReplacement(int tabCount, string categoryName, int cnt)

    {

        Category category = BlogEngine.Core.Category.Categories.First(n => n.Title.Equals(categoryName));

        var newsList = category.Posts.FindAll(n => n.IsVisible == true).Take(cnt);

        var str = new StringBuilder();

        str.AppendFormat("<div class='CategoryPost'><span class='CategoryPostTitle'>{0}</span>", category.Title);

        str.AppendFormat("<div class='easytabmenu'><ul>");

        int i = 1;

        foreach (var n in newsList)

        {

            str.AppendFormat("<li><a href='#' onmouseover=\"easytabs('1', '{0}');\" onfocus=\"easytabs('1', '{1}');\" onclick=\"return false;\"  title=\"\" id=\"tablink{2}\">0{3}</a>|</li> ", i, i, i, i); i++;

        }

        str.AppendFormat("</ul></div><div class='CategoryPostFooter'> </div>");

        str.Append("</div>");

        i = 1;

        foreach (var post in newsList)

        {

            str.AppendFormat("<div id=\"tabcontent{0}\" class=\"easytabmenucontent\"><a href='{1}'>{2}</a><br>{3}</div>", i++,post.AbsoluteLink,post.Title, post.Description);

        }

        return str.ToString();

    }

}

侧边栏,blogengine代码里好多用url判断是显示列表,post,还是page的代码,我下了几个theme里面也有,我就想在WidgetBase中加一个显示位置的参数,
在WidgetEditBase中用个下拉列表作修改。这个比较简单,代码就不写了。
用了一个相册的插件叫BEgallery,有后台管理。效果不错。

说一下碰到的问题,本来在发布的在本机的时候没什么问题,但是放到服务器上的时候(godaddy share hosting),最开始碰到的问题是所有pics文件夹下面的图片都不能用了,
页面上所有类似这样的代码:/pics/image1.jpg都显示不出来。不知道啥原因,暂时把图片都放到上传文件的保存路径,用他的image.axd来处理。
要硬编码,丑就丑吧,能显示了就行。
 
第二个问题是登录以后乱码,这个在Codeplex论坛上找到答案了,把web.sitemap里带right的东西都删掉就行了。貌似.Net4不认right的那些东西。
 
第三个问题,timymce加载不上,直接访问tinymce.js的路径返回403错误,请教了blogyi.net的站长,他说大概是文件的权限的问题,
把editor文件夹删了,从新上传了一遍就好了。
第四个问题,BEgallery不弹出幻灯片,经查,在extension中有个AddConfigScriptToHeader方法,加载一段拼起来的js到页面上,大小引号变成了转义字符。
调试了一下,把要拼起来的js复制出来单独放了一个js文件,加载这个文件,问题解决。注意拼出来的js有个hs.graphicsDir = '/Blogengine.Net/BEgallery/graphics/';
到服务器上应把Blogengine.Net去掉。
还有几个很灵异的问题就不说了,估计是很傻的原因引起的,就不招人笑话了。 

你可能感兴趣的:(Engine)