把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去掉。
还有几个很灵异的问题就不说了,估计是很傻的原因引起的,就不招人笑话了。