社区服务器 2.0的"Most Viewed Blog Posts" 控件

分享于 

6分钟阅读

Web开发

  繁體 雙語

介绍

我使用社区服务器 2.0开发了一个博客( http://www.pushingback.com ),它为martin的martin的一个civilian客户。 产品提供的一个很好的功能是一个博客聚合页面,它显示了在单独的边栏小部件中的博客。 我们的项目需求之一是为我们做的单个博客实现这个功能。 因为没有提供这个特性,这意味着我必须建立它。

背景

,为国家警报协调员提供了 AMBER。

功能

  • 显示的链接数可以通过标记属性设置
  • 标题长度可以通过标记属性缩短

开发代码

定制社区服务器博客的look-and-feel最灵活的方法是开发一个主题。 在机器上安装了Community后,文件夹提供了九个示例主题,供你从。 我需要这个博客的三列布局,所以我将"marvin3"主题复制到一个新文件夹。 为了本文的目的,我们将把文件夹命名为" MyBlog"。

下一步是修改 LayoutTemplate.ascx,以便在博客上显示"查看最多"小部件。 修改后,右侧列的HTML如下所示:

<divid="sidebar-b"><Blog:WeblogCalendarrunat="Server"id="Cal"/> 
 <Blog:SingleWeblogSearchrunat="Server"id="sw"NAME="sw"/><Blog:CategoryListResourceTitleName="Weblog_PostCategories_Label"runat="Server"id="Categorylist1"/><!-- Start of Most Viewed blog entries--><MBC:MostViewedrunat="server"id="mv"PageSize="3"/><!-- End of Most View blog entries--><Blog:Subscriptionsrunat="Server"id="subs"/></div>

从这个标记前缀中可以看到:

<%@RegisterTagPrefix="MBC"Namespace="MyBlogControls"Assembly="MyBlogControls"%>

我选择将控件的逻辑存储在单独的程序集中。 这个项目的主要原因是这个项目需要的定制控件数量。 在大多数情况下,社区服务器 2.0的核心控制也是以这种方式构建的。

修改 LayoutTemplate.ascx 之后,我需要为 MostViewed 标记创建一个皮肤来检索。 按照惯例,社区服务器中的皮肤文件命名为" Skin- [skin name]. ascx",所以我创建了一个名为 Skin-MostViewed.ascx的文件。 这是整个 file:

<%@RegisterTagPrefix="CS"Namespace="CommunityServer.Controls"Assembly="CommunityServer.Controls"%><%@ControlLanguage="C#"%><h3><CS:ResourceControlid="MostViewed"runat="Server"ResourceName="MostViewed"/></h3><ul><asp:RepeaterRunat="server"ID="posts"><ItemTemplate><li><asp:HyperLinkRunat="server"id="TitleLink"/></li></ItemTemplate></asp:Repeater></ul>

我将 Repeater inside 无序列表标签和 HyperLink 控件与列表项标记之间的控件一起放置。 如果没有附加标记,则显示的链接将显示为左对齐,而不是与右手列中的它的他链接。

使用 Skin-MostViewed.ascx,剩下的工作就是检索查看最多的博客文章,并将它们绑定到皮肤中的Repeater。 实际检索适当博客文章的代码大部分来自阅读社区服务器的核心源代码和 Keyvan Nayyeri的一些非常有用的帖子。 下面是实际获得适当帖子的代码:

private WeblogPost[] GetMostViewedPosts(int PageCount)
{
 Weblog weblog = Weblogs.GetWeblog(CSContext.Current.ApplicationKey);
 BlogThreadQuery query = new BlogThreadQuery();
 query.SectionID = weblog.SectionID;
 query.SortBy = BlogThreadSortBy.MostViewed;
 query.SortOrder = SortOrder.Descending;
 query.PageSize = PageCount;
 query.PageIndex = 0;
 ThreadSet posts = WeblogPosts.GetBlogThreads(query);
 ArrayList al = new ArrayList(posts.Threads.Count);
 foreach(WeblogPost p in posts.Threads)
 {
 al.Add(p);
 }
 return (WeblogPost[])al.ToArray(typeof(WeblogPost));
}

这里函数返回的array 是将绑定到 Skin-MostViewed.ascx 中的Repeater的数据源。 当我测试我的代码时,我发现如果 query.SectionID 没有设置为 weblog.SectionID,显示的链接将针对整个社区服务器。 PageCount 参数允许开发人员设置显示多少个"查看最多"帖子。 我创建了一个 public PageSize 属性,该属性可以使用标记属性设置为期望值,而不是硬编码。

必须在数据绑定之前调用 GetMostViewedPosts。 为了确保这一点,MostViewed 类重写 AttachChildControlsDataBind。 它还包含一个事件处理程序,用于在 Skin-MostViewed.ascx 中设置 HyperLink的特定属性。 自定义控件提供的一个有用功能是设置在控件中显示博客帖子标题的字符数的能力。 下面是事件处理程序中控制这里操作的代码 Fragment:

if (TitleTextLength >0) 
{
 titleLink.Text = Formatter.CheckStringLength(post.Subject, TitleTextLength);
 titleLink.NavigateUrl = BlogUrls.Instance().Post(post);
 titleLink.ToolTip = post.Subject;
}

结束语

MostViewed 控件为社区服务器 2.0中的个人博客提供了一个有用的增强。 如果Telligent还没有在as-yet-unlaunched社区服务器 2.1中构建这个功能,那么我将很容易在将来的项目中使用它。


COM  Server  控制  COMM  VIEW  POST  
相关文章